我们先来看张图:
假设这是一台电脑,这台电脑上,有3块插件板,12个CPU,3个内存
假设有1个线程,他可以在这12个CPU中的任何一个中运行,当CPU访问的内存是他自己插件板上的内存,运行的就快一些,否则就慢一些
所以,控制线程在某个特定的CPU或CPU子集上运行,这就叫做亲缘性
我们可以限制某个进程在哪个CPU上运行
BOOL SetProcessAffinityMask(
HANDLE hProcess, // 进程句柄
DWORD_PTR dwProcessAffinityMask // 进程的亲缘性屏蔽
);
举个例子,如果dwProcessAffinityMask为0x00000005,就表示该进程的线程只能在CPU0和CPU2上运行
BOOL GetProcessAffinityMask(
HANDLE hProcess, // 进程句柄
PDWORD_PTR lpProcessAffinityMask, // 进程的亲缘性屏蔽
PDWORD_PTR lpSystemAffinityMask // 系统的亲缘性屏蔽
);
这是一个获取进程亲缘性屏蔽的函数,很多人可能不理解lpSystemAffinityMask,这个指针的内容实际上是系统指定的那些CPU可以处理线程,举个例子,现在我们的电脑一般都有多个核,其实,我们也可以指定单核运行系统
这样就可以设定单核运行系统了,这样的话SystemAffinityMask的值应该是0x00000001(CPU0)
如果我想设置某个线程在哪个CPU上运行该如何处理呢?
DWORD_PTR SetThreadAffinityMask (
HANDLE hThread, // 线程句柄
DWORD_PTR dwThreadAffinityMask // 线程亲缘性屏蔽
);
windows98为单核操作系统,不管处理器有多少CPU,windows98只用一个,所以,在98上,屏蔽性只能写0x00000001
有时候,强行将某个线程分配给特定的CPU,而另外的CPU却无事可做。这个时候,我们告诉系统,我们想让线程在某个CPU上运行,但允许线程在可能的情况下移到其他CPU上,这个时候有另外一个函数
DWORD SetThreadIdealProcessor(
HANDLE hThread, // 线程句柄
DWORD dwIdealProcessor // 线程的首选CPU编号0-31
);