When performing asynchronous device I/O, you must pass the address to an initialized OVERLAPPED
structure via the pOverlapped parameter. The word "overlapped" in this context means that the time
spent performing the I/O request overlaps the time your thread spends performing other tasks.
通俗点说就是:
1)OVERLAPPED是ReadFile/WriteFile等异步操作APIs的一个必须的实参(传址方式)。
2)“overlapped”的意思是执行IO请求的时间与线程执行其他任务的时间是重叠的(overlapped)。
再来看MSDN的说明:
Contains information used in asynchronous (oroverlapped) input and output (I/O).
链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684342(v=vs.85).aspx
我们可以将OVERLAPPED理解为“与某个I/O请求关联的附加信息”。也有人将它理解为I/O请求的ID号,但我觉得“附加信息”更正确一点。事实上,在Jeffrey给的FileCopy.exe示例中,他对OVERLAPPED进行了扩展(继承),如下:
Jeffrey的这个扩展揭示了“异步IO请求”的本质 ——an OVERLAPPED structure and a data buffer。我们真正需要传输的就是这两个东西,其中OVERLAPPED作为标识,buffer才是真实的信息载体。当然,如果是同步IO,一次只能接收一个请求,就无需OVERLAPPED这个标识物啦,直接传NULL即可。
注:ReadFile/WriteFile只有一个buffer,但是DeviceIoControl有两个buffer —— 输入buffer和输出buffer。这个buffer是信息的载体,而不是信息,事实上,ReadFile的发出请求的时候,buffer为空,待请求处理完了,系统会将信息填充到该buffer上。
2,IO完成端口
IO完成端口是一个内核对象,它的作用是管理关联设备(Associated Devices)的异步IO请求的完成通知。这个话比较拗口,通俗点说,IO完成端口会监视与它管理的设备,如果该设备的某次异步IO请求被处理完了,系统会先把完成通知发给IO完成端口,IO完成端口再将收到的完成通知排队,然后去调度等待列表中的线程来最终收尾一个IO请求。
要理解IO完成端口的工作原理,就需要先搞清楚它的3个列表和2个队列,见《Windows核心编程》图10-4。
1)设备列表
包含所有与该IO完成端口关联的设备。
2)完成队列(先入先出)
IO完成端口将收到的系统发给他的IO完成通知存储在完成队列中。

3)等待线程队列(后入先出)
存储可供IO完成端口调度(选择)的线程。IO完成端口会在该队列中选择一个线程了处理一项完成通知。
4)已释放线程列表
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-68209-2.html
给点颜色