2009-06-27 23 views
10

Ho un programma scritto in C#, sto usando VSTS 2008 + .Net 3.5 + Windows Vista Enterprise x86 per sviluppare un'applicazione Windows Forms.come impostare l'affinità della CPU di un programma?

Il mio computer corrente è CPU dual-core, voglio impostare l'affinità della CPU del mio programma per l'esecuzione su una CPU specifica e liberare un'altra CPU per fare un altro lavoro. Qualche idea su come fare questo? O tramite la codifica o la configurazione è ok.

Un po 'più di background, il mio programma richiede molta della CPU, quindi non voglio lasciarlo occupare tutte le due risorse della CPU sul mio computer e voglio liberare una CPU in modo da poter navigare in rete allo stesso tempo velocemente . :-)

grazie in anticipo, George

+1

Ho visto un'utilità per fare questo per il server interbase (l'ibaffinity penso che sia stato chiamato). Sarei interessato a vedere come farlo anche per i miei programmi - presumibilmente non puoi farlo in fase di esecuzione nel tuo eseguibile, dovresti farlo tramite la configurazione esterna o durante il processo di installazione (I 'Suppongo che). – robsoft

+1

@robsoft: era necessario solo per le vecchie versioni di Interbase/Firebird. Le versioni recenti legano i processi del server a un core del processore ciascuno. È open source, quindi puoi sempre verificare come è fatto lì. – mghie

risposta

3

In realtà, l'applicazione non utilizzerà più di una CPU a meno che non specificatamente fare qualcosa per utilizzare più CPU. Se si utilizza il pool di thread e/o si avviano thread aggiuntivi, è possibile utilizzare ulteriori core disponibili, ma altrimenti l'applicazione avrà solo un thread per impostazione predefinita e quindi utilizzerà solo una CPU.

+0

La mia applicazione utilizzerà più di una CPU perché registra tramite Windows Media Encoder e esegue la codifica in tempo reale in formato wmv: l'ho testata e ho visto tutte le risorse della CPU occupate dal task manager di Windows. Qualche idea su come impostare l'affinità della CPU? – George2

+1

@Brian: Può ancora avere senso forzare un thread a rimanere su un core, per quei sistemi in cui la cache è per core. – mghie

+0

@mghie, sono d'accordo con te. Qualche idea per il mio problema? – George2

12
  1. Vai Task Manager ->Processi tab.
  2. Cerca il tuo programma. Fai clic destro su di esso.
  3. Selezionare Impostare l'affinità e deselezionare una delle caselle di controllo.

Questo dovrebbe liberare un processore per te.

Per farlo dal codice è possibile aggiungere questa dichiarazione:

System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr) 1; 

Cheers!

+0

Eventuali modalità di programmazione o configurazione? Non voglio che l'utente faccia questo ogni volta. :-) – George2

+2

Prova questo: System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity = 1; – Gaurav

+0

BTW: per utilizzare il secondo set su 2 e per utilizzare entrambi i core è possibile impostare il valore su 3 :) – Gaurav

7

funzioni API Le finestre per fare questo sono SetProcessAffinityMask() e SetThreadAffinityMask(). Non conosco .NET, quindi non posso dire se ci sono wrapper attorno a quelle funzioni, ma this sembra suggerire il contrario.

BTW: Sono d'accordo che questi sono necessari solo in circostanze molto specifiche, è normalmente meglio lasciare che lo scheduler del sistema operativo si occupi di esso. È una di quelle domande in cui probabilmente non dovresti farlo se devi chiedere come.

+1

@mghie, nel mio problema, 1. Penso che dovrei chiamare SetProcessAffinityMask diverso da SetThreadAffinityMask, corretto? 2. Posso chiamare SetProcessAffinityMask dal processo corrente per impostare l'affinità del processo corrente? O devo configurarlo dallo strumento esterno? – George2

+3

Puoi farlo dal processo stesso. Probabilmente è meglio iniziare con questo articolo MSDN: http://msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11, dovrebbe fornire del codice oltre a utili informazioni di base. – mghie

+0

Mi piace la tua risposta, sull'utilizzo di System.Diagnostics.Process.GetCurrentProcess(). Proprietà ProcessorAffinity, perché dovremmo usare IntPrt, perché non usare int? – George2

Problemi correlati