`

(收藏)理解 I/O 多路复用 select/poll/epoll

 
阅读更多

https://huanxi.pub/2017/01/28/io%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E7%90%86%E8%A7%A3/
前段时间看了下 NIO ,发现里面有个 I/O 多路复用技术,但是听到这个名字一直觉得难以理解,什么是多路复用呢?好奇怪的名词,于是专门找了个时间仔细去了解了下。

客栈遇到的问题

从开始学习编程后,我就想开一个 Hello World 餐厅,由于一开始资金不足,所以只能开一个古老的小客栈。

客栈运营了几天,我发现我们的客栈存在着一个问题

我们的厨师只负责炒菜,炒好了放在一边继续炒其他菜,所以店小二必须经常进出厨房,一方面看看菜到底炒好了没有,如果炒好的话,就要把菜端出来,另一方面他必须得站在外面等候客人的其他需求。并且重要的是只有一个小二,他同时只能服务一个客人,其他客人必须等待
在客栈客人少的时候问题还不明显,有时候突然来个十几个客人,看到没人招待他,掉头就走了。

第一个解决方案(多线程)

给每一位顾客配备一名店小二。
这样一来,每一个顾客都有专门的小二负责,厨师一炒好菜,小二就将菜第一时间送到客人桌上,这样一来,客人的体验提升了很多,大家都非常满意,我客栈的名声也越来越好。

随着名声越来越好,客人也越来越多,渐渐地我发现,好像有什么地方不对。

随着客人越来越多,我必须招更多的店小二,支付更多的费用在小二身上,我发现,有时候付给员工的费用都比我赚的还多
第二个解决方案(select)

我将客栈进行改造,按照桌数区分,分为 1 2 3 4 四个区,每个区招一名店小二,来服务所在区的客人,并且对厨师进行了简单的培训,让他再炒好菜后大喊一声,有菜炒好了
这次简单升级后,我的客栈现在只有 4 个小二了,每个小二负责自己的区域,并且厨师炒好菜后,他大喊一声,来来来,菜炒好了,然后比如小二 1 号进入厨房,把菜端到他对应的区域挨个问,这菜是谁点的。

随着我的客栈越来越大越来越大,为了节省成本,我并没有再招更多的小二,依然是那四个小二。

直到有一天,1 区的客人爆满,达到了 1024 个了,那一天,我看着 1 区的小二每一次上菜几乎都是跑的,并且他告诉我,如果再多来一个客人,他就要挂了。
第三个解决方案(poll)

好吧,那个小二体力上好像跟不上节奏,所以我派人连夜赶工做了传说中的木牛流马来当店小二,这样一来,即使是 10240 个客人,一个木牛流马就 hold 住了
人数上限问题已经解决了,但是现在依然存在问题。

由于人数太多,每次要将做好的菜送到对应的客人桌上,必须挨个询问过去,这个步骤太慢了,很多次客人都不愿意等待而走掉了。
最终解决方案(epoll)

对木牛流马进行加工,使其可以记录每一个客人点的菜,然后厨师炒好菜后,只要报上菜名,木牛流马根据记录的订单,自动就将对应的菜端到客人桌中
有了这个解决方案,那么当一盘菜炒好后,就不必挨个确认是谁的菜了,如果新来了客人,同样只要记录下客人的菜单,提交给厨师,然后木牛流马又可以去招待其他客人了,当菜炒好后,直接就将菜送到客人那里了。

至此,生意兴荣,长盛不衰。

总结

select

只能监听 1024 个链接
并且没有返回具体可使用的 socket ,得挨个遍历
线程不安全
poll

没有链接数限制
依然线程不安全
epoll
解决了 select poll 的问题,并且指定了 socket 回调
分享到:
评论

相关推荐

    Linux网络编程,包括tcp/upd,select/poll/epoll/pdf

    其中select/poll/epoll都是常用的多路复用技术,它们可以同时监视多个文件描述符,实现高效的I/O复用。 总之,Linux网络编程是一项重要的技能,它涉及到网络通信的基本原理以及多路复用技术的使用,对于开发网络...

    网络io与io多路复用select/poll/epoll 服务器并发代码实现

    网络io与io多路复用select/poll/epoll 服务器并发代码实现

    select、poll、epoll的区别使用示例代码

    Linux系统编程——I/O多路复用select、poll、epoll的区别使用,相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45745887

    linux内核select/poll,epoll实现与区别

    select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll是从select/poll扩展而来,主要是为了解决select/poll天生的缺陷。 epoll在...

    socket网络编程-epoll-水平触发和边缘触发源码

    传统的select、poll也是I/O多路复用技术,但这2种技术受内部实现的限制,不支持高并发,如同时连入超过1000个客户端,性能就会明显下降。(epoll技术从linux内核2.6开始引入的)。 (2)epoll技术的性能,可以说...

    多路复用之select、poll、epoll的区别

    无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。而如果你想我一样从2.5内核就关注epoll的话,一定...

    本项目包括利用多线程、select、poll以及epoll实现的并发处理连接请求

    这两类都要使用到IO多路复用,O多路复用是指单个进程/线程就可以同时处理多个IO请求。有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间...

    IO多路复用之epoll——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    Libevent网络库

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    libevent-2.0.22 for linux 下载

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    libevent源码

    Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    从一万英尺外看 Libevent

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    libevent-2.0.10-stable.tar.gz

    libevent gz包 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    select poll epoll 代码实例

    select poll epoll 代码实例

    IO多路复用之poll——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    IO多路复用之select_poll_epoll详解1

    2. Re:络通信 --> IO多路复之sel 3. Re:络通信 --> IO多路复之sel 3. 络通信 --> IO多路复之selec 4. 数据库 --

    libevent_源码剖析

    支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。 Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 ...

    EPOLL模型:关于并发连接的处理

    Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。 1、为什么select落后  首先,在Linux内核中,select所用到的FD_SET是有限的,即内核...

    libevent参考手册(中文版P

    * 支持多种 I/O多路复用技术, epoll、poll、dev/poll、select 和kqueue 等; * 支持 I/O,定时器和信号等事件; libevent有下面几大部分组成: * 事件管理包括各种IO(socket)、定时器、信号等事件,也是...

Global site tag (gtag.js) - Google Analytics