离开以后 » 日志 » 关于混合轮询
关于混合轮询
yayj 发表于 2005-11-29 19:33:46
以下内容主要来自Luigi Rizzo(assisstant professor), Dipartimento di Ingegneria dell'Informazione of the Università di Pisa, Italy. 的文章。Luigi实现了FreeBSD中的polling。
---------------------------------------------------------------------------------
正如《操作系统》教科书上所说的,纯粹轮询方式不好(polling is bad)。
FreeBSD中采用的DEVICE_POLLING不是纯粹轮询。当启用DEVICE_POLLING的时候,系统将网络设备的基于中断的处理替换为一 种混合的中断-轮询模式(简称“polling, 轮询”),在启用了轮询的网卡上,在每次时钟tick的等待循环中,以及(可选地,每次)系统调用时,将进行轮询。
此外,FreeBSD中的polling实现还允许精确地分配目态和管态的CPU周期比例。
由于减少了中断发生的次数,这可以节省一些时钟周期(我们知道,在发生中断时需要进行目态/管态,以及上下文的切换)。当网络繁忙时,网卡可以轻易地产生每秒钟数十甚至上百次的中断,并耗尽所有的CPU时间。
当然,更有用的特性(通过采用适当的控制算法)是,混合轮询允许管理员决定使用多大比例的CPU来处理设备操作。这样,即使在网络流量过大的情况下,用户 进程也不会饿死并最终导致“活锁(livelock)”,换言之,由于花费过多时间处理数据包而无法完成那些有用的(处理数据)工作,并最终只能把那些数 据包丢弃。
当然,混合轮询也有一些缺点。因为需要轮询网卡上的数据,因此在响应数据包时,将可能有微小的延迟(不超过1/HZ)。不过这通常并不是问题,在空闲的系 统上,轮询网卡数据将持续地进行,因此几乎没有任何延迟;而当系统忙时,额外的1ms延迟与由于其他处理造成的延迟相比,基本上可以忽略不计。
在繁忙的网络上运行的路由器或服务器上,如果可能发生由于网络流量造成的过载,则应该启用混合轮询。普通的*BSD和Linux都会由于没有启用混合轮询而发生活锁,更糟糕的是,吞吐量迅速下降到一个很低的水平。
此外,对于伪实时[pseudo-real-time]的工作站,也应采用混合轮询,因为这样调度器的行为将更容易预测。
在没有过载的服务器上,混合轮询不会带来明显的性能提升;当负载适中时,将有0-50%的性能提升,而在重负载的环境下,性能提升将比较明显。
---------------------------------------------------------------------------------
由于systm.h中对于DEVICE_POLLING与SMP的互斥限制,DEVICE_POLLING不能与SMP同时启用。但如果把那一行去掉,DEVICE_POLLING也可以在SMP上用(采用1个线程,尽管原则上SMP应该并行地处理中断)。
