willyangmiao
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1915回复:4

异步 I/O 的讨论

楼主#
更多 发布于:2003-07-12 22:27
近来对 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_mekiki_m...
ppl
ppl
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2006-05-21
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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,或者激发事件。

  
    
    
    
willyangmiao
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-14 09:24
比我说得清楚。

当用户程序使用同步方式时(OpenFile 用非OVERLAPED 方式), 内核中模块以异步完成操作,  你觉得如何处理的?
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-14 18:21
怎么你好像说反了?同步方式的话系统进行一下用户模式到内核模式的切换,然后驱动等待完成IRP,返回状态码,系统又从内核模式切换回用户模式,app继续,其实也就是函数调用加模式切换而已。而异步则是相当于开新线程(没有独立环境块)执行函数。
teddy
willyangmiao
驱动牛犊
驱动牛犊
  • 注册日期2003-06-20
  • 最后登录2005-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-14 22:05
> 怎么你好像说反了?同步方式的话系统进行一下用户模式到内核模> 式的切换,然后驱动等待完成IRP,返回状态码,系统又从内核模> 式切换回用户模式,app继续

我认为, 同步方式调用同步方式时,IO manager 不会在内核中等待, 在IOCALLDRIVER返回非STATUS_PENDING 后, 即返回应用程序。

> 而异步则是相当于开新线程(没有独立环境块)执行函数
不知根据在哪?  我想应是用USER APC.
游客

返回顶部