延迟过程调用

来源:互联网 发布:淘宝延迟收货可以多久 编辑:程序博客网 时间:2024/05/22 14:40
延迟过程调用,即 DPC。
这是一种机制,当上层请求下来,由于过多的操作步骤,为了使系统性能更好,使用一个完成调用例程,告诉上层“我完成了”,这样就可以处理下面的请求了,而系统会把剩下得处理过程加入到一个叫做DPC的队列中,等系统有空时,再来调用。这就是--延迟过程调用
说白了,就是一种缓冲机制。
这是系统控制的。几乎每种现代操作系统都有这样的类似机制。

延时过程调用的应用延时调用可用在Windows驱动程序的中断处理中。由于中断处理的中断级别较高--在DIRQL级别,所以应该使其执行时间尽可能短。于是一般的情况是在中断处理程序里判断中断发生,然后调用延时过程调用例程实现中断程序的功能。说明如下:?  当硬件设备产生中断请求时,驱动程序则需要注册一个处理程序,在中断到达时进行正确的处理。在DriverWorks中通过 KInterrupt类实现硬件中断处理,该类封装了IoConnectInterrupt函数来初始化中断及将一个中断服务例程连接到一个中断上。中断 服务例程是运行在DIRQL级别上,因此处理时间应该尽可能的短,并且在该级别上还有很多内核函数不能调用。所以一般在中断服务例程中只判断该中断是否由 自己的设备产生,若是则调用一个在DISPATCH_LEVEL级别上运行的延迟过程调用。在延迟过程调用例程中可完成大部分的中断处理工作。
例如,在中断服务程序中通过判断是不是该设备产生的中断,以响应中断(以下程序都只给出关键代码):
?status?=?m_IoPortRange0.ind(INTCSR);?//获取设备的中断状态
?if?((status?&?0x800000)?!=?0x800000) {?return?FALSE;?}
?//判断是不是由该设备产生的中断,如果不是则返回
?m_IoPortRange0.outd(INTCSR,?status?&?0xff02ffff); //屏蔽中断
?if?(!m_DpcFor_Irq.Request(NULL,?NULL))?; //调用延时过程调用例程,处理中断事件?