几种IO

https://zhuanlan.zhihu.com/p/23488863

https://bbs.csdn.net/topics/391834553

以socket.read()为例子:

传统的BIO里面socket.read(),如果TCP RecvBuffer里没有数据,函数会一直阻塞,直到收到数据,返回读到的数据。

对于NIO,如果TCP RecvBuffer有数据,就把数据从网卡读到内存,并且返回给用户;反之则直接返回0,永远不会阻塞。

最新的AIO(Async I/O)里面会更进一步:不但等待就绪是非阻塞的,就连数据从网卡到内存的过程也是异步的。

换句话说,BIO里用户最关心“我要读”,NIO里用户最关心"我可以读了",在AIO模型里用户更需要关注的是“读完了”。

tcp协议栈中的接收缓冲区需要用setsockopt()的SO_RCVBUF来设置。系统默认的缓冲区大小一般来说就够用了。设置太大没什么用,网卡速度也是有限的,就算1000Mbps的网卡,除去以太网帧、ip帧头、tcp帧头等,实际的传输率也就是70、80MB/s。接收满64k差不多1ms,对于现代的cpu来说,根本不是事。也就是说,根本到不了64k的时候,就可以把缓冲区中的数据取走


恩,我指的就是recv()用到的接收缓冲区

 我用16384


 

其实你说的这个buffer和tcp基本 没有什么关系,这个就是应用程序 的buffer了。

这是用来做内存copy操作的。

给个1024就行了,这个操作主要由cpu和内存速度决定的,它们的速度肯定会比网速快,只要不是极端的,像只分配一二个字节来拷贝,随意分配一个2的n次方值就行,基本不会因为它而影响网速的。

tcp 的buffer是由SO_RCVBUF 设置的,用来设置tcp缓冲区的大小。
recv函数的buffer是从缓冲区取出数据后放在那里。

tcp的缓冲区会影响网络速度。
 但recv函数的buff显然不会。

猜你喜欢

转载自blog.csdn.net/u010287873/article/details/82383980