最快理解 - IO多路复用:select / poll / epoll 的区别.
客栈遇到的问题
从开始学习编程后,我就想开一个 Hello World 餐厅,由于一开始资金不足,所以只能开一个古老的小客栈。
客栈运营了几天,我发现我们的客栈存在着一个问题
我们的厨师只负责炒菜,炒好了放在一边继续炒其他菜,所以店小二必须经常进出厨房,一方面看看菜到底炒好了没有,如果炒好的话,就要把菜端出来,另一方面他必须得站在外面等候客人的其他需求。并且重要的是只有一个小二,他同时只能服务一个客人,其他客人必须等待
在客栈客人少的时候问题还不明显,有时候突然来个十几个客人,看到没人招待他,掉头就走了。
第一个解决方案(多线程)
给每一位顾客配备一名店小二。
这样一来,每一个顾客都有专门的小二负责,厨师一炒好菜,小二就将菜第一时间送到客人桌上,这样一来,客人的体验提升了很多,大家都非常满意,我客栈的名声也越来越好。
随着名声越来越好,客人也越来越多,渐渐地我发现,好像有什么地方不对。
随着客人越来越多,我必须招更多的店小二,支付更多的费用在小二身上,我发现,有时候付给员工的费用都比我赚的还多
第二个解决方案(select)
我将客栈进行改造,按照桌数区分,分为 1 2 3 4 四个区,每个区招一名店小二,来服务所在区的客人,并且对厨师进行了简单的培训,让他再炒好菜后大喊一声,有菜炒好了
这次简单升级后,我的客栈现在只有 4 个小二了,每个小二负责自己的区域,并且厨师炒好菜后,他大喊一声,来来来,菜炒好了,然后比如小二 1 号进入厨房,把菜端到他对应的区域挨个问,这菜是谁点的。
随着我的客栈越来越大越来越大,为了节省成本,我并没有再招更多的小二,依然是那四个小二。
直到有一天,1 区的客人爆满,达到了 1024 个了,那一天,我看着 1 区的小二每一次上菜几乎都是跑的,并且他告诉我,如果再多来一个客人,他就要挂了。
第三个解决方案(poll)
好吧,那个小二体力上好像跟不上节奏,所以我派人连夜赶工做了传说中的木牛流马来当店小二,这样一来,即使是 10240 个客人,一个木牛流马就 hold 住了
人数上限问题已经解决了,但是现在依然存在问题。
由于人数太多,每次要将做好的菜送到对应的客人桌上,必须挨个询问过去,这个步骤太慢了,很多次客人都不愿意等待而走掉了。
最终解决方案(epoll)
对木牛流马进行加工,使其可以记录每一个客人点的菜,然后厨师炒好菜后,只要报上菜名,木牛流马根据记录的订单,自动就将对应的菜端到客人桌中
有了这个解决方案,那么当一盘菜炒好后,就不必挨个确认是谁的菜了,如果新来了客人,同样只要记录下客人的菜单,提交给厨师,然后木牛流马又可以去招待其他客人了,当菜炒好后,直接就将菜送到客人那里了。
至此,生意兴荣,长盛不衰。
总结
select
只能监听 1024 个链接
并且没有返回具体可使用的 socket ,得挨个遍历
线程不安全
poll
没有链接数限制
依然线程不安全
epoll
解决了 select poll 的问题,并且指定了 socket 回调
摘自: https://jackyrong.iteye.com/blog/2354925
最快理解 - IO多路复用:select / poll / epoll 的区别.的更多相关文章
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- Linux IO多路复用 select/poll/epoll
Select -- synchronius I/O multiplexing select, FS_SET,FD_CLR,FD_ISSET,FD_ZERO #include <sys/time. ...
- python网络编程——IO多路复用select/poll/epoll的使用
转载博客: http://www.haiyun.me/archives/1056.html http://www.cnblogs.com/coser/archive/2012/01/06/231521 ...
- Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
- 【操作系统】I/O多路复用 select poll epoll
@ 目录 I/O模式 I/O多路复用 select poll epoll 事件触发模式 I/O模式 阻塞I/O 非阻塞I/O I/O多路复用 信号驱动I/O 异步I/O I/O多路复用 I/O 多路复 ...
- select.poll,epoll的区别与应用
先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...
- I/O多路复用select/poll/epoll
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个.因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll.现代操作系统中,线程数已经得到了 ...
随机推荐
- AC自己主动机模板(数组实现版)
BY 九野 做了一道题,用我的那种写法华丽丽的超时了.,无奈学一学数组实现的 #include<stdio.h> #include<string.h> #include< ...
- linux下select,poll,epoll的使用与重点分析
好久没用I/O复用了,感觉差点儿相同都快忘完了.记得当初刚学I/O复用的时候花了好多时间.可是因为那会不太爱写博客,导致花非常多时间搞明确的东西,依旧非常easy忘记.俗话说眼过千遍不如手过一遍,的确 ...
- MyBatis中sqlSession操作数据库,不报错但无法实现数据修改(增、改、删)
public void addCustomerTest() throws Exception { SqlSession sqlSession = MyBatisUtils.getSession(); ...
- Android的编译环境--Build系统【转】
本文转载自:http://blog.csdn.net/kitty_landon/article/details/60764232 Android是一个庞大的系统,包含太多的模块,各种模块的类型也有10 ...
- 读懂diff【转】
本文转载自:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html 读懂diff 作者: 阮一峰 日期: 2012年8月29日 d ...
- python程序中用类变量代替global 定义全局变量
在python编程中,一般使用global 关键字来定义全局变量,但是发现 global 关键字在涉及多个文件时,好像存在问题. 比如,单个文件下用global定义使用全局变量的情况 ,看下面的代码 ...
- php对文件/目录操作的基础知识(图解)
具体的如下图所示:
- python-sqlite3事务
sqlite3事务总结: 在connect()中不传入 isolation_level 事务处理: 使用connection.commit() #!/usr/bin/env python # -*- ...
- IP地址与十进制相互转换
1.IP 转成10进制 function ipToInt(ip){ var REG =/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4] ...
- EditPlus代码自动完成的设置
EditPlus代码自动完成的设置保存在 *.acp 文件中,可以在“工具”->“首选项”->“文件”->“文件类型及语法”中(如下图) 其中“语法文件”保存着进行语法高亮的关键词, ...