linux内核处理网络包并不如想象的那么快,且不说包经过内核的层次很多,内核中还有诸多的定时器,零拷贝技术,就是避免了数据包经过太多的拷贝,缩短时间。
网卡驱动收到包后,如果没有上层来取,如果持续发包,网卡或会丢弃或者出现包的淹没现象。
一般来说,都是生产者将包放到某个地方,然后消费者去取。一般的网卡驱动都是收包都是放到ring buffer,类似环形队列。消费者通过某些标识取走这些包。
网卡数据的流向,从网卡的内存到系统的物理内存,可以通过DMA的方式来转移,最后数据如果要做进一步处理,需要再将系统内存中的数据预取到Cache,这里可以是L1 Cache,L2 Cache,L0 Cache,CPU计算时,总是优先使用Cache,这里说的都是数据Cache,还有iCache,专门用来加载指令。
数据计算后,这个结果可能还要临时write-back系统内存,最后再从系统内存出去,可见处理器的一次能处理的数据多少,取决于Cache大小。
Cache的预取prefetcht0,prefetcht1,prefetcht2都是针对地址的进行的,完成之后,我们怎么才知道后续的代码真正使用的是Cache呢?
真正Cache的使用,在编程的层面是看不到的,只能说当使用同一个指针(也就是地址)去访问这部分数据时,就会使用这个Cache.
处理器会优先从Cache中查找,但是尚不清楚Cache的设计是否通过地址来作为Key来判断数据是否已经在Cache中。
以及Cache与系统物理内存的关联。
阅读(5078) | 评论(0) | 转发(0) |