5中I/O模型

输入操作包括两个阶段
1.等待网络数据到达,被复制到内核中的缓冲区
2.从内核缓冲区复制到进程缓冲区
5种I/O模型
1.阻塞式I/O:包含数据被复制到内核缓冲区和应用进程缓冲区两个过程,调用recvfrom,对应于阻塞式socket
2.非阻塞式I/O:不停的去轮询(polling)内核,如果有描述符准备好复制到进程缓冲区再调用recvfrom,对应于非阻塞式socket
3.I/O复用(select,poll):阻塞在select,polll系统调用,而不是真正的系统调用上,当select,poll返回时,再调用recvfrom复制数据
4.信号驱动式I/O:开启套接字的信号驱动I/O功能,调用recvfrom复制数据
5.异步I/O:当数据被复制到进程缓冲区通知我们,等于两部都完成了

1.2.3.4第一阶段部不同,但第二阶段相同,都要调用recvfrom复制数据。5两个过程都完成过了

同步I/O操作:导致请求进程阻塞,直到I/O操作完成

异步I/O操作:不导致请求进程阻塞

所以1.2,3,4以为真正的I/O操作recvfrom都要阻塞进程,所以同步I/O操作,5是异步I/O操作

/////////////////////////

select非阻塞式socket为啥比select阻塞式socket效率高:

当我们调用write时,如果此时发送缓冲区已满,则进程阻塞住,此时如果接收缓冲区有数据,我们无法读取

如果们处理read出来的数据比较慢时,此时write操作也会被阻塞住。

而非阻塞socket可以防止进程在做任何操作时发生阻塞,比如read操作没数据可读会返回错误码,write操作发送缓冲区满了,也是返回错误码。不会对其他的操作造成影响。

354.0s  停等版本

12.3s    select+阻塞i/o

6.9s    select+非阻塞i/o版本

8.7s    fork版本

8.5s    多线程版本

原文地址:https://www.cnblogs.com/zzyoucan/p/12020132.html