延迟过程调用/异步过程调用APC

延迟过程调用,即 DPC
这是一种机制,当上层请求下来,由于过多的操作步骤,为了使系统性能更好,使用一个完成调用例程,告诉上层“我完成了”,这样就可以处理下面的请求了,而系统会把剩下得处理过程加入到一个叫做DPC的队列中,等系统有空时,再来调用。这就是--延迟过程调用

说白了,就是一种缓冲机制。

异步过程调用APC

异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

这是系统控制的。几乎每种现代操作系统都有这样的类似机制。

延时过程调用的应用延时调用可用在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))?; //调用延时过程调用例程,处理中断事件?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值