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


30

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

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

更新:

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

2
为什么要这样做?让操作系统决定哪个CPU /内核运行哪个进程将更加高效。
ChrisF 2011年

1
为了对各种编程语言方面进行基准测试
Jonathan

1
这是一个很好的理由-您应该在问题中包含该信息。这一点很重要。
ChrisF 2011年

动机不是必需的,但我根据您的建议添加了它
Jonathan

1
但是,这可能是某人需要能够提供答案的信息。
ChrisF 2011年

Answers:


27

如果您运行的是Windows Vista / 7(可能是XP,但不确定),则非常简单。

输入:Control+Shift+Esc启动任务管理器。

单击进程选项卡

查找需要更改其处理器关联性的进程

右键单击该过程

点击“设置亲和力”

在这里,您可以选择您的进程将使用哪个处理器。

祝好运!

编辑:您必须是管理员才能使其正常工作。


13
亲和力不是保证。进程将更喜欢该处理器,但是如果它有多个线程,它们将不会全部停留在那里。
Joel Coehoorn

1
这很好,但我需要从一开始就具有确定性的东西
Jonathan

2
@JoelCoehoorn:不,这保证。您要说的是首选处理器向量,它与亲和力向量不同。
Mehrdad

1
@Mehrdad:除非程序本身将其更改为任何形式。
Eugene Ryabtsev

1
@JoelCoehoorn >线程相似性强制线程在处理器的特定子集上运行。-您似乎是在指该文章所说的是线程理想的处理器
鲍勃

19

从命令行使用

启动/ affinity 1 program.exe

这将在第一个CPU上运行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:您知道我是否可以对Services初始化执行相同的操作?
Diogo,

如果您拥有四个以上的内核怎么办?
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文件(右键单击“我的电脑”->“属性”->“高级”选项卡->“系统启动”中“启动和恢复”->“编辑”按钮下的“设置”按钮)。
  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:不是一个好的方法(处理器关联)

恐怕任何不涉及Processor Affinity的事情都不是一个好选择。处理器相似性是处理器的线索。处理器没有义务尊重它,并且通常不会这样做。


方法2在Win7上似乎不起作用。D:\>bcdedit /set onecpu导致The set command specified is not valid.....The parameter is incorrect.
最大

2
technet.microsoft.com/zh-cn/library/cc938636.aspx说“ ...硬亲和力,这意味着处理器亲和力掩码将受亲和力掩码影响的线程限制为掩码指定的处理器。受硬线程限制的线程相似性掩码将不会在不包含在相似性掩码中的处理器上运行。” 有消息说它不会受到尊重吗?
Eugene Ryabtsev

4

我将以下函数放在python 2.6的程序中,它调用Windows函数。我的机器只有两个核心,因此您可能需要更改该部分。注释告诉您如何查看当前的亲和力。如果将掩码设置为1或默认为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 2012年

如何从命令行或批处理文件执行此功能?是否可以预先知道或设置进程ID是什么?
posfan12年


4

当我使用PowerShell寻找非常相似的信息时,在这里找到了所需的信息:http : //www.energizedtech.com/2010/07/powershell-setting-processor-a.html

您没有提到使用的是哪个Windows操作系统(较早的版本并未随PowerShell一起提供,但如果不存在,则可以安装它)。

它的快速之处在于,在PowerShell中,进程关联只是一个可以轻松更改的属性。

要查看您的进程的属性(以及其他信息提示)(使用foo作为示例进程),PowerShell命令将为:

获取进程foo | 获得会员

您将看到ProcessorAffinity是这些属性之一。更改它很简单,您可以使用上面Revolter的表/链接中的值来选择要在哪个内核上运行。

要查看foo的ProcessorAffinity属性的值是什么,下面是命令:

(获取进程foo).ProcessorAffinity

因此,如果只想在cpu 4上运行foo,则可以这样设置值:

(获取进程foo).ProcessorAffinity = 8


我无法从您的解释中看出:这仅适用于现有流程吗?OP不想启动进程然后设置其亲和力。他想以已经设置好亲和力的方式开始一个过程,如start /affinity答案所示。你的技术可以做到吗?如果是这样,请说明如何。
Scott

2
@Scott仅现有过程。在您提供的上下文中,我的回答无济于事。我认为“过程的非常开始”只是开始过程,然后立即设置其亲和力。IE:Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 但是,在阅读您的评论并发现Start-Process自身缺少亲和力标记后,我提出了以下测试方法: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc

我建议您编辑答案以添加该替代方法。
斯科特,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.