初探 IO 多路复用

多路复用是什么

维基百科定义:
多路复用(Multiplexing,又称“多工”)是一个通信计算机网络领域的专业术语,在没有歧义的情况下,“多路复用”也可被称为“复用”。多路复用通常表示在一个信道传输多路信号数据流的过程和技术。因为多路复用能够将多个低速信道整合到一个高速信道进行传输,从而有效地利用了高速信道。通过使用多路复用,通信运营商可以避免维护多条线路,从而有效地节约运营成本

按技术分类和应用场景

  • 时分复用(TDM)TDM: T-1 有限线路 和 GSM 移动手机,STDM: LAN and 网络连接
  • 频分复用 (FDM)FM 调频收音机 有线电视
  • 码分复用(CDM)数字电视 收音机 3G蜂窝移动通信网
  • 空分复用(SDM)

工作过程

首先,各个低速信道的信号通过多路复用器(MUX,多工器)组合成一路可以在高速信道传输的信号。在这个信号通过高速信道到达接收端之后,再由分路器(DEMUX,解多工器)将高速信道传输的信号转换成多个低速信道的信号,并且转发给对应的低速信道。

IO 多路复用实现原理

select, poll, epoll 都是I/O多路复用的具体的实现,他们出现是有先后顺序的。
select是第一个实现,很快就暴露出了很多问题。

  • 会修改传入的参数数组
  • 任何一个sock(I/O stream)出现了数据,select 会返回,但不会告诉你是哪个sock上有数据
  • select 只能监视1024个链接
  • select 不是线程安全的

poll 修复了select的很多问题,比如

  • 去掉了1024个链接的限制
  • 不再修改传入数组

epoll 是I/O 多路复用最新的一个实现

  • epoll 现在是线程安全的
  • 不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据

epoll 的问题:只有linux支持。比如BSD上面对应的实现是kqueue。

select poll epoll 对比表格

epoll的性能几乎不受监测的fd数目的影响,且没有最大监测fd数量的限制,各方面性能明显优于select和poll,但是当这种情况下,epoll的性能并不会优于select和poll,甚至更差:在所有并发的连接中,全部连接都是活跃连接
所以:当监测的fd数目较小,且各个fd都比较活跃,建议使用select或者poll
当监测的fd数目非常大,成千上万,且单位时间只有其中的一部分fd处于就绪状态,这个时候使用epoll能够明显提升性能,比如ngix web服务器就是使用epoll实现的。

常用应用场景

  • 客户端要处理多个socket
  • 客户端同时处理连接和用户输入,比如聊天室
  • TCP服务器要同时处理监听socket和连接socket
  • 服务器同时处理TCP和UDP
  • 服务器要监听多个端口

与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

举例

  • I/O框架libevent
  • 基于libevent和协程的python网络框架gevent
  • python的高性能web框架tornado
  • redis文件事件处理器
  • nginx,apache事件模型

参考:
多路复用-维基百科
IO多路复用(IO Multiplexing)
IO 多路复用是什么意思? - 罗志宇的回答 - 知乎
I/O多路复用——概述与应用场景
基于表格形式的select,poll,epoll对比-IO多路复用函数的应用场景
Python之路【第七篇续】:I/O多路复用
multiplexing
Multiplexing: An Intro to How it Works
Chapter 6. I/O Multiplexing: The select and poll Functions

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

推荐阅读更多精彩内容