Domanda

Ho un programma che vorrei correre su una sola CPU, in modo da non occupare troppe risorse di sistema.Il problema è, si effettua una chiamata in una DLL esterna che utilizza automaticamente tutti disponibili core della CPU.Non ho il codice sorgente della DLL esterna.Come posso limitare la DLL per il solo utilizzo di una CPU?

EDIT:Grazie per l'aiuto, ecco il codice che ho usato per limitare a una sola CPU (Windows):

// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
    && SystemAffinityMask != 0)
{
    // Limit to 1 thread by masking all but 1 bit of the system affinity mask
    DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
    SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}

EDIT:Si rivelasse Brannon approccio di impostare la priorità del processo funziona anche meglio di quello che voglio, che è quello di mantenere il processo da masticare risorse.Ecco il codice (Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
È stato utile?

Soluzione

Impostazione processore affinità è l'approccio sbagliato. Lasciate che la programmazione maniglia OS.

Se la macchina è seduto inattivo, si desidera utilizzare il più processori, come si può. In caso contrario, si sta facendo meno lavoro per nessun motivo. Se la macchina è occupato, quindi si vuole fare uso dei cicli "liberi" e non influenzare negativamente gli altri processi.

Windows dispone di questa funzionalità built-in. La soluzione adeguata per questo è di impostare la priorità di base del processo.

http://msdn.microsoft.com /en-us/library/ms686219(VS.85).aspx per i dettagli su SetPriorityClass().

Se si desidera verificare questo senza scrivere codice, utilizzare Task Manager per modificare la priorità del processo.

Altri suggerimenti

È possibile impostare l'affinità della CPU del vostro programma. Prova il SetProcessAffinityMask funzione su Windows o sched_setaffinity su Linux.

normalmente, un dll vive nello stesso spazio filo / memoria, come il codice che chiama. L'atto di chiamare una DLL in sé non dovrebbe creare discussioni. Se si chiama la DLL sembra creare più thread, ciò significa che la DLL si sta creando i fili da qualche parte nel suo codice. Se non si dispone di alcun codice sorgente o la documentazione per la DLL, non c'è molto che si può fare a questo proposito (e se si desidera che la DLL per fare il suo lavoro, non c'è molto che si dovrebbe fare su questo).

Si potrebbe provare a giocare con la priorità della vostra applicazione - impostandolo a basso potrebbe cambiare l'utilizzo della CPU, anche se questo non cambia quello che le discussioni vengono creati. Ma sembra probabile che ciò che si vuole veramente è quello di ottenere la documentazione per questa bestia. Senza sapere come funziona il codice, in generale, non c'è molto che si può fare per cambiare come funziona. Nessun super-genio può cambiare la situazione.

Er ...... perché? Scherzi a parte, perché si limitare una libreria che è in grado di dare prestazioni aggiuntive in modo tale? Stai cercando di accedere a una risorsa condivisa o qualcosa del genere? Si potrebbe pensare che una libreria multi-threaded sarebbe in grado di gestire in modo sicuro questo.

A meno che non ci sia qualcosa che non sei di nota, non riesco a vedere alcuna ragione valida anche per cerca per limitare una libreria multi-threaded ad un singolo thread.

Quindi, il programma utilizza un thread, ma non si vuole che la DLL esterna per utilizzare più di un thread? Non avete molto controllo su ciò che la DLL esterna fa, ma alcuni approcci potrebbe essere:

Lei non ha detto che la piattaforma è per.Ho intenzione di assumere windows qui.

Crea il processo figlio e associarlo con un Oggetto Del Processo Di.È quindi possibile impostare l'affinità del processore, per il lavoro oggetto di includere solo uno dei core della CPU disponibili.Il processo figlio non è in grado di modificare la maschera di affinità per tutto ciò che non è un sottoinsieme di affinità di processore per il lavoro in oggetto.Inoltre, si dovrebbe ricordare di non impostare il limite JOB_OBJECT_LIMIT_BREAKAWAY_OK o estesa limite JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK sul lavoro o con altro processo figlio sarà in grado di rompere fuori del lavoro.

Inoltre, è possibile impostare la priorità e la programmazione di classe per il lavoro.Forse non sarà sufficiente a creare un processo figlio a un più basso della CPU e/o di IO livello di priorità?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top