Как ограничить процесс одним ядром ЦП?

Как ограничить выполнение одной программы процесса в среде Windows только одним ЦП на многоядерной машине?

Это то же самое между оконной программой и программой командной строки?

обновление:

  • причина этого: бенчмаркинг различных аспектов языков программирования
  • мне нужно что-то, что будет работать с самого начала процесса, поэтому ответ @akseli, хотя и отлично подходит для другие дела, не решает мое дело
7
задан Jonathan
23.12.2022 16:36 Количество просмотров материала 3604
Распечатать страницу

6 ответов

Если вы используете Windows Vista / 7 (возможно XP, Но не уверены), это действительно довольно просто.

тип: Control+Shift+Esc, чтобы получить ваш диспетчер задач вверх.

нажмите на вкладку Процессы

найдите процесс, для которого требуется изменить сродство процессора

щелкните правой кнопкой мыши на процесс

нажмите на "Set Affinity"

здесь вы можете выбрать, какой процессор(ы) будет использоваться вашим процессом.

удачи!

изменить: Вы должны быть администратором, чтобы заставить это работать.

27
отвечен akseli 2022-12-25 00:24

из командной строки, используйте

запустить / affinity 1 программу.exe

запустится программа.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 
19
отвечен 2022-12-25 02:41

зависит от того, что вы желаете сделать:

метод 1: по требованию

использовать ImageCFG. Эта утилита позволит вам настроить исполняемый файл для запуска на любом количестве ядер. Убедитесь, что вы создали резервную копию целевого исполняемого файла перед внесением изменений и восстановить его, когда вы закончите играть с ним.

Способ 2: принудительно весь сеанс Windows (Vista/7)

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

Метод 2: заставить всю сессию Windows (XP)

  1. Откройте багажник.ini-файл (щелкните правой кнопкой мыши Мой Компьютер - > Свойства - > вкладка "Дополнительно" - > кнопка Настройки в разделе "запуск и восстановление" - > кнопка редактирования в "Автозагрузка системы").
  2. вы найдете следующий (или подобный) раздел в файл:

    [операционных систем]

    мульти (0)Диск(0)rdisk(0)раздел (2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect

  3. измените его, добавив флаг /onecpu:

    [операционных систем]

    мульти (0)Диск(0)rdisk(0)раздел (2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /onecpu

  4. перезагрузка. Как только вы закончите играть снимите флаг и перезагрузка снова.

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

все, что в противном случае связано с сродством процессора, не является хорошим вариантом, я боюсь. Сходство процессора является ключом к процессору. Процессор не обязан уважать его, а часто и не будет.

7
отвечен A Dwarf 2022-12-25 04:58

я помещаю следующую функцию в свою программу в python 2.6, и она вызывает функции windows. Моя машина имеет только два ядра, поэтому вам может понадобиться изменить эту часть. Комментарии расскажут вам, как увидеть текущее сродство. Он работает "как есть" для одноядерного компьютера, если для маски по умолчанию задано значение 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 2022-12-25 07:15

в Windows 8, вы должны перейти на вкладку Подробности диспетчера задач, чтобы сделать набор сходства. Это не дает вам возможность на вкладке Процессы.

EDIT: кроме того, если программа, которую вы хотите запустить, имеет параметры, эта тема может пригодиться: как запустить программу с аргументами командной строки на Windows "cmd с командой "пуск"?

4
отвечен DLeh 2022-12-25 09:32

Как я пошел искать очень похожую информацию с помощью PowerShell, я нашел информацию, мне нужно здесь:http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html

вы не упомянули, какую ОС Windows вы используете, (более старые не поставляются с PowerShell, хотя вы можете установить его, если его там нет).

быстрый из него, является то, что в PowerShell, процесс сходство просто свойство, которое можно изменить легко.

чтобы увидеть свойства (и другие лакомые кусочки информации) вашего процесса (используя foo в качестве примера процесса), команда PowerShell будет:

Get-Process foo / Get-Member

вы увидите ProcessorAffinity является одним из этих свойств. Изменение его тривиально, и вы можете выбрать, какое ядро вы хотите запустить, используя значения из таблицы/ссылки Revolter выше.

чтобы увидеть, что значение ProcessorAffinity свойство для foo, вот команда:

(Get-Process foo).ProcessorAffinity

Так что если вы хотите запустить foo только на cpu 4, Вы должны установить значение как таковое:

(Get-Process foo).ProcessorAffinity=8

4
отвечен Bewc 2022-12-25 11:49

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх