如何将进程限制为单个 CPU 内核?

Jon*_*han 35 windows process multi-core

如何限制在 Windows 环境中运行的单进程程序只能在多核机器上的单个 CPU 上运行?

窗口程序和命令行程序之间是否相同?

更新:

  • 这样做的原因:对各种编程语言方面进行基准测试
  • 我需要一些可以从流程一开始就起作用的东西,因此@akseli 的答案虽然对其他情况很好,但并不能解决我的情况

aks*_*eli 28

如果您运行的是 Windows Vista/7(可能是 XP,但不确定),那确实相当简单。您必须是管理员才能使其正常工作。

  1. Ctrl+ Shift+Esc打开任务管理器。
  2. 单击进程选项卡。
  3. 查找需要更改其处理器关联的进程。
  4. 右键单击该进程。
  5. 点击“设置亲和力”。

您可以在此处选择您的流程将使用的处理器。

  • 亲和力不是保证。进程会更喜欢这个处理器,但如果它有多个线程,它们不会都留在那里。 (14认同)
  • @JoelCoehoorn:不,这是*保证。你说的是 *preferred* 处理器向量,它不同于亲和向量。 (3认同)

小智 24

从命令行,使用:

start /affinity 1 program.exe 
Run Code Online (Sandbox Code Playgroud)

这将program.exe在第一个 CPU 上运行,因为“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 
Run Code Online (Sandbox Code Playgroud)


A D*_*arf 6

取决于你愿意做什么:

方法一:按需

使用ImageCFG。此实用程序可让您设置可执行文件以在任意数量的内核上运行。确保在进行更改之前备份目标可执行文件,并在使用完后恢复它。

方法 2:强制整个 Windows 会话 (Vista/7)

  1. 键入bcdedit /set onecpu on的命令提示
  2. 重新启动系统。
  3. 玩完后,输入 2 - Type:bcdedit /set onecpu off并重新启动。

方法 2:强制整个 Windows 会话 (XP)

  1. 打开您的 boot.ini 文件(右键单击我的电脑 -> 属性 -> 高级选项卡 -> '启动和恢复' 下的设置按钮 -> '系统启动' 中的编辑按钮)。
  2. 您将在文件中找到以下(或类似)部分:

    [操作系统]

    multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect

  3. 通过添加 /onecpu 标志来更改它:

    [操作系统]

    multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /onecpu

  4. 重启。完成游戏后,删除标志并再次重新启动。

方法 0:不是一个好方法(Processor Affinity)

任何涉及处理器亲和力的东西都不是一个好的选择,恐怕。处理器关联是处理器的线索。处理者没有义务尊重它,而且通常不会。

  • http://technet.microsoft.com/en-us/library/cc938636.aspx 说“...硬关联,意味着处理器关联掩码将受关联掩码影响的线程限制为掩码指定的处理器。线程受硬关联掩码限制的不会在未包含在关联掩码中的处理器上运行”。任何消息来源说它不会受到尊重? (2认同)

小智 5

我将以下函数放在 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
Run Code Online (Sandbox Code Playgroud)