背景
外部设备与中央处理器交互一般有两种手段:轮询和中断。
● 中断看似很高效,但是却会遗漏一些数据,避免遗漏的机制要么由硬件实现要么由上层的软件实现。
● 轮询没有中断高效,会做很多徒劳的操作,而且必须引入暂存机制,由于cpu不可能每次查询硬件的时候正好有事情可做,但轮询不会遗漏请求。
当外部设备活跃时,频繁的中断会导致大量的CPU开销,此时最好用轮询,但是外设活动很缓和的时候,轮询将会浪费CPU资源。
机制
NAPI是中断和轮询的结合,数据量低时采用中断,数据量高时采用轮询。
平时是中断方式,当有数据到达时,会触发中断处理函数执行,中断处理函数关闭中断开始处理。如果此时有数据到达,则没必要再触发中断了,因为中断处理函数中会轮询处理数据,直到没有新数据时才打开中断。
缺点
- 对于上层的应用程序而言,系统不能在每个数据包接收到的时候都可以及时地去处理它,而且随着传输速度增加,累计的数据包将会耗费大量的内存;
- 另外一个问题是对于大的数据包处理比较困难,原因是大的数据包传送到网络层上的时候耗费的时间比短数据包长很多(即使是采用 DMA 方式),因此,NAPI适用于对高速率的短长度数据包的处理。