Linux I/O通信模型总结
1)阻塞模型
2)非阻塞模型
3)I/0多路复用
4)信号量驱动I/0
5)异步I/0
阻塞模型
如上图所示,函数一直等待数据准备好,如果没有数据准备好,就一直阻塞,有数据到来,再把数据拷贝到应用层。这种i/o模型是最简单的但是很少在实际应用中使用。
非阻塞模型
如果该缓冲区没有数据的话,就直接给我返回,并且返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询,就是一直在检查这个状态,看内核是不是有数据到来调用。
多路复用模型
这种模型是现在最长用的(select poll epoll), 可以同时监听若干个fd,并根据fd状态变化做出相应响应。
信号驱动
异步模型
以上就是5种i/o 通信模型,最后一种应用很少,信号驱动我也没有实际应用过。
再实际的应用当中,肯定要和线程池,连接池等结合起来。
前四种模型均是同步的
同步异步概念上比较混乱,有些人喜欢将多路复用也认为是异步的。但是我认为,前四种应该都是同步的。(都需要等待数据从内核态拷贝到用户态,这个过程是阻塞的)。我认为,有些人认为是异步的应该是从请求处理并不是串行的返回这个角度说的,要是这样第二种模型配合多线程也是异步的了,不用纠结于概念吧
同步非阻塞多路复用应该是最常用的网络模型。
有趣有爱有价值:http://www.qihu100.com