所谓的轮询算法是对事件的一种检测机制,如I/O设备的状态改变等。常见的事件检测机制有轮询,中断,DMA,通道等,其中轮询和中断是事件通知的两种基本方式,DMA和通道都是一种数据传输方式。能用中断的情况下当然尽量用中断,Windows中基于中断的I/O模型有好几种,如Select模型,异步模型等等。但是中断需要硬件支持,很多情况下轮询还是不可避免的,如两个进程通过共享内存通信,共享内存只是一块内存,并不支持中断模式,因此需要通过轮询工作。
轮询和中断相比的一个重要问题就是效率。中断模式下事件的发生会由事件源自动通知CPU,而轮询模式下你不知道什么时候事件发生,因此就需要不断的检测事件是否发生,而对于发生频率不高的事件大部分检测都是无效的,这样也就浪费了大量的CPU时间。为了提高效率,一般选择每隔一段时间检测一次事件是否发生。
但是这样不可避免的增加了事件的处理延迟。延迟的最大值等于检测周期的最大值。为此需要在效率和延迟之间进行均衡。延迟分为平均延迟和突发延迟,对于平均延迟的提高,必然会伤害到效率,它和效率之间存在简单的线性关系,此消彼长,为了在不伤害效率的情况下减少延迟,需要根据CPU的处理能力来选择合适的检测周期。
对于突发延迟,它和效率之间没有必然的联系,和算法有着很重要的关系。也就是说好的算法可以在不损害效率的情况下大大减少突发延迟。突发延迟是指某一段时间内事件的发生速率明显高于时间发生的平均速率,对于这段时间内事件的平均延迟称为突发延迟。对于突发延迟的减少一般根据局部性原则进行算法设计。
一种简单的处理方式是,只要检测到事件的发生就连续检测,直到检测不到事件的发生时才休眠一段时间。这种算法虽然简单但是对于突发延迟的减少是很明显的,缺点也很明显
轮询算法中效率和延迟的均衡
最新推荐文章于 2025-04-13 19:27:20 发布