阅读:1915回复:4
异步 I/O 的讨论
近来对 I/O 的异步的实现产生了兴趣, 找了一些文章, 略有体会,与大家讨论。
当用户程序使用异步方式时(OpenFile 用OVERLAPED 方式), 内核中模块 以同步完成操作, 则IO Manager 会立即通知用户程序。 具体来说, 用户程序在OVERLAPED 结构中用事件时, IO Manager 会signal 该事件: 用户程序使用 callback function时, IO Manager 调用KeinitializeApc,KeQueueApc 在当前线程的用户APC队列中加入一个用户APC,该APC 的routing 是用户指定的function. 当用户程序使用同步方式时(OpenFile 用非OVERLAPED 方式), 内核中模块以异步完成操作, 则IO Manager 不会立即通知用户程序, 而是在当前线程的内核APC队列中加入一个内核APC。 在该APC 中通知用户程序,方式如上。 |
|
最新喜欢:kiki_m... |
沙发#
发布于:2003-07-13 12:01
异步调用大致应该是这么一个过程:
1。app打开设备。 2。app 调用readfile之类... 2.1 调用传到 IRP_MJ_READ ... 之类的驱动程序入口。 2.2 驱动程序入口,返回。 3。app 调用readfile之类的东西返回。 。。。。。。。 硬件中断发生。。。。 驱动程序ISR,DPC。 驱动程序完成 IRP. 内核调度 内核态APC 内核态APC通知用户态:调度用户态APC,或者激发事件。 |
|
板凳#
发布于:2003-07-14 09:24
比我说得清楚。
当用户程序使用同步方式时(OpenFile 用非OVERLAPED 方式), 内核中模块以异步完成操作, 你觉得如何处理的? |
|
地板#
发布于:2003-07-14 18:21
怎么你好像说反了?同步方式的话系统进行一下用户模式到内核模式的切换,然后驱动等待完成IRP,返回状态码,系统又从内核模式切换回用户模式,app继续,其实也就是函数调用加模式切换而已。而异步则是相当于开新线程(没有独立环境块)执行函数。
|
|
|
地下室#
发布于:2003-07-14 22:05
> 怎么你好像说反了?同步方式的话系统进行一下用户模式到内核模> 式的切换,然后驱动等待完成IRP,返回状态码,系统又从内核模> 式切换回用户模式,app继续
我认为, 同步方式调用同步方式时,IO manager 不会在内核中等待, 在IOCALLDRIVER返回非STATUS_PENDING 后, 即返回应用程序。 > 而异步则是相当于开新线程(没有独立环境块)执行函数 不知根据在哪? 我想应是用USER APC. |
|