在看Linux的高并发编程的文章中,一些老手,甚至一些视频都,在谈到缓冲区,动不动就发送缓冲区,接收缓冲区,对于开始接触epoll的兄弟,来说虽然明白缓冲是什么事,如果不深层的去思考的兄弟肯定觉得自己听明白了,事后自己分析问题或者写代码却又觉得好像没听懂呀。在这里也不说epoll的所有内容,就说epoll中提到的缓冲区,是谁的缓冲区,放在哪的缓冲区,什么来,要去哪?“差点没问我是谁,我从哪来,我要到哪去?啧啧啧~~~“,缓冲区有应用缓冲区,有内核缓冲,能不能说清楚点,对于刚学epoll不了解是哪里的缓冲区,真痛苦!所以那时有谁只说发送接收缓冲区,得么的,一听只说缓冲区、缓冲区、缓冲区,我就想上去把这家伙捶一顿。好吧!舒服了!于是,开始走上自己”上下求索的路上“这条小路上了,首先把epoll数据流的脉络从内核到应用层理了一理。算了,说不说废话了,该交待原因了,下面要出招了!但生活就是这样,不交待点什么,直接进入主题,很容易让人不知道什么就把一下这个论点就出来了,兄弟也只得跟风讲点情调。下面就开始讲epoll中提到的接收、发送缓冲是什么玩意儿。(当然如果你是老鸟,大鸟,这篇文章对你没什么用,真的!真的!真的!就差点掏心窝出来了......不过,确实是。)
数据流的大致脉络:
1)发送本地数据 -> write -> 内核发送缓冲区 -> 网卡 -> 发送到远端(这里肯定涉及到数据链路层、路由器的传输数据,不展开也没法展开咱就这点货,哪敢展开,这里说发送到远端对理解epoll是够了的。); 对1)的操作过程:调用过程从左向右看,数据流过程也是从左向右看。
2)应用层接收远端数据 ->read -> 内核接收缓冲区 -> 网卡中有数据内核会将数据复制到内核接收缓冲区 -> 远端的数据;
对2)的操作过程:调用过程从左向右看,数据流过程从右向左看。
当然我们会定义自己应用层的接收缓冲区buf,也有应用的发送缓冲区,但对于epoll中接到的发送、接收缓冲区,是内核的发送及接收缓冲区。内核的,内核的,内核的!OK?! 有这个认识对于没读过linux内核的兄弟,应该也可以理解epoll中的缓冲区了。码去了,闪了!
ps:
1. 对于c++高并发的服务Windows下必言iocp,Linux必言epoll。