第十周学习报告
学习要点
Poll 函数,napi技术,interrupt coalescing机制
正文
Poll函数
poll提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息。
第一个参数是指向一个结构数组第一个元素的指针。每个数组元素都是一个pollfd结构,用于指定测试某个给定描述字fd的条件。
struct pollfd{
int fd; //descriptor to check
short events; //events of interest on fd
short revents; //events that occurred on fd
};
要测试的条件由events成员指定,而返回的结果则在revents中存储。
在napi中多次看到poll这个机制,先学习了下。Poll函数主要解决I/O复用,用到I/O复用的条件。
1. 一个客户同时处理多个描述符
2. 客户同时处理多个socket
3. TCP服务器同时处理监听端口和连接端口
4. 服务器同时处理TCP和UDP
5. 服务器同时处理多个服务或多个协议
Napi
传统的中断IO方法。
1. 网卡接收数据包
2. 将数据包DMA到环形数据缓冲区后,触发中断
3. 然后执行中断处理程序。
中断处理程序,将数据包推向上层协议栈。传统的IO方法是在中断处理函数中读取数据包。
NAPI 是 Linux 上采用的一种提高网络处理效率的技术。主要是看着流程图学习的。
采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据。虽然,读取数据不在中断中,并不意味着没有中断了。中断还是有的,并且还会触发中断处理函数。从 POLL 方法的本质意义上来说就在于尽量减少中断的数目,特别在于大量的小长度的数据包的时候,减少中断,以达到不要让整个操作系统花费太多的时间在中断现场的保护和恢复上,以便把赢得的时间用来在我网络层上的处理数据的传输。
例如在下面介绍的 8139CP 中断的处理过程中,目的就在于尽快把产生中断的设备挂在 poll_list,并且关闭接收中断,最后直接调用设备的POLL方法来处理数据包的接收,直到收到数据包收无可收,或者是达到一个时间片内的调度完成。
1. 网卡中断 关闭网卡接收中断,将设备挂在poll的队列上。
2. 对于网卡接收到包后
1> 检查网卡的环形队列rx_ring有需要处理的数据吗,这是一个阻塞。
2> 如果有数据就把数据sk_buffer提交到网络层,清除物理映射
3> 创建新的缓存,放到rx_ring的队列上,并且准备让网卡进行dma传输
4> 检查是否有新的数据包到来,如果有就一直放到队列上(可能使得内存溢出,如果包是不停的接收);没有包后把设备从poll队列中删除。
3. 对于软中断
1> 要在一个时间片和最大的限额内完成任务
2> 调用网卡的poll方法获得数据
由于时间比较紧,晚上基本没有时间到实验室,没有在千兆的网卡具体看过。只是了解了一下流程。
Interrupt coalescing
Interrupt coalescing is a feature implemented in today's network adapters to help mitigate interrupt overhead in Gigabit-network hosts. In interrupt-coalescing mode, a single interrupt is generated for multiple incoming packets. This is opposed to normal interruption mode in which an interrupt is generate for every incoming packet. It is widely asserted that interrupt coalescing decreases interrupt overhead at the expense of latency.
普通中断就是将原来是一个包过来一个中断
中断结合是多个包过来后才会一个中断,可以降低中断产生的开销
这是对于网卡的一个技术,我这个的资料找到的很少。