2011-10-23 2 views
3

Est-il possible de définir l'affinité pour tous les processus en cours dans Windows 7?Comment programmer l'affinité de tous les processus en cours dans Windows 7?

Je veux exécuter des tests d'hyperthreading, et je veux m'assurer qu'ils fonctionnent seuls sur un certain noyau. Je les en cours d'exécution avec une enveloppe, et je veux faire quelque chose comme ça (en pseudocode):

foreach process in <list of all processes> 
    set affinity to all cores but core x 

set affinity of the current process to core x 

run benchmark 0 on core x thread 0 
run benchmark 1 on core x thread 1 

Maintenant, je pense que je sais comment définir l'affinité du processus en cours et de ses enfants, mais comment puis-je:

  1. de parcourir tous les processus?
  2. définir l'affinité d'autres processus?
+1

Si vous avez des difficultés à ouvrir certains processus, vous devez obtenir le 'SeDebugPrivilege' (exige que votre programme fonctionne en tant qu'administrateur). – CodesInChaos

Répondre

3

This project on CodeProject montre comment énumérer tous les processus et modifier leur priorité. Un changement d'une ligne l'ajustera de sorte qu'il énumère tous les processus et change leur affinité. Changez simplement SetProcessPriority en SetProcessAffinityMask.

+0

Je suppose qu'il devra fonctionner en tant que service pour pouvoir définir le masque d'affinité pour les processus et les services du système. Et même alors, il ne sera presque certainement pas en mesure de définir l'affinité des threads du noyau. – Gabe

+2

Une chose impossible à la fois ... –

+0

Où puis-je apprendre à gérer quelque chose en tant que service? –

0

-je configurer une tâche planifiée Trigger pour exécuter au démarrage avec la syntaxe suivante:

start /affinity 1 java.exe 

Testé avec succès sur Windows 7.

3

Voici un script shell de puissance qu'il fait. Vous pouvez également l'exécuter avec un fichier bat supplémentaire si nécessaire. Ensuite, dans le gestionnaire de tâches définir manuellement l'affinité de vos repères.

run_set_affinity.bat:

powershell -executionpolicy bypass -file set_affinity.ps1 

set_affinity.ps1:

# elevate privileges if we are not running as Administrator, so we can set affinity of Windows owned processes 
# source: http://superuser.com/questions/108207/how-to-run-a-powershell-script-as-administrator 

param([switch]$Elevated) 

function Test-Admin { 
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent()) 
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) 
} 

if ((Test-Admin) -eq $false) { 
    if ($elevated) { 
     'tried to elevate to full privileges, did not work, aborting' 
    } else { 
     'running my self again with full privileges' 
     Start-Process powershell.exe -Verb RunAs -ArgumentList ('-executionpolicy bypass -noprofile -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition)) 
    } 
    exit 
} 
'running with full privileges' 





# set affinity of all processes to CPU 3 and CPU 4 
# it prints processes that it was unable to set affinity of  
# source: https://digitaljive.wordpress.com/2011/11/18/set-processor-affinity-with-powershell/ 

# 1 (CPU 1) 
# 2 (CPU 2) 
# 4 (CPU 3) 
# 8 (CPU 4) 
# 16 (CPU 5) 
# 32 (CPU 6) 
# 64 (CPU 7) 
# 128 (CPU 8) 

$affinity = 4 + 8 
'setting all processes to affinity: '+$affinity 
'processes unable to set affinity of: ' 

$allProcesses = Get-Process * 
foreach ($process in $allProcesses) { 
    try { 
     $process.ProcessorAffinity = $affinity 
    } 
    catch { 
     $process 
    } 
} 
+0

Cela fonctionne très bien! –

Questions connexes