异步设备I/O--请求加入队列与接受完成通知
异步I/O请求: 当线程发出一个异步I/O请求时,这个请求被传递给设备驱动程序,由后者负责完成实际的I/O操作。 当驱动程序在等待设备响应的时候,应用程序的线程并没有因为等待I/O请求完成而被挂起,线程会继续运行并执行其他任务。 将异步I/O请求加入队列,有驱动程序完成对列中 I/O 请求的处理,并通知应用程序I/O操作已完成。异步方式访问设备:CreateFile(,,,) 在dwFlagsAndAttributes参数指定FILE_FLAG_OVERLAPPED标志来打开设备,告诉其用异步的方式访问设备。将I/O请求加入到设备驱动程序的队列:通过调用ReadFile, WriteFile 函数(会检测 设备文件是否标记了 FILE_FLAG_OVERLAPPED,若标记 则 异步,否则同步)将I/O请求放入队列。 重叠结构(OVERLAPPED):执行异步设备I/O的时候,需为pOverlapped参数传递一个已初始化的OVERLAPPED结构.“overlapped”意思是执行I/O请求的时间与线程执行其他任务的时间是重叠的。
技术简介触发设备内核对象一个线程发出I/O请求,另一个线程出结果进行处理。当向一个设备同时发出多个I/O请示时,则无能为力。因为设备只有一个,其处于激发状态与否,只能表示一个请求的状态。触发事件内核对象一个线程发出I/O请求,另一个线程出结果进行处理。可以向一个设备同时发出多个I/O请求(为每个请求建立相应的事件对象)使用可提醒I/O可以向一个设备同时发出多个I/O请求,发出请求的线程处理结果使用I/O完成端口一个线程发出I/O请求,另一个线程出结果进行处理。可以向一个设备同时发出多个I/O请求 例:1.触发设备内核对象HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...); BYTE bReadBuffer[100];OVERLAPPED oRead = {0};o.Offset = 0;oRead.hEvent = CreateEvent(...);ReadFile(hFile, bReadBuffer, 100, NULL, &oRead); BYTE bWriteBuffer[100] = {......};OVERLAPPED oWrite = {0};o.Offset = 0;oWrite.hEvent = CreateEvent(...);WriteFile(hFile, bReadBuffer, _countof(bWriteBuffer), NULL, &oWrite);.... HANDLE h[2];h[0] = oRead.hEvent;h[1] = oWrite.hEvent;DWORD dw = WaitForMultipleObjects( 2, h, FALSE, INFINITE);switch(dw - WAIT_OBJECT_0) case 0://Read completed { .... break; } case 1://write completed { .... break; }}