阅读:1038回复:2
关于Walt Oney的书的问题
参考本书第4章第2部分的“IRQL和分页”:
如果KeWaitForSingleObject真的被阻塞了指定长的时间(你指定的非0超时),那么你必定运行在低于DISPATCH_LEVEL的IRQL上,因为只有在这样的IRQL上线程阻塞才是允许的。如果你所做的一切就是为了检测事件是否进入信号态,则可以执行在DISPATCH_LEVEL级上。但你不能在ISR或其它运行在高于DISPATCH_LEVEL级上的例程中调用KeWaitForSingleObject例程。 我对这一段很是不理解 1,为什么KeWaitForSingleObject被timeout了,我就必须在DISPATCH_LEVEL上? 2,为什么只有DISPATCH_LEVEL上的线程才是允许阻塞的? 哪个高手愿意花点时间解释清楚这个问题?多谢多谢!! |
|
|
沙发#
发布于:2002-05-12 19:14
这个问题很简单,举个例子来说吧。假设你在DISPATCH_LEVEL上调用KeWaitForSingleObject例程等待一个事件Event,而这个Event事件当前处于非信号态,显然你的调用线程就要被阻塞了。什么叫阻塞?阻塞就意味着你的调用线程不能继续执行下去了,它应该被取消调度,然后由分派器(Dispatcher)从就绪线程队列中选择一个新的线程来运行。但是,你的调用线程当前正运行在DISPATCH_LEVEL上,它将屏蔽掉分派器(Dispatcher)的运行,因为分派器(Dispatcher)也运行在DISPATCH_LEVEL上,显然,这就产生死锁了吧!
|
|
板凳#
发布于:2002-05-12 21:59
回答简单扼要,非常感谢!我给,我给,我全给!
|
|
|