SetProcessAffinityMask - Wählen Sie mehrere Prozessoren aus?

7

Wie kann ich mit SetProcessAffinityMask mehr als einen logischen Prozessor auswählen?

Im Windows Task-Manager können Sie dies als Beispiel tun:

Ich habe meine Prozedur CreateProcess aktualisiert, um dies zu tun:

%Vor%

Beachten Sie die Kommentare, die ich dort abgegeben habe. Es wäre gut, meine Prozedur zu aktualisieren, um einen neuen Affinity-Parameter aufzunehmen, den ich an SetProcessAffinityMask übergeben kann.

Bei einem Aufruf werden die entsprechenden Prozessoren aus offensichtlichen Gründen nicht ausgewählt, sie geben die Vorstellung von dem, was ich tun möchte:

%Vor%

Wählen Sie beispielsweise eine beliebige CPU für einen Prozess, wie im Task-Manager angezeigt.

Wie soll ich das machen, mit einem Array, Set oder etwas anderem? Ich kann es nicht mit mehreren Werten arbeiten.

Danke.

    
Community 31.01.2012, 11:35
quelle

2 Antworten

11

Es ist eine Bitmaske, wie in der Dokumentation beschrieben.

>
  

Eine Prozessaffinitätsmaske ist ein Bitvektor, in dem jedes Bit einen logischen Prozessor darstellt, auf dem die Threads des Prozesses ausgeführt werden dürfen.

  • Prozessor 0 ist $ 01.
  • Prozessor 1 ist $ 02.
  • Prozessor 2 ist $ 04.
  • Prozessor 3 ist $ 08.
  • Prozessor 4 ist $ 10.

Und so weiter. Sie können das logische or verwenden, um sie zu kombinieren. Die Prozessoren 0 und 1 wären also oder , was gleich ist.

Ich würde den Verschiebungsoperator shl verwenden, um Werte für bestimmte Prozessoren zu erstellen. So:

%Vor%

Sie können dies leicht erweitern, um Masken für Listen von Prozessoren zu erzeugen, die das logische or in einer Schleife verwenden.

%Vor%

Sie können testen, ob sich ein Prozessor in einer Bitmaske befindet:

%Vor%

Hinweis : Ich verwende DWORD_PTR , weil die Bitmaske für 64-Bit-Ziele 64 Bit breit ist. Diese Nuance ist für dich auf XE nicht wichtig, aber es lohnt sich, es richtig zu machen, um zukünftige Code-Portierungen zu vereinfachen.

    
David Heffernan 31.01.2012, 11:39
quelle
8

Es ist eine 32-Bit Bitmaske auf meinem XE (aber es könnte 64-Bit auf 64-Bit XE2 sein!)

Definieren Sie einfach eine Menge von [0..31] wobei 0 = cpu 1 etc.

Geben Sie dann mask das Ergebnis in ein DWord ein.

Also

%Vor%     
Marco van de Voort 31.01.2012 11:41
quelle

Tags und Links