输入操作包括两个阶段
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 多线程版本