경고 가능한 I/O
경고 가능 I/O는 애플리케이션 스레드가 경고 가능한 상태일 때만 비동기 I/O 요청을 처리하는 방법입니다.
스레드가 경고 가능한 상태인 경우를 이해하려면 다음 시나리오를 고려하세요.
- 스레드는 콜백 함수에 대한 포인터를 사용하여 ReadFileEx를 호출하여 비동기 읽기 요청을 시작합니다.
- 스레드는 콜백 함수에 대한 포인터를 사용하여 WriteFileEx를 호출하여 비동기 쓰기 요청을 시작합니다.
- 스레드는 원격 데이터베이스 서버에서 데이터 행을 가져오는 함수를 호출합니다.
이 시나리오에서는 ReadFileEx 및 WriteFileEx에 대한 호출이 3단계에서 함수 호출 전에 반환될 가능성이 큽니다. 이를 통해 커널은 스레드의 APC(비동기 프로시저 호출) 큐에 콜백 함수에 대한 포인터를 배치합니다. 커널은 반환된 I/O 요청 데이터를 해당 스레드에서 처리할 수 있을 때까지 저장하도록 이 큐를 유지 관리합니다.
행 가져오기가 완료되고 스레드가 함수에서 반환되는 경우 가장 높은 우선 순위는 콜백 함수를 호출하여 큐에서 반환된 I/O 요청을 처리하는 것입니다. 이렇게 하려면 경고 가능 상태에 들어가야 합니다. 스레드는 적절한 플래그를 사용하여 다음 함수 중 하나를 호출해야만 이 작업을 수행할 수 있습니다.
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx
스레드가 경고 가능 상태에 들어가면 다음 이벤트가 발생합니다.
- 커널은 스레드의 APC 큐를 확인합니다. 큐에 콜백 함수 포인터가 포함된 경우 커널은 큐에서 포인터를 제거하고 스레드로 보냅니다.
- 스레드는 콜백 함수를 실행합니다.
- 큐에 남아 있는 각 포인터에 대해 1단계와 2단계가 반복됩니다.
- 큐가 비어 있으면 스레드는 경고 가능한 상태에 들어가도록 만든 함수로부터 반환됩니다.
이 시나리오에서 스레드가 경고 가능 상태로 들어가면 ReadFileEx 및 WriteFileEx로 전송된 콜백 함수를 호출한 다음 경고 가능한 상태에 들어가도록 만든 함수로부터 반환됩니다.
APC 큐가 비어 있는 동안 스레드가 경고 가능한 상태로 들어가면 다음 중 하나가 발생할 때까지 스레드의 실행이 커널에 의해 일시 중단됩니다.
- 대기 중인 커널 개체가 신호를 받습니다.
- 콜백 함수 포인터는 APC 큐에 배치됩니다.
경고 가능한 I/O를 사용하는 스레드는 단순히 OVERLAPPED 구조체의 이벤트 플래그가 설정될 때까지 기다리는 것보다 비동기 I/O 요청을 더 효율적으로 처리하며, 경고 가능한 I/O 메커니즘은 사용할 I/O 완료 포트보다 덜 복잡합니다. 그러나 경고 가능한 I/O는 I/O 요청의 결과를 시작한 스레드에만 반환합니다. I/O 완료 포트에는 이 제한이 없습니다.
관련 항목