《Windows Via C/C++》学习之同步设备I/O与异步设备I/O
2012-04-01 15:15
302 查看
这章可就讲设备了。好好想想,其实一个有用的程序都得和设备打交道,这章是相当的重要。可惜我看得不是很透。
和设备打交道的方法分为同步和异步。同步就是我调用了函数说要读100个字符后,就站那等着,等到100个字符全读完了再继续往前走。异步就是我调用了函数后,让驱动程序自己读取,我不理他直接接着往前走,直到某个点必须要用那100个字符了,再开始等。
1. 先说使用设备的方法。常见的设备有文件、串口、并口、控制台、命名管道、匿名管道、套接字、邮件槽等等。使用设备的时候都要用到设备内核对象。通常的设备都用CreateFile函数来创建内核对象。注意,CreateFile函数有一个参数很重要,dwFlagsAndAttributes,当给这个参数传FILE_FLAG_OVERLAPPED标志时就表示以异步方式打开设备,如果不传该标志,就是默认的同步方式。关闭设备内核对象句柄的方式还是CloseHandle。作为一个特例,本书专门讲了文件设备的使用方法。只不过使一些函数而已,不细说了。
2. 下面开始将同步设备I/O。为了使用同步I/O,在创建设备内核对象时CreateFile函数不应传入FILE_FLAG_OVERLAPPED。读同步设备的函数是ReadFile,写设备的函数是WriteFile(其实异步方式也是这两个函数)。因为是同步方式,所以两个函数的OVERLAPPED* 参数处应传NULL。同步方式的缺陷是,由于等待同步I/O操作会导致线程被挂起。即在执行ReadFile或者CreateFile的时候会被挂起。
3. 异步设备I/O。为使用异步I/O,创建设备内核对象时CreateFile必须传入FILE_FLAG_OVERLAPPED。读或写异步设备的函数依然是ReadFile和WriteFile,不过两个函数必须传入OVERLAPPED* 参数。注意,正是ReadFile和WriteFile函数把异步设备I/O请求加入设备驱动程序的队列中,然后线程才得以继续执行下去。
在I/O请求完成的时候,驱动程序会通知我们的线程。通知的方式有4种。
第一种,触发设备内核对象。即在I/O请求进队前,ReadFile或WriteFile先将设备内核对象设为未触发状态,I/O请求完成后,驱动程序将其设为触发状态。这种方法显然的缺陷是,当向一个设备同时发出多个I/O请求时,无法判断到底是哪个完成完成了。
第二种,触发事件内核对象。这就利用了OVERLAPPED结构中的hEvent分量。其实原理同第一种方式(把设备内核对象换成事件内核对象)。他可以解决第一种方式的缺陷,即为每个请求创建不同的事件对象。
第三种,使用可提醒I/O。这个主要是利用了线程的APC队列。书上说这种方法太次,可以无视之。
第四种,使用I/O完成端口。作者竭力推荐的方法。这种方法可以解决第一种方式的缺陷。(怎么解决的?我的理解是使用GetQueuedCompletionStatus取得的OVERLAPPED ** 所附带的信息)
4. I/O完成端口。其设计初衷是与线程池配合使用,因此理解的时候可以从那个角度出发。一个线程最多可以与一个完成端口关联。废话就不说了,使用方法:
[align=center]创建I/O完成端口(CreateIoCompletionPort)[/align]
[align=center]|[/align]
将设备与I/O完成端口关联(亦CreateIoCompletionPort,这里设置了完成键)
|
ReadFile或者WriteFile产生I/O请求(异步的)
|
等待和获取当前I/O完成端口上完成的I/O请求(GetQueuedCompletionStatus)
|
根据上一步取得的完成键和OVERLAPPED等信息作出相应处理
文章转载自:http://hi.baidu.com/dsa343/blog/item/1605ebcb479403f453664f5c.html
和设备打交道的方法分为同步和异步。同步就是我调用了函数说要读100个字符后,就站那等着,等到100个字符全读完了再继续往前走。异步就是我调用了函数后,让驱动程序自己读取,我不理他直接接着往前走,直到某个点必须要用那100个字符了,再开始等。
1. 先说使用设备的方法。常见的设备有文件、串口、并口、控制台、命名管道、匿名管道、套接字、邮件槽等等。使用设备的时候都要用到设备内核对象。通常的设备都用CreateFile函数来创建内核对象。注意,CreateFile函数有一个参数很重要,dwFlagsAndAttributes,当给这个参数传FILE_FLAG_OVERLAPPED标志时就表示以异步方式打开设备,如果不传该标志,就是默认的同步方式。关闭设备内核对象句柄的方式还是CloseHandle。作为一个特例,本书专门讲了文件设备的使用方法。只不过使一些函数而已,不细说了。
2. 下面开始将同步设备I/O。为了使用同步I/O,在创建设备内核对象时CreateFile函数不应传入FILE_FLAG_OVERLAPPED。读同步设备的函数是ReadFile,写设备的函数是WriteFile(其实异步方式也是这两个函数)。因为是同步方式,所以两个函数的OVERLAPPED* 参数处应传NULL。同步方式的缺陷是,由于等待同步I/O操作会导致线程被挂起。即在执行ReadFile或者CreateFile的时候会被挂起。
3. 异步设备I/O。为使用异步I/O,创建设备内核对象时CreateFile必须传入FILE_FLAG_OVERLAPPED。读或写异步设备的函数依然是ReadFile和WriteFile,不过两个函数必须传入OVERLAPPED* 参数。注意,正是ReadFile和WriteFile函数把异步设备I/O请求加入设备驱动程序的队列中,然后线程才得以继续执行下去。
在I/O请求完成的时候,驱动程序会通知我们的线程。通知的方式有4种。
第一种,触发设备内核对象。即在I/O请求进队前,ReadFile或WriteFile先将设备内核对象设为未触发状态,I/O请求完成后,驱动程序将其设为触发状态。这种方法显然的缺陷是,当向一个设备同时发出多个I/O请求时,无法判断到底是哪个完成完成了。
第二种,触发事件内核对象。这就利用了OVERLAPPED结构中的hEvent分量。其实原理同第一种方式(把设备内核对象换成事件内核对象)。他可以解决第一种方式的缺陷,即为每个请求创建不同的事件对象。
第三种,使用可提醒I/O。这个主要是利用了线程的APC队列。书上说这种方法太次,可以无视之。
第四种,使用I/O完成端口。作者竭力推荐的方法。这种方法可以解决第一种方式的缺陷。(怎么解决的?我的理解是使用GetQueuedCompletionStatus取得的OVERLAPPED ** 所附带的信息)
4. I/O完成端口。其设计初衷是与线程池配合使用,因此理解的时候可以从那个角度出发。一个线程最多可以与一个完成端口关联。废话就不说了,使用方法:
[align=center]创建I/O完成端口(CreateIoCompletionPort)[/align]
[align=center]|[/align]
将设备与I/O完成端口关联(亦CreateIoCompletionPort,这里设置了完成键)
|
ReadFile或者WriteFile产生I/O请求(异步的)
|
等待和获取当前I/O完成端口上完成的I/O请求(GetQueuedCompletionStatus)
|
根据上一步取得的完成键和OVERLAPPED等信息作出相应处理
文章转载自:http://hi.baidu.com/dsa343/blog/item/1605ebcb479403f453664f5c.html
相关文章推荐
- 《Windows via C/C++》学习笔记 —— 设备I/O之“异步设备I/O请求”
- 《Windows via C/C++》学习笔记 —— 设备I/O之“同步的设备I/O”(系列文章)
- windowsViaC/C++设备IO之同步的设备I/O
- windows via c/c++ 学习笔记(二) 内核同步
- windowsViaC/C++设备IO之异步设备IO请求
- 《Windows via C/C++》学习笔记 —— 设备I/O之“同步的设备I/O”
- 《Windows Via C/C++》边学习,边翻译(七)操作字符和字符串-6
- WIndows via C/C++ 学习(12)权限上下文
- 《Windows via C/C++》学习笔记 (七) 设备I/O之“I/O请求完成”
- Windows via C/C++ 学习(16)用户模式下的线程同步(一)
- windows via c/c++ 学习笔记(一)
- node.js在windows下的学习笔记(4)---同步,异步,回调的概念
- Windows via C/C++ 学习(10)子进程
- 《Windows via C/C++》学习笔记 —— 设备I/O之“I/O完成端口”
- Windows Via C/C++ 读书笔记 7 异步IO, 完成端口模式
- 应用程序对设备 + IRP 的同步异步学习
- 《Windows via C/C++》学习笔记 —— 设备I/O之“设备的打开和关闭”
- 《Windows via C/C++》学习笔记 —— 设备I/O之“接收I/O请求完成通知”
- 《Windows via C/C++》学习笔记 —— 设备I/O之“I/O完成端口”
- 应用程序对设备 + IRP 的同步异步学习