IO多路复用-个人理解

作者:王伟豪
链接:http://www.zhihu.com/question/32163005/answer/55111082
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

简单的说下自己的理解
io分为磁盘io和网络io,这里说的是网络io。我们知道计算机之间传输数据是流传输。一台计算机网络io只会有一个。

这里说单进程
在最基本的c/s demo中,send/recv就是在一条io通道收发数据,这就是基本的网络io,但是这种操作是不能“填满”io的,也就是说大部分io资源你没有用,仅仅有一个io操作,当然你可以开多进程或多线程,代价可想而知

此时出现了io多路复用,自己的话翻译一下,复用网络io从而有多个io操作能在网络io中执行。

linux下网络io使用socket套接字来通信,普通io模型只能监听一个socket,而io多路复用可同时监听多个socket

io多路复用避免阻塞在io上,原本为多进程或多线程来接收多个连接的消息变为单进程或单线程保存多个socket的状态后轮询处理

实现io多路复用需要函数来支持,就是你说的linux下的select/poll,epoll以及win下 iocp 和 BSD 的 kqueue

至于它们有什么区别,网上有很多了。
如果楼主看不懂它们的区别,建议查查资料或者看看apue或unp的相关章节弥补一下不理解的部分。

简单说epoll和select/poll最大区别是
1.epoll内部使用了mmap共享了用户和内核的部分空间,避免了数据的来回拷贝
2.epoll基于事件驱动,epoll_ctl注册事件并注册callback回调函数,epoll_wait只返回发生的事件避免了像select和poll对事件的整个轮寻操作。

nginx中使用了epoll,是基于事件驱动模型的,由一个或多个事件收集器来收集或者分发事件,epoll就属于事件驱动模型的事件收集器,将注册过的事件中发生的事件收集起来,master进程负责管理worker进程

猜你喜欢

转载自zhongmin2012.iteye.com/blog/2315826