◎ 친화력 이란?


 기본적으로 스레드를 프로세서(보통 CPU)에 할당할때, soft affinity를 사용한다. 이것은 모든 요소가 같을때, 마지막으로 실행했던 프로세서위에서 스레드를 실행하려고 시도함을 말한다. 하나의 프로세서에서 스레드를 머무르게 하는 것은 프로세서의 메모리 캐시에 남아 있는 데이터를 재 사용할 수 있게 한다.



◎ 프로세스 친화력 설정


 기본적으로 모든 스레드는 아무 CPU에서나 스케쥴 될 수 있다. 한 프로세스 내의 스레드가 이용가능한 CPU의 부분집합 내에서 실행되도록 제한하려면 아래의 함수를 호출하면된다.



BOOL SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR wProcessAffinityMask);



wProcessAffinityMask : 스레드가 실행될 수 있는 CPU를 가리키는 비트 마스크이다.


 ex) wProcessAffinityMask 값이 0×00000005 를 전달하게 되면 해당 프로세스는 CPU0 과 CPU2에서만 실행이 된다. 다른 CPU는 해당 프로세스를 실행할수없게된다.



※ 자식 프로세스는 부모 프로세스의 프로세스 친화력을 상속받는다.



 ◎ 프로세스 친화력 확인하기


 현재 프로세스의 친화력을 알기위해서는 다음함수를 호출하면 된다.



BOOL GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR pdwProcessAffinityMask, PDWORD_PTR pdwSystemAffinityMask);



pdwProcessAffinityMask : 현재 프로세스의 친화력


pdwSystemAffinityMask : 시스템의 친화력 마스크



 ※ 프로세스의 친화력 마스크는 항상 시스템의 친화력 마스크의 부분집합이다.



  ◎ 스레드 친화력 설정하기


 스레드의 친화력을 설정하는 함수는 다음과 같다.



DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);



프로세스의 친화력설정과 동일하지만 반환되는 값이 다르다. 반환되는 값은 스레드의 이전 affinity마스크이다.



※ 스레드 혹은 프로세스의 hard affinity 를 설정하는것은 시스템의 스레드 스케쥴러와 물리면서 동작이 이상할수있다. 다음과같은 스레드가 3개있다.






























스레드 우선순위 Affinity 마스크 결과
A 4 0×00000001 CPU 0
B 8 0×00000003 CPU 1
C 6 0×00000002 알수 없음



1. 스레드 A가 실행이되어서 CPU 0을 소유했다.


2. 스레드 B가 실행이되어서 CPU 0 혹은 CPU 1중 선택을 하려고 햇으나 CPU0을 소유한 스레드가 있어 스레드 B는 CPU 1번을 소유한다.


3. 스레드 C가 실행이되었지만 CPU 1번을 우선순위 8인 스레드가 소유하고있어서 스케쥴할수없는 상황이다.


Post to Twitter