이번에는 Processor Affinity에 대해 알아보고 간단한 예제를 통하여 Processor Affinity를 사용해보겠다.
먼저,
※ Processor Affinity란?
- Process나 Thread에서 사용하는 작업을 지정된 CPU에서만 실행되도록 함.
예를들어, 쿼드코어를 가진 PC에서 계산기를 실행시킬때 Processor Affinity를 설정하여 원하는 CPU에서 프로그램이 동작하도록 할 수 있다는 말이다.
Windows는 해당 기능 사용하도록 다음과 같은 API들을 제공한다.
※ SetProcessAffinityMask : 대상 Process를 특정 CPU에서 실행되도록 설정. BOOL SetProcessAffinityMask( - hProcess : Processor Affinity를 설정할 Process Handle - dwProcessAffinityMask : 설정할 Processor ※ SetThreadAffinityMask : 대상 Thread를 특정 CPU에서 실행되도록 설정. DWORD_PTR SetThreadAffinityMask( - 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
이와같이 설정된다.
'Programming > System Programming' 카테고리의 다른 글
VirtualQueryEx를 이용한 할당된 Memory Listing (0) | 2020.05.28 |
---|---|
NtQueryInformationProcess가 프로세스 정보 가져오는 법 (0) | 2019.04.04 |
DeviceIoControl을 이용한 Kernel / User 통신 프로그램 (0) | 2018.07.24 |
VirtualProtectEx메모리 속성변경 size (0) | 2018.05.24 |
[Driver]프로세스/DLL로드 및 소멸 모니터링 프로그래밍 (0) | 2017.07.06 |
댓글