다음을 통해 공유


경고 가능한 I/O

경고 가능 I/O는 애플리케이션 스레드가 경고 가능한 상태일 때만 비동기 I/O 요청을 처리하는 방법입니다.

스레드가 경고 가능한 상태인 경우를 이해하려면 다음 시나리오를 고려하세요.

  1. 스레드는 콜백 함수에 대한 포인터를 사용하여 ReadFileEx를 호출하여 비동기 읽기 요청을 시작합니다.
  2. 스레드는 콜백 함수에 대한 포인터를 사용하여 WriteFileEx를 호출하여 비동기 쓰기 요청을 시작합니다.
  3. 스레드는 원격 데이터베이스 서버에서 데이터 행을 가져오는 함수를 호출합니다.

이 시나리오에서는 ReadFileExWriteFileEx에 대한 호출이 3단계에서 함수 호출 전에 반환될 가능성이 큽니다. 이를 통해 커널은 스레드의 APC(비동기 프로시저 호출) 큐에 콜백 함수에 대한 포인터를 배치합니다. 커널은 반환된 I/O 요청 데이터를 해당 스레드에서 처리할 수 있을 때까지 저장하도록 이 큐를 유지 관리합니다.

행 가져오기가 완료되고 스레드가 함수에서 반환되는 경우 가장 높은 우선 순위는 콜백 함수를 호출하여 큐에서 반환된 I/O 요청을 처리하는 것입니다. 이렇게 하려면 경고 가능 상태에 들어가야 합니다. 스레드는 적절한 플래그를 사용하여 다음 함수 중 하나를 호출해야만 이 작업을 수행할 수 있습니다.

스레드가 경고 가능 상태에 들어가면 다음 이벤트가 발생합니다.

  1. 커널은 스레드의 APC 큐를 확인합니다. 큐에 콜백 함수 포인터가 포함된 경우 커널은 큐에서 포인터를 제거하고 스레드로 보냅니다.
  2. 스레드는 콜백 함수를 실행합니다.
  3. 큐에 남아 있는 각 포인터에 대해 1단계와 2단계가 반복됩니다.
  4. 큐가 비어 있으면 스레드는 경고 가능한 상태에 들어가도록 만든 함수로부터 반환됩니다.

이 시나리오에서 스레드가 경고 가능 상태로 들어가면 ReadFileExWriteFileEx로 전송된 콜백 함수를 호출한 다음 경고 가능한 상태에 들어가도록 만든 함수로부터 반환됩니다.

APC 큐가 비어 있는 동안 스레드가 경고 가능한 상태로 들어가면 다음 중 하나가 발생할 때까지 스레드의 실행이 커널에 의해 일시 중단됩니다.

  • 대기 중인 커널 개체가 신호를 받습니다.
  • 콜백 함수 포인터는 APC 큐에 배치됩니다.

경고 가능한 I/O를 사용하는 스레드는 단순히 OVERLAPPED 구조체의 이벤트 플래그가 설정될 때까지 기다리는 것보다 비동기 I/O 요청을 더 효율적으로 처리하며, 경고 가능한 I/O 메커니즘은 사용할 I/O 완료 포트보다 덜 복잡합니다. 그러나 경고 가능한 I/O는 I/O 요청의 결과를 시작한 스레드에만 반환합니다. I/O 완료 포트에는 이 제한이 없습니다.

비동기 프로시저 호출