3

void KeSetAffinityThread(PKTHREAD pKThread, KAFFINITY cpuAffinityMask)ルーチンは Windows カーネルで利用でき、そのドキュメントは OS/2 カーネル ドキュメントにあります。そして、Windows は今でもこの API をカーネルに保持しています。この API を使用して、任意のスレッドのアフィニティ マスクを設定できます。システムに 64 を超えるプロセッサがある場合にこれを行う方法を探しています。

少し背景 - Windows 7 でのプロセッサ グループ機能の導入により、KAFFINITY に安全に依存できなくなりました。そのため、64 を超えるプロセッサを搭載したシステムでコードを実行すると信頼性が低下するため、上記の API を使用できません。MSDN include によって提供される API である MSDN で適切な代替品を見つけることができKeSetSystemAffinityThreadませKeSetSystemGroupAffinityThreadんでしたが、これらの呼び出しは呼び出しスレッドのアフィニティを設定するためにのみ使用されるため、目的を果たしません。

関数も表示されます-SetThreadAffinityMask()任意のスレッドのアフィニティを設定しますが、これはユーザーレベルのルーチンです。カーネルモードで似たようなものを探しています。

4

2 に答える 2

0

ユーザー モードのSetThreadAffinityMaskAPI 呼び出しNtSetInformationThread
カーネル モードでも同じことができます。

ULONGLONG affinity = <affinity mask>;
ZwSetInformationThread(hThread, ThreadAffinityMask, &affinity, sizeof(affinity));
于 2015-03-15T17:54:07.943 に答える