0

对于在应用层使用recv的时候,是网卡层将数据拷贝到系统的一个缓冲区,而我们仅仅是去读取这个缓冲区,读取之后,系统再为我们删除。 这样无疑就有如下操作:

引用
1:我们使用一个方式去轮训或者其他方法去查看是否有缓冲区可读
2:将内核缓冲区数据拷贝到用户态缓冲区
3:删除内核缓冲区数据



在 九剑的 Linux内核分析的文章中,了解到一些相关信息,这里我按照自己的理解来描述一下,并不一定准确。

在轮训的时候,如果数据匮乏,会出现大量的轮训查询,对于系统来说,无疑是一个巨大的资源浪费,当然我们可以联想到DMA技术,让网卡从主存中直接读取数据并操作主存,这样就将CPU解放出来

引用
1、首先,内核在主内存中为收发数据建立一个环形的缓冲队列(通常叫DMA环形缓冲区)。
2、内核将这个缓冲区通过DMA映射,把这个队列交给网卡;
3、网卡收到数据,就直接放进这个环形缓冲区了——也就是直接放进主内存了;然后,向系统产生一个中断;
4、内核收到这个中断,就取消DMA映射,这样,内核就直接从主内存中读取数据;


另外发送数据的时候,同样是一个将数据拷贝到缓冲区的过程,而如果发送机制ACK确认,就将该缓冲区删除。另外有一些Socket选项,可以设置不适用内核缓冲区,直接使用用户态缓冲区,从理论来说,的确可以得到一定的优势,因为减少了很多操作过程。不过从安全角度考虑,我觉得这容易造成一个潜在的安全危险。

Tags: , , , | 引用(0)
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]