PHP FPM源代码反刍品味之二:IO多路复用

基础:操作系统IO多路复用机制。

IO多路复用机制,常见的实现方法有select,poll,epoll,kqueue.
IO多路复用是服务器程序开发的核心,也是研究服务器程序源代码的基础。
这里做个简单的介绍。

这里试图用非程序的方式来说明这个机制。

举个例子:

办公室有3个可加热饮料机,分别提供橙汁,茶水,豆浆。
饮料机有一个指示灯,红色表示正在加热,绿色表示完成加热。
有3个水壶用于装热饮,这里假设,水壶容量很大,饮料机要多次加热才能装满一壶。
会议室要开会,任务:接满3水壶加热完成的饮料到会议室备用。

问题:怎么接满三水壶热饮?

(这个问题也太简单了吧,有必要讨论吗?)

办法一
先拿个一水壶接橙汁,指示灯为红色时等待,绿色时接,饮料机多次加热,多次等待,等接满一壶后,在同样的一次接满茶水,豆浆。
这个办法很简单,只需依次等待。
当我们会发现,在等待橙汁加热的时候,茶水和豆浆可能已经加热就绪了。

于是我们改进了这个办法。

办法二
同时监控3个饮料机的指示灯,哪个灯变绿,就去接哪个。
这样效率提高了很多。

细节上看,办法一很简单,只需依次操作。
办法二,减少了等待时间,多了一个监控工作。

这里还有个饮料机列表的概念,和饮料机添加,移除操作。
即需要哪些饮料机,和需求变动的操作。
以上例子,我们需求是橙汁,茶水和豆浆,如果需求变动,需要加入牛奶或者不需要豆浆。
办法一和办法二的饮料机列表要做调整,这一点两者是类似的。

但是办法二也有不足的地方:需要时时查看指示灯的状态。
只有3个饮料机的情况,不易察觉这个过程,试想如果有1000个饮料机,我们要挨个查看这1000个指示灯。

于是我们改进了这个方法。

办法三
每个饮料机加个声音提示功能,即加热完成后声音提醒一下。
这样的好处是在多个饮料机的情况下,我们不用时时检查每个指示灯的状态。
从主动检查变成被动提醒的改进,大大提高了效率。这就是传说中的基于事件的IO多路复用机制
现在我们感觉良好了,当还有改进的地方,

试想下,如果天气寒冷,电力不足,饮料加热很慢。
即使我们同时监控3个饮料机,也会等待很久,即长时间没有任何一个加热就绪的信号。
同时我们还有其他任务,诸如打印报表,准备投影仪等。

聪明的人变想到,不能这样一直等下去,等一会儿,饮料机没动静,就去做其他事,其他事做好了,再过来接饮料。
这里引入了一个超时的概念,即一次等待最长的时间。(当然,可以设定不超时)

加入了超时支持,办法三的效率就更高了,这也是现在多数服务器程序的机制。

整个举例中有个隐含的要求就是,一个水壶不能同时装两种饮料。
即一个水壶一次只能装同一种饮料,橙汁和茶水不能混在一起。
这话似乎有些多余,橙汁和茶水混在一起是很显然的错误。

对于程序开发,这个错误却很容易发生 .
所以这里做个提醒: 橙汁和茶水必要混在一起,味道不好。

以上为日常例子,现在回到技术:
一个饮水机的水龙头相当于一个输入的文件句柄(fd),
指示灯变绿,句柄可读信号。
水壶表示缓冲(BUFFER)
这个例子以输出为例,输入的情况类似。

办法二对应与select方法,也可以加入超时设置。这个方法因为效率不高,已被epoll或kqueue取代,
一些开源软件在windows下面使用这个方法。
办法三对应于epoll,kqueue方法,因为高效,分别在Linux和FreeBSD平台广泛使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,192评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,186评论 1 303
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,844评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,471评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,876评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,891评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,068评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,791评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,539评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,772评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,250评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,577评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,244评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,146评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,949评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,995评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,812评论 2 276

推荐阅读更多精彩内容

  • 服务器程序绕不过对操作系统IO事件机制(多路复用)的使用,不同的操作系统,支持不同的IO事件机制,linux 支持...
    黄洪清阅读 1,390评论 0 2
  • 我看那火焰 炫丽多姿 让人晕眩 你不顾一切向前 不是被摧残 便是涅盘
    一六行阅读 285评论 0 1
  • 既然忘不掉,这样也好,平静的相处,像朋友一样 虽然我很想把你的头像抠下来,也想让你换掉,可是,立场呢? 自求多福吧...
    lucky21阅读 181评论 0 0
  • 2017.6.30 2017年上半年的最后一天,在公司加班到十点钟,回到家十一点。 为了少走路,早点到家,想着从对...
    热闹且孤独阅读 453评论 0 0
  • 公元2017能量世界75天 1我怎么如此幸运早上起床与身体沟通,会在10分钟起床。放着音乐激活细胞 2我怎么如此幸...
    史德波阅读 304评论 0 0