본문 바로가기
Programming/System Programming

Processor Affinity사용하기

by Winduck 2018. 8. 6.
반응형

이번에는  Processor Affinity에 대해 알아보고 간단한 예제를 통하여 Processor Affinity를 사용해보겠다.

먼저,


※ Processor Affinity란?

- Process나  Thread에서 사용하는 작업을 지정된 CPU에서만 실행되도록 함.


예를들어, 쿼드코어를 가진 PC에서 계산기를 실행시킬때 Processor Affinity를 설정하여 원하는 CPU에서 프로그램이 동작하도록 할 수 있다는 말이다.

Windows는 해당 기능 사용하도록 다음과 같은 API들을 제공한다.


SetProcessAffinityMask : 대상 Process를 특정 CPU에서 실행되도록 설정.

 BOOL SetProcessAffinityMask(
  HANDLE    hProcess,
  DWORD_PTR dwProcessAffinityMask
);

hProcess : Processor Affinity를 설정할 Process Handle

dwProcessAffinityMask : 설정할 Processor


SetThreadAffinityMask대상 Thread를 특정 CPU에서 실행되도록 설정.

DWORD_PTR SetThreadAffinityMask(
  HANDLE    hThread,
  DWORD_PTR dwThreadAffinityMask
);

- hThead : Processor Affinity를 설정할 Thread Handle

dwThreadAffinityMask : 설정할 Processor



우선, Process에 적용된 예시를 보겠다. 적용 코드는 다음과 같다.




코드에 대해 설명하면 ProcessAffinity설정하기 이전 프로세스에서 실행되는 Processor와 설정이후 Processor를 출력시켜 비교한다.

다음은 실행화면이다.


위와같이 Processor Affinity설정이전에는 임의의 CPU에서 실행되지만 적용 이후에는 CPU1에서만 실행된다. 

여기서 알게된것은 dwProcessAffinityMask를 2로실행하게 되면  CPU1에서 1로 실행하면 CPU0으로 실행된다. 

즉, dwProcessAffinityMask에서 설정되는 것은 CPU Number이고 실행되는 CPU는 0부터 시작되기에 (dwProcessAffinityMask-1)에 해당한다. 

또한, dwProcessAffinityMask를 0으로 설정하면 본래처럼 임의의 CPU에서 실행된다.


다음 예제는 Thread에 Processor Affinity를 설정한 코드이다.



먼저 생성되는 5개의 Thread는 현재 실행되는 프로세서를 5번 출력하고 아래 Thread는 Affinity를 설정한뒤 실행한다.

다음은 Affinity를 설정및 출력력하는 AffinityThread코드이다.





그러면 실행되는 코드를 확인해보겠다.



위와 같이, 앞선 프로세스들은 임의의  CPU에서 실행되고 Affinity를 1로 실행한 Thread는 CPU0에서 실행되는 것을 볼 수 있다.

또한, 한가지 알게 된것은 Affinity Mask로 설정된느 갯수가 PC가 가지는 Processor갯수보다 많을때 bit로 계산되어 설정이 된다.


ex) 쿼드코어 PC경우, Affinity Mask

8(0x1000) -> 임의의  CPU

9(0x1001) -> CPU0

9(0x1002) -> CPU1


이와같이 설정된다.

참고 : http://www.jiniya.net/wp/archives/7647


반응형

댓글