본문 바로가기
MultiThread

APC와 Alertable wait 상태에 대한 정리

by W00gie 2021. 12. 29.

최근 Overlapped IO 모델에 대해 강의를 듣는 도중 스레드의 Alertable Wait 이라는 상태에 대해 듣게 되었다.

Overlapped 모델에 대한 내용이 주 였기 때문에 구체적인 설명은 듣지 못하였기에, 글을 쓰며 해당 내용에 조금 정리해보는 시간을 가지려한다.

 

스레드의 Alertable Wait 상태에 대해서 알기 위해서는 일단 APC에 대해서 이해해야한다. APC는 Asynchronous Procedure Call의 약자로서, 우리가 일반적으로 아는 함수 호출이 Synchronous Procedure Call 이었다면 반대로 비동기적으로 실행되는 함수호출을 의미한다.

 

APC 함수의 형식은 다음과 같다

VOID CALLBACK APCProc(ULONG_PTR dwParam);

 

우리가 일반적으로 사용하는 함수와 비슷한 형태를 띄고 있지만 이를 호출하기 위해서는 APC Queue를 이용해주어야 한다. APC Queue란 비동기 입출력 결과 저장을 위해 운영체제가 각 스레드마다 할당하는 메모리 영역이다. 모든 스레드는 자신만의 APC Queue라는 것을 가지고 있다. 스레드별로 독립적이다. 비동기적으로 호출되어야 할 함수들과 매개변수 정보가 저장된다. 그러나 저장되었다고 해서 함수가 바로 호출되는 것은 아니다. 스레드가 알림가능 상태에 놓이게 될 때에 비로소 호출되는 것이다.

 

이러한 알림 가능한 상태를 이 글에서 정리하고자 하는 Alertable Wait이라 할 수 있다.

일반적으로 우리가 접한 스레드의 State는 Running, Wait, Ready 로 알고 있는데 운영체제가 선별하는 이러한 State와 달리 Alertable Wait은 유일하게 사용자가 제어할 수 있는 State이다.

 

Alertable Wait 상태로 스레드를 전환하는 방법은 대표적으로 SleepEx() 함수를 활용하는 방법이 있고,

DWORD SleepEx(
  [in] DWORD dwMilliseconds,
  [in] BOOL  bAlertable
);

추가적으로 이벤트기반 모델에서 주로 사용하는 waitFormultipleObject의 마지막 인자를 true로 선택해 전환할 수 있다.

DWORD WaitForMultipleObjectsEx(
  [in] DWORD        nCount,
  [in] const HANDLE *lpHandles,
  [in] BOOL         bWaitAll,
  [in] DWORD        dwMilliseconds,
  [in] BOOL         bAlertable
);

 

 

Alertable 상태로 전환된 스레드는 bool 값(bAlertable)과 함께 전달된 시간만큼 sleep 상태로 전환된 뒤, APC Queue에서 정보를 확인하고. Queue에 쌓여있는 APC 함수들을 수행한다. 

 

 

 

세부출처

http://egloos.zum.com/himskim/v/1053865