web-dev-qa-db-fra.com

Comment limiter un processus à un seul cœur de processeur?

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:

  • Raison pour cela: comparer différents aspects des langages de programmation
  • J'ai besoin de quelque chose qui fonctionnerait dès le début du processus. Par conséquent, la réponse de @ akseli, bien que intéressante dans d'autres cas, ne résout pas mon cas.
30
Jonathan

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.

27
akseli

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 
19
user8228

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)

  1. Tapez bcdedit /set onecpu on sur une invite de commande
  2. Redémarrez le système.
  3. Quand vous avez fini de jouer, tapez 2 - Tapez: bcdedit /set onecpu off et redémarrez à nouveau.

Méthode 2: Forcer une session Windows complète (XP)

  1. Ouvrez votre fichier boot.ini (Cliquez avec le bouton droit de la souris sur Poste de travail -> Propriétés -> Onglet Avancé -> bouton Paramètres sous "Démarrage et récupération" -> bouton Modifier dans "Démarrage du système").
  2. 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

  3. 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

  4. 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.

7
A Dwarf

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

4
Bewc

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 '?

4
DLeh

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
4
Marichyasana