Jon*_*han 35 windows process multi-core
如何限制在 Windows 环境中运行的单进程程序只能在多核机器上的单个 CPU 上运行?
窗口程序和命令行程序之间是否相同?
更新:
aks*_*eli 28
如果您运行的是 Windows Vista/7(可能是 XP,但不确定),那确实相当简单。您必须是管理员才能使其正常工作。
您可以在此处选择您的流程将使用的处理器。
小智 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)
取决于你愿意做什么:
方法一:按需
使用ImageCFG。此实用程序可让您设置可执行文件以在任意数量的内核上运行。确保在进行更改之前备份目标可执行文件,并在使用完后恢复它。
方法 2:强制整个 Windows 会话 (Vista/7)
bcdedit /set onecpu on的命令提示bcdedit /set onecpu off并重新启动。方法 2:强制整个 Windows 会话 (XP)
您将在文件中找到以下(或类似)部分:
[操作系统]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect
通过添加 /onecpu 标志来更改它:
[操作系统]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /onecpu
重启。完成游戏后,删除标志并再次重新启动。
方法 0:不是一个好方法(Processor Affinity)
任何涉及处理器亲和力的东西都不是一个好的选择,恐怕。处理器关联是处理器的线索。处理者没有义务尊重它,而且通常不会。
小智 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)
| 归档时间: |
|
| 查看次数: |
92528 次 |
| 最近记录: |