JackyWu
驱动小牛
驱动小牛
  • 注册日期2001-10-25
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1038回复:2

关于Walt Oney的书的问题

楼主#
更多 发布于:2002-05-12 12:47
参考本书第4章第2部分的“IRQL和分页”:
    如果KeWaitForSingleObject真的被阻塞了指定长的时间(你指定的非0超时),那么你必定运行在低于DISPATCH_LEVEL的IRQL上,因为只有在这样的IRQL上线程阻塞才是允许的。如果你所做的一切就是为了检测事件是否进入信号态,则可以执行在DISPATCH_LEVEL级上。但你不能在ISR或其它运行在高于DISPATCH_LEVEL级上的例程中调用KeWaitForSingleObject例程。

我对这一段很是不理解
1,为什么KeWaitForSingleObject被timeout了,我就必须在DISPATCH_LEVEL上?
2,为什么只有DISPATCH_LEVEL上的线程才是允许阻塞的?

哪个高手愿意花点时间解释清楚这个问题?多谢多谢!!
多年以后,我又回来了。
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-05-12 19:14
这个问题很简单,举个例子来说吧。假设你在DISPATCH_LEVEL上调用KeWaitForSingleObject例程等待一个事件Event,而这个Event事件当前处于非信号态,显然你的调用线程就要被阻塞了。什么叫阻塞?阻塞就意味着你的调用线程不能继续执行下去了,它应该被取消调度,然后由分派器(Dispatcher)从就绪线程队列中选择一个新的线程来运行。但是,你的调用线程当前正运行在DISPATCH_LEVEL上,它将屏蔽掉分派器(Dispatcher)的运行,因为分派器(Dispatcher)也运行在DISPATCH_LEVEL上,显然,这就产生死锁了吧!
JackyWu
驱动小牛
驱动小牛
  • 注册日期2001-10-25
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-12 21:59
    回答简单扼要,非常感谢!我给,我给,我全给!
多年以后,我又回来了。
游客

返回顶部