Как я могу программно установить соответствие всех запущенных процессов в Windows 7? - PullRequest
3 голосов
/ 23 октября 2011

Есть ли способ установить сходство для всех запущенных процессов в Windows 7?

Я хочу запустить некоторые тесты гиперпоточности и хочу убедиться, что они работают в одиночку на определенном ядре. Я запускаю их с оберткой, и я хочу сделать что-то вроде этого (в псевдокоде):

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 

Теперь я думаю, что знаю, как установить сродство текущего процесса и его дочерних элементов, но как я могу:

  1. повторять все процессы?
  2. установить сходство других процессов?

Ответы [ 3 ]

3 голосов
/ 03 февраля 2016

Вот скрипт Power Shell, который делает это. Вы также можете запустить его с дополнительным файлом bat, если это необходимо. Затем в диспетчере задач вручную установите соответствие ваших тестов.

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
    }
}
3 голосов
/ 23 октября 2011

Этот проект на CodeProject показывает, как перечислить все процессы и изменить их приоритет. Изменение в одну строку настроит его так, чтобы оно перечисляло все процессы и изменяло их сходство. Просто измените SetProcessPriority на SetProcessAffinityMask.

0 голосов
/ 02 августа 2012

Я настроил запуск по расписанию для запуска при запуске со следующим синтаксисом:

start /affinity 1 java.exe

Успешно протестировано в Windows 7.

...