Windows核心编程学习笔记(15)--进程和线程与CPU的关联性

Drecik学习经验分享

转载请注明出处:http://blog.csdn.net/drecik__/article/details/8096253

 

默认情况下,Windows Vist或以后版本在给线程分配CPU时,使用软关联,即如果其他因素一样,系统将是线程在上一次运行的处理器上运行。

Windows还支持硬关联,即可以控制线程在某些特定CPU上运行(如果有多个CPU的话),可以使用SetProcessAffinityMask来限制进程上的线程只在可用CPU的一个子集上运行:

BOOL SetProcessAffinityMask(
	HANDLE hProcess,	// 进程句柄;
	DWORD_PTR dwProcessAffinityMask	// 关联性掩码,表示在那些CPU上运行, 每一位代表一个CPU;
	);
还可以返回关联性的掩码,GetProcessAffinityMask:
BOOL GetProcessAffinityMask(
	HANDLE hProcess,	// 进程句柄;
	PDWORD_PTR lpProcessAffinityMask,	//进程掩码,总是下面系统掩码的一个真子集;
	PDWORD_PTR lpSystemAffinityMask		// 系统掩码,表示系统哪个CPU上可以运行该进程上的线程;
	);
通过SetThreadAffinityMask可以限制一个线程的关联性:
// 返回值是线程之前的掩码;
DWORD_PTR SetThreadAffinityMask(
	HANDLE hThread,		// 线程句柄;
	DWORD_PTR dwThreadAffinityMask	// 关联性掩码;
	);
下面给出个例子,假设有4个CPU,现在限制Thread0只能在CPU1上运行,Thread1,2,3只运行在CPU1,CPU2和CPU3上:
SetThreadAffinityMask( hThread0, 0x00000001 );

SetThreadAffinityMask( hThread1, 0x0000000E );
SetThreadAffinityMask( hThread2, 0x0000000E );
SetThreadAffinityMask( hThread3, 0x0000000E );
在任务管理器中可以手动更改进程与CPU的关联性,右键单击一个进程选择设置相关性就可以在弹出的对话框中进行设置。

你可能感兴趣的:(Windows核心编程学习笔记(15)--进程和线程与CPU的关联性)