如何限制在Windows环境中运行的单个进程程序只能在多核计算机上的单个CPU上运行?
窗口程序和命令行程序是否相同?
更新:
- 这样做的原因:对各种编程语言方面进行基准测试
- 我需要从流程开始就可以解决的问题,因此,@ akseli的答案虽然对其他情况很有用,但不能解决我的情况
如何限制在Windows环境中运行的单个进程程序只能在多核计算机上的单个CPU上运行?
窗口程序和命令行程序是否相同?
更新:
Answers:
如果您运行的是Windows Vista / 7(可能是XP,但不确定),则非常简单。
输入:Control+Shift+Esc
启动任务管理器。
单击进程选项卡
查找需要更改其处理器关联性的进程
右键单击该过程
点击“设置亲和力”
在这里,您可以选择您的进程将使用哪个处理器。
祝好运!
编辑:您必须是管理员才能使其正常工作。
从命令行使用
启动/ 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:按需
使用ImageCFG。使用该实用程序,您可以设置可执行文件以在任意数量的内核上运行。确保在进行更改之前备份目标可执行文件,并在完成播放后将其还原。
方法2:强制执行整个Windows会话(Vista / 7)
bcdedit /set onecpu on
的命令提示bcdedit /set onecpu off
然后再次重新启动。方法2:强制整个Windows会话(XP)
您将在文件中找到以下(或类似内容)部分:
[操作系统]
多(0)磁盘(0)rdisk(0)分区(2)\ WINDOWS =“ Microsoft Windows XP Professional” / fastdetect
通过添加/ onecpu标志对其进行更改:
[操作系统]
多(0)磁盘(0)rdisk(0)分区(2)\ WINDOWS =“ Microsoft Windows XP Professional” / fastdetect / onecpu
重启。播放完毕后,删除标志并再次重新启动。
方法0:不是一个好的方法(处理器关联)
恐怕任何不涉及Processor Affinity的事情都不是一个好选择。处理器相似性是处理器的线索。处理器没有义务尊重它,并且通常不会这样做。
D:\>bcdedit /set onecpu
导致The set command specified is not valid.
....The parameter is incorrect.
我将以下函数放在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
在Windows 8中,您必须转到任务管理器的“详细信息”选项卡以进行“设置亲和力”。它没有为您提供“进程”选项卡上的选项。
编辑:另外,如果您要启动的程序具有参数,则该线程可能派上用场: 如何在Windows的cmd中使用“ start”命令启动带有命令行参数的程序?
当我使用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
start /affinity
答案所示。你的技术可以做到吗?如果是这样,请说明如何。
Start-Process foo ; (Get-Process foo).ProcessorAffinity=8
但是,在阅读您的评论并发现Start-Process
自身缺少亲和力标记后,我提出了以下测试方法: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010