可警报 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 的线程可以更高效地处理异步 I/O 请求,而不是在 OVERLAPPED 结构中等待事件标志时,其可警报 I/O 机制比 I/O 完成端口 要使用的要复杂得多。 但是,可警报的 I/O 仅将 I/O 请求的结果返回给启动它的线程。 I/O 完成端口没有此限制。

异步过程调用