mopyman
驱动牛犊
驱动牛犊
  • 注册日期2004-08-01
  • 最后登录2010-04-24
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望36点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1509回复:2

关于进程的用户态和核心态的疑问?

楼主#
更多 发布于:2007-11-15 09:32
     应用程序通过win32子系统提供的API接口来进行设备IO,当进行这样的调用的时候,进程会通过I/O管理器来调用设备驱动程序,进入核心态运行,这个时候是没有进程上下文切换的,也就是还在一个进程中,不过特权级发生了变化。我们知道进程有两种I/O模式,同步和异步。进程在发出调用请求后如果不能立刻得到满足,如果是同步调用,进程调度器会将进程挂起,等待I/O完成,如果是异步调用则进程调度器继续调度该进程。不管是哪种调用方式,代表进程执行I/O操作的驱动程序都在内核态执行。
     我的问题是:就算是我们认为的普通的单线程应用程序,如果执行异步I/O操作,也是有两个调度单元在接受调度(用户态和内核态),是否是可以认为它有两个线程呢?如果不是,为什么?
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-11-15 09:55
异步操作的CompleteRoutine是由IoCompleteRequest调用的,使用KeInsertQueueApc插到请求线程里执行,还是在同一个线程里,详见W2K源代码
驱动开发者 呵呵
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-11-16 04:06
引用楼主mopyman于2007-11-15 09:32发表的 关于进程的用户态和核心态的疑问? :
     应用程序通过win32子系统提供的API接口来进行设备IO,当进行这样的调用的时候,进程会通过I/O管理器来调用设备驱动程序,进入核心态运行,这个时候是没有进程上下文切换的,也就是还在一个进程中,不过特权级发生了变化。我们知道进程有两种I/O模式,同步和异步。进程在发出调用请求后如果不能立刻得到满足,如果是同步调用,进程调度器会将进程挂起,等待I/O完成,如果是异步调用则进程调度器继续调度该进程。不管是哪种调用方式,代表进程执行I/O操作的驱动程序都在内核态执行。
     我的问题是:就算是我们认为的普通的单线程应用程序,如果执行异步I/O操作,也是有两个调度单元在接受调度(用户态和内核态),是否是可以认为它有两个线程呢?如果不是,为什么?


有2个,但不是你说的那样。另一个是callback函数,用来作一些处理,好让你的主线程继续running.
游客

返回顶部