Як обмежити процес одним ядром процесора?


30

Як обмежити виконання однієї програми в середовищі Windows лише на одному процесорі на багатоядерній машині?

Це те ж саме між віконною програмою та програмою командного рядка?

ОНОВЛЕННЯ:

  • Причина цього: порівняння різних аспектів мов програмування
  • Мені потрібно щось, що могло б працювати з самого початку процесу, тому відповідь @ akseli, хоч і велика для інших випадків, не вирішує мою справу

2
Чому ви хочете зробити це? Дозвіл операційній системі вирішити, який процесор / ядро ​​працює, який обробляє його буде набагато більш ефективним.
ChrisF

1
для порівняння різних аспектів мови програмування
Jonathan

1
Це є вагомою причиною - ви повинні включити цю інформацію у своє запитання. Це важливо.
ChrisF

Мотивація не є суттєвою, але я додав її за вашою порадою
Jonathan

1
Однак, це може бути інформація, яку хтось потребує, щоб дати відповідь.
ChrisF

Відповіді:


27

Якщо ви використовуєте Windows Vista / 7 (можливо, XP, але не впевнені), це дійсно досить просто.

Введіть: Control+Shift+Esc щоб отримати ваш менеджер завдань.

Натисніть вкладку Процеси

Знайдіть процес, який потребує зміни афінності процесора

Клацніть правою кнопкою миші по процесу

Натисніть "Встановити спорідненість"

Тут ви можете вибрати, який процесор (-и) використовуватиме ваш процес.

Удачі!

РЕДАГУВАТИ: Ви повинні бути адміністратором, щоб це працювало.


Дійсно красивий, я не знав що. Хороша відповідь +1 для мене.
Diogo

13
Афінність не є гарантією. Процеси віддадуть перевагу цьому процесору, але якщо він має декілька потоків, вони не залишаться там.
Joel Coehoorn

Це не гарантія, але це початок. Ви також можете максимізувати ймовірність отримання процесора, для якого ви встановили спорідненість, якщо ви встановлюєте логічні зв'язки для більшості завдань, які потребують процесора.
akseli

1
Це добре, але мені потрібно щось детерміноване з самого початку
Jonathan

2
@JoelCoehoorn: Ні є гарантія. Ви говорите про це кращим вектор процесора, який відрізняється від вектора афінності.
Mehrdad

19

з командного рядка, використовуйте

start / affinity 1 program.exe

це буде запускати program.exe на першому процесорі, оскільки "1" є шістнадцятковим значенням афінна маска

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 

1
Revolter: Чи знаєте ви, чи можу я зробити те ж саме з ініціалізацією служб?
Diogo

Що робити, якщо у вас більше 4 ядер?
posfan12

7

Залежить від того, що ви готові зробити:

Метод 1: На вимогу

Використовуйте ImageCFG . Ця утиліта дозволить вам налаштувати виконуваний файл на будь-яку кількість ядер. Переконайтеся, що перед тим, як вносити зміни та виконувати відновлення, виконайте резервну копію цільового виконуваного файлу.

Спосіб 2. Примусити всю сесію Windows (Vista / 7)

  1. Тип bcdedit /set onecpu on у командному рядку
  2. Перезавантажте систему.
  3. Коли ви закінчите відтворення, введіть 2 - Тип: bcdedit /set onecpu off і знову перезавантажте.

Спосіб 2. Примусити всю сесію Windows (XP)

  1. Відкрийте файл boot.ini (клацніть правою кнопкою миші Мій комп'ютер - & gt; Властивості - & gt; Розширені вкладки - & gt; кнопку Налаштування в розділі "Запуск і відновлення" - & gt; Кнопка редагування в "Запуск системи").
  2. У файлі ви знайдете такий (або подібний) розділ:

    [операційні системи]

    розділ (0) диска (0) диска (0) rdisk (0) WINDOWS = "Microsoft Windows XP Professional" / fastdetect

  3. Змініть його, додавши прапорця / onecpu:

    [операційні системи]

    розділ (0) диска (0) диска (0) rdisk (0) WINDOWS = "Microsoft Windows XP Professional" / швидкий пошук / onecpu

  4. Перезавантаження. Після завершення відтворення видаліть прапор і перезавантажте його знову.

Метод 0: Не хороший метод (спорідненість процесора)

Все, що в іншому випадку пов'язане з процесором Affinity не є хорошим варіантом, боюся. Афінність процесора є ключем до процесора. Процесор не зобов'язаний його поважати і часто не буде.


Метод 2 не працює на Win7. D:\>bcdedit /set onecpu призводить до The set command specified is not valid..... The parameter is incorrect.
max

1
technet.microsoft.com/en-us/library/cc938636.aspx каже: "... важка спорідненість, що означає, що маска афінності процесора обмежує потоки, на які впливає маска афінності, до процесорів, визначених маскою. маска ". Будь-яке джерело, яке каже, що це не буде поважати?
Eugene Ryabtsev

4

Я поставив наступну функцію в моїй програмі в Python 2.6, і він викликає вікна функцій. Моя машина має лише два ядра, тому вам може знадобитися змінити цю частину. У коментарях ви дізнаєтеся, як побачити те, що є поточним спорідненістю. Він працює "як є" для однієї основної машини, якщо ви встановите або за замовчуванням маску 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

Не впевнений, що OP запитав код ...
bytebuster

Як виконати цю функцію з командного рядка або командного файлу? Чи є спосіб дізнатися або заздалегідь встановити, яким буде ідентифікатор процесу?
posfan12

4

У Windows 8, ви повинні перейти на вкладку Деталі диспетчера завдань, щоб зробити Set Affinity. Це не дає вам опцію на вкладці Процеси.

EDIT: Також, якщо програма, яку ви хочете запустити, має параметри, цей потік може стати в нагоді: Як запустити програму з аргументами командного рядка на cmd Windows з командою 'start'?


4

Коли я шукав дуже подібну інформацію за допомогою PowerShell, я знайшов потрібну інформацію тут: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html

Ви не згадали, яку ОС Windows використовували, (Старіші не поставлялися з PowerShell, хоча ви могли б встановити її, якщо її немає).

Найшвидше, що в PowerShell афінність процесу - це просто властивість, яку можна легко змінити.

Щоб побачити властивості (та інші лапки інформації) вашого процесу (використовуючи foo як приклад процесу), команда PowerShell буде:

Get-Process foo | Get-Member

Ви побачите, що ProcessorAffinity є одним з цих властивостей. Зміна його тривіальна, і ви можете вибрати, на якому ядрі ви хочете працювати, використовуючи значення з таблиці Revolter / link вище.

Щоб побачити значення властивості ProcessorAffinity для foo, можна скористатися командою:

(Get-Process foo) .ProcessorAffinity

Отже, якщо ви хочете запускати foo тільки на cpu 4, ви встановите значення як таке:

(Get-Process foo) .ProcessorAffinity = 8


Я не можу сказати з вашого пояснення: чи застосовується це лише до існуючих процесів? ОП не хоче запускати процес, а потім встановлювати своє спорідненість; він хоче почати процес з його спорідненістю вже встановлено , як у start /affinity відповідь. Чи може ваша техніка зробити це? Якщо так, поясніть, як це зробити.
Scott

1
Тільки існуючі процеси. У контексті, який ви надаєте, моя відповідь не допомагає. Я відчував, що "самий початок процесу", був питанням початку процесу & amp; потім негайно встановлюють її спорідненість. I.E .: Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 Проте, прочитавши ваш коментар і дізнавшись про це Start-Process має відсутній прапор спорідненості, я придумав наступне, що я перевірив: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc

Я пропоную змінити відповідь, щоб додати цю альтернативу.
Scott
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.