Comment limiter un seul programme de processus exécuté dans un environnement Windows à ne s'exécuter que sur un seul processeur sur un ordinateur multicœur?
Est-ce la même chose entre un programme fenêtré et un programme en ligne de commande?
UPDATE:
Si vous utilisez Windows Vista/7 (éventuellement XP, mais pas sûr), c'est plutôt simple.
Tapez: Control+Shift+Esc
pour obtenir votre gestionnaire de tâches.
Cliquez sur l'onglet Processus
Trouver le processus qui a besoin que son affinité de processeur soit modifiée
Faites un clic droit sur le processus
Cliquez sur "Définir l'affinité"
Ici, vous pouvez sélectionner le (s) processeur (s) utilisé (s) par votre processus.
Bonne chance!
EDIT: Vous devez être administrateur pour que cela fonctionne.
depuis la ligne de commande, utilisez
start/affinity 1 program.exe
cela exécutera program.exe sur la première CPU car "1" est la valeur hexadécimale du masque d'affinité
CPU3 CPU2 CPU1 CPU0 Bin Hex
---- ---- ---- ---- --- ---
OFF OFF OFF ON = 0001 = 1
OFF OFF ON OFF = 0010 = 2
OFF OFF ON ON = 0011 = 3
OFF ON OFF OFF = 0100 = 4
OFF ON OFF ON = 0101 = 5
OFF ON ON OFF = 0110 = 6
OFF ON ON ON = 0111 = 7
ON OFF OFF OFF = 1000 = 8
ON OFF OFF ON = 1001 = 9
ON OFF ON OFF = 1010 = A
ON OFF ON ON = 1011 = B
ON ON OFF OFF = 1100 = C
ON ON OFF ON = 1101 = D
ON ON ON OFF = 1110 = E
ON ON ON ON = 1111 = F
Cela dépend de ce que vous êtes prêt à faire:
Méthode 1: sur demande
Utilisez ImageCFG . Cet utilitaire vous permettra de configurer un exécutable pour qu'il s'exécute sur un nombre quelconque de cœurs. Assurez-vous de sauvegarder l'exécutable cible avant d'effectuer les modifications et restaurez-le lorsque vous avez fini de le jouer.
Méthode 2: forcer une session Windows complète (Vista/7)
bcdedit /set onecpu on
sur une invite de commandebcdedit /set onecpu off
et redémarrez à nouveau.Méthode 2: Forcer une session Windows complète (XP)
Vous trouverez la section suivante (ou similaire) dans le fichier:
[systèmes d'exploitation]
multi (0) disque (0) rdisk (0) partition (2)\WINDOWS = "Microsoft Windows XP Professional"/fastdetect
Changez-le en ajoutant le drapeau/onecpu:
[systèmes d'exploitation]
multi (0) disque (0) rdisk (0) partition (2)\WINDOWS = "Microsoft Windows XP Professional"/fastdetect/onecpu
Redémarrer. Une fois que vous avez fini de jouer, enlevez le drapeau et redémarrez à nouveau.
Méthode 0: pas une bonne méthode (affinité du processeur)
Tout ce qui implique autrement Processor Affinity n'est pas une bonne option, j'en ai bien peur. L'affinité du processeur est un indice pour le processeur. Le transformateur n'est pas obligé de le respecter, et souvent ne le fera pas.
En cherchant des informations très similaires à l'aide de PowerShell, j'ai trouvé les informations dont j'avais besoin ici: http://www.energizedtech.com/2010/07/powershell-setting-processor-a. html
Vous n’avez pas mentionné le système d’exploitation Windows que vous utilisiez (les versions les plus anciennes n’étaient pas fournies avec PowerShell, bien que vous puissiez l’installer si elles n’y figurent pas).
En résumé, dans PowerShell, l’affinité des processus est tout simplement une propriété que vous pouvez modifier facilement.
Pour voir les propriétés (et autres informations utiles) de votre processus (en utilisant foo comme exemple de processus), la commande PowerShell serait:
Get-Process foo | Get-membre
Vous verrez que ProcessorAffinity est l'une de ces propriétés. Le changer est trivial, et vous pouvez sélectionner le noyau sur lequel vous voulez exécuter, en utilisant les valeurs du tableau/lien de Revolter ci-dessus.
Pour voir quelle est la valeur de la propriété ProcessorAffinity pour foo, voici la commande:
(Get-Process foo) .ProcessorAffinity
Donc, si vous voulez exécuter foo uniquement sur le processeur 4, vous devez définir la valeur comme telle:
(Get-Process foo) .ProcessorAffinity = 8
Sous Windows 8, vous devez accéder à l’onglet Détails du gestionnaire de tâches pour définir l’affinité. Cela ne vous donne pas l'option sur l'onglet Processus.
EDIT: De plus, si le programme que vous voulez démarrer a des paramètres, ce fil pourrait s'avérer utile: Comment démarrer un programme avec des arguments en ligne de commande sous Windows 'cmd avec la commande' start '?
Je mets la fonction suivante dans mon programme en python 2.6 et appelle des fonctions Windows. Ma machine n'a que deux cœurs, vous devrez peut-être changer cette partie. Les commentaires vous indiquent comment voir quelle est l'affinité actuelle. Cela fonctionne "tel quel" pour une seule machine principale si vous définissez ou utilisez par défaut un masque de 1.
def setaffinitymask(pid = None, mask = 1):
""" Set The Affinity Mask of a Windows Process. Affinity Mask is a value between 1-3 where
1 is for core 0, 2 is for core 1, 3 is for both cores (it is a bitmap)
Default sets the Affinity Mask to core 0 only
python process can take any valid process ID. """
import win32api, win32process, win32con
if pid == None:
pid = win32api.GetCurrentProcessId()
if mask == None:
mask = 1
if mask < 1 or mask > 3:
mask = 1
print 'process affinity mask out of range [1..3] setting it to 1'
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid)
# see what mask is currently set to
# processAffinityMask, systemAffinityMask = win32process.GetProcessAffinityMask(handle)
# print 'process affinity mask = ', processAffinityMask, ', system affinity mask = ', systemAffinityMask
# set affinity for process to mask value
win32process.SetProcessAffinityMask(handle, mask) # 1=core 0, 2=core 1, 3=both
processAffinityMask, systemAffinityMask = win32process.GetProcessAffinityMask(handle)
#print 'process affinity mask = ', processAffinityMask, ', system affinity mask = ', systemAffinityMask