我在基于 Intel Core2 的 Win2k3 机器上运行我的 NT 服务,我需要遍历所有逻辑 CPU(进程关联中的所有位)。为此,我调用 GetProcessAffinityMask() 来检索系统关联掩码,然后将进程依次切换到每个处理器:
DWORD systemMask;
GetProcessAffinityMask( ... &systemMask );
DWORD processorId = 1;
while( systemMask != 0 ) {
SetProcessAffinityMask(... processorId );
Sleep( 1 ); // to be sure that it shifts to that processor
systemMask >>= 1;
processorId <<= 1;
}
在每次迭代中,我从这里调用代码来检索当前处理器 APIC id。问题是对于不同的处理器,它有时会返回相同的 APIC id。根据文档,系统中的每个处理器都必须具有相同的 ID。
我试过调试这个 - 检查 Windows 是否真的改变了亲和力:
while( systemMask != 0 ) {
SetProcessAffinityMask(... processorId );
Sleep( 1 ); // to be sure that it shifts to that processor
DWORD tempAffinity;
GetProcessAffinityMask( ... &tempAffinity );
// run APIC id detection code here
systemMask >>= 1;
processorId <<= 1;
}
它准确地返回了我期望的关联掩码,但不同处理器的 APIC id 仍然可以相同。
这种奇怪的情况有解释吗?