사용자 도구

사이트 도구


kb:alertableio

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:alertableio [2014/11/07 14:26] (현재)
줄 1: 줄 1:
 +====== Alertable IO ======
 +Alertable io란 스레드가 alertable 상태로 들어가서,​ 비동기 함수 호출 결과를 처리하는 일을 말한다.
 +
 +ReadFileEx, WriteFileEx 등과 같은 함수들을 보면, 함수 인자로 OVERLAPPED 구조체 포인터와,​ OVERLAPPED_COMPLETION_ROUTINE ​ 함수 포인터를 받는 것을 알 수 있다. 이런 함수들이 alertable io를 지원하는 함수들이다. (물론 [[IOCP]]를 포함한 다른 비동기 호출 방식도 지원하는 함수들이다.)
 +
 +이런 함수들을 비동기 모드로 호출하게 되면, IO 작업이 끝날 때까지 블러킹되는 것이 아니라, 바로 반환된다. 언젠가 IO 작업이 끝난 다음에 스레드가 alertable 상태가 되면, 인수로 넘긴 completion routine이 실행된다. 스레드가 alertable 상태가 되지 않으면, completion routine은 실행되지 않는다.
 +
 +스레드는 커널에 의해서 alertable 상태로 진입하는 것이 아니다. 사용자가 직접 alertable 상태로 만들어줘야 한다. 스레드를 alertable 상태로 만들기 위해서는 아래의 함수 중에 하나를 호출해줘야 한다.
 +
 +  * SleepEx
 +  * WaitForSingleObjectEx
 +  * WaitForMultipleObjectsEx
 +  * SignalObjectAndWait
 +  * MsgWaitForMultipleObjectsEx
 +
 +스레드가 alertable 상태가 되면, 즉 위의 함수 중에 하나를 호출하면,​ 다음과 같은 일들이 일어난다.
 +
 +  - 커널은 해당 스레드의 APC(Asynchronous Procedure Call) 큐를 체크한다. 큐에 콜백 함수 포인터가 있다면 커널은 큐에서 함수 포인터를 빼내서 그것을 스레드에게 보낸다.
 +  - 스레드는 받은 콜백 함수를 실행한다.
 +  - 큐에 아무 것도 없을 때까지 1,2번 과정을 반복한다.
 +  - 큐에 아무 것도 없다면 원래 상태로 돌아간다. 즉 스레드를 alertable 상태로 만든 함수가 반환된다.
 +    ​
 +위의 함수 중에 하나를 호출했는데,​ APC 큐에 아무 것도 없었다면 다음과 같은 일들이 일어나기 전까지 스레드는 블록(suspend)된다.
 +
 +  * 함수에다 넘긴 커널 오브젝트가 시그날을 받았다. (SleepEx 같은 경우에는 주어진 시간이 지나면...이겠지.)
 +  * 콜백 함수가 APC 큐에 추가되었다.
 +
 +즉 **completion routine이 실행되는 스레드는 최초에 ReadFileEx, WriteFileEx 류의 함수 호출을 한 스레드**라는 말이다. 백그라운드에 있는 워커 스레드 같은 게 아니다. 그러므로 completion routine 안에서는 쓸데없는 동기화 걱정을 할 필요가 없다. 사실 이 사실 하나가 알고 싶었던 거였다. -_-
 +
 +AlertableIo 방식은 [[IOCP]]보다는 쓰기 간단하지만,​ 위에서 쭉 설명했듯이 IO 작업을 요청한 스레드와 그 결과를 처리하는 스레드가 같은 스레드라는 단점이 있다. 동기화 문제가 적어지니 나름대로 장점이라고도 할 수 있겠다. 하옇튼 뭔가 좀 더 확장성이 있는 방식이 필요하다면 [[IOCP]]를 사용해야 한다.
 +
 +
 +====== 링크 ======
 +  * [[http://​windowssdk.msdn.microsoft.com/​en-gb/​library/​aa363772.aspx | Alertable I/O]]
 +  * [[http://​himskim.egloos.com/​1053865 | APC에 대하여]]
 +
 +----
 +  * see also [[IOCP]]
  
kb/alertableio.txt · 마지막으로 수정됨: 2014/11/07 14:26 (바깥 편집)