2009-06-27 30 views
10

J'ai un programme écrit en C#, j'utilise VSTS 2008 + .Net 3.5 + Windows Vista Enterprise x86 pour développer une application Windows Forms.comment régler l'affinité CPU d'un programme?

Mon ordinateur actuel est un processeur dual-core, je veux définir l'affinité CPU de mon programme pour fonctionner sur un processeur spécifique et libérer un autre processeur pour faire un autre travail. Des idees pour faire cela? Soit par le codage ou la configuration est ok. Un peu plus d'arrière-plan est, mon programme est intensif CPU, donc je ne veux pas le laisser occuper les deux ressources CPU sur mon ordinateur et je veux libérer un processeur afin que je puisse parcourir le réseau en même temps rapidement . :-)

merci à l'avance, George

+1

J'ai vu un utilitaire pour faire cela pour le serveur interbase (ibaffinity je pense qu'il a été appelé). Je serais intéressé de voir comment faire cela pour n'importe lequel de mes propres programmes aussi - probablement que vous ne pouvez pas le faire au moment de l'exécution dans votre exécutable, vous auriez à le faire via une configuration externe ou pendant votre installation (I Je suppose). – robsoft

+1

@robsoft: Ceci n'était nécessaire que pour les anciennes versions d'Interbase/Firebird. Les versions récentes lient les processus serveur à un cœur de processeur chacun. C'est open source, donc on peut toujours voir comment c'est fait là-bas. – mghie

Répondre

3

En fait, votre demande ne sera pas utiliser plus d'un CPU à moins que vous ne spécifiquement quelque chose à utiliser plus de processeurs. Si vous utilisez le pool de threads et/ou démarrez des threads supplémentaires, vous pouvez utiliser des cœurs supplémentaires disponibles, mais sinon votre application n'aura qu'un thread par défaut et n'utilisera donc qu'un seul CPU.

+0

Mon application utilisera plus d'un CPU car elle enregistre via Windows Media Encoder et effectue un encodage en temps réel au format wmv - je l'ai testé et vu toutes les ressources du processeur sont occupées depuis le gestionnaire de tâches Windows. Des idées pour définir l'affinité CPU? – George2

+1

@Brian: Il peut toujours être logique de forcer un thread à rester sur un seul noyau, pour les systèmes où le cache est par cœur. – mghie

+0

@mghie, je suis d'accord avec vous. Des idées pour mon problème? – George2

12
  1. Aller à Gestionnaire des tâches ->processus onglet.
  2. Recherchez votre programme. Faites un clic droit dessus.
  3. Sélectionnez Définissez l'affinité et décochez l'une des cases à cocher.

Cela devrait libérer un processeur pour vous.

Pour le faire à partir du code, vous pouvez ajouter cette déclaration:

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

Cheers!

+0

Des moyens de programmation ou de configuration? Je ne veux pas que l'utilisateur final fasse cela à chaque fois. :-) – George2

+2

Essayez ceci: System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity = 1; – Gaurav

+0

BTW: Pour utiliser le deuxième, réglez-le sur 2 et pour utiliser les deux cœurs, vous pouvez définir la valeur sur 3 :) – Gaurav

7

Les fonctions de l'API Windows pour le faire sont SetProcessAffinityMask() et SetThreadAffinityMask(). Je ne sais pas. NET donc je ne peux pas dire s'il y a des wrappers autour de ces fonctions, mais this semble suggérer le contraire. BTW: Je suis d'accord que ce ne sont nécessaires que dans des circonstances très spécifiques, il est généralement préférable de laisser le planificateur OS traiter avec lui. C'est une de ces questions où vous ne devriez probablement pas le faire si vous devez demander comment.

+1

@mghie, dans mon problème, 1. Je pense que je devrais appeler SetProcessAffinityMask autre que SetThreadAffinityMask, correct? 2. Puis-je appeler SetProcessAffinityMask du processus en cours pour définir l'affinité du processus en cours? Ou je dois le configurer à partir d'un outil externe? – George2

+3

Vous pouvez le faire à partir du processus lui-même. Il est probablement préférable de commencer avec cet article MSDN: http://msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11, il devrait fournir du code ainsi que des informations de base utiles. – mghie

+0

J'aime votre réponse, sur l'utilisation de la propriété System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity, pourquoi devrions-nous utiliser IntPrt, pourquoi ne pas utiliser int? – George2