다음을 통해 공유


경고 가능한 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. 큐가 비어 있으면 스레드는 경고 가능한 상태로 배치한 함수에서 반환됩니다.

이 시나리오에서 스레드가 경고 가능 상태가 되면 ReadFileEx 전송된 콜백 함수를 호출하고 WriteFileEx경고 가능한 상태로 배치한 함수에서 반환합니다.

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

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

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

비동기 프로시저 호출