传统的中断IO方法。
网卡接收数据包,将数据包DMA到环形数据缓冲区后,触发中断,然后执行中断处理程序。中断处理程序,将数据包推向上层协议栈。传统的IO方法是在中断处理函数中读取数据包。
NAPI 是 Linux 上采用的一种提高网络处理效率的技术。
采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据。虽然,读取数据不在中断中,并不意味着没有中断了。中断还是有的,并且还会触发中断处理函数。从 POLL 方法的本质意义上来说就在于尽量减少中断的数目,特别在于大量的小长度的数据包的时候,减少中断,以达到不要让整个操作系统花费太多的时间在中断现场的保护和恢复上,以便把赢得的时间用来在我网络层上的处理数据的传输。
例如在下面介绍的 8139CP 中断的处理过程中,目的就在于尽快把产生中断的设备挂在 poll_list,并且关闭接收中断,最后直接调用设备的POLL方法来处理数据包的接收,直到收到数据包收无可收,或者是达到一个时间片内的调度完成。
对于千兆网卡的具体的过程见转载的那篇文章。