【高性能网络编程】基础知识2 IO多路复用与Reactor 模式

对比几种不同的 IO

  1. 阻塞IO

    应用进程被阻塞,直到数据从内核缓冲区复制到应用进程缓冲区中才返回。
    特点:阻塞进程,CPU 利用率高

  1. 非阻塞IO
    应用进程执行系统调用之后,内核返回一个错误码。应用进程可以继续执行,但是需要不断的轮训(增加了系统调用)来获知 I/O 是否完成。
    特点:不阻塞进程,轮训增加了 CPU 消耗

  2. IO复用

    单个进程可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时,把数据从内核复制到进程中。
    特点:阻塞进程,无轮训 CPU

  3. 异步 I/O

    应用进程执行阻塞的调用会立即返回,应用进程可以继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。
    特点:不阻塞进程,无轮训 CPU

同步IO 与 异步IO

同步与异步体现在 内核态到用户态的数据拷贝 是否阻塞等待
IO复用 非异步IO,只是允许等待的 fd事件 变多了

  • 同步IO:包含阻塞IO非阻塞IOIO复用
  • 异步IO:即异步IO

需要注意IO复用本质是 同步IO

IO多路复用
异步IO

Epoll 与 Select

fd :文件描述符

Select

  1. 描述符有限,最大值 1024
  2. 查询 fd 均遍历数组,O(n) 复杂度
  3. 轮训就绪状态的 fd 均需要传入所有 fd
  4. 每次轮训传入fd 都会触发用户态到内核态的拷贝

Epoll

  1. 描述符无限制
  2. fd 存放结构为红黑树,就绪 fd 事件触发回调插入就绪链表,读写 fd 事件的性能 O(logN),查询就绪 fd 事件性能 O(1) (直接读取就绪链表)
  3. 通过就绪链表存放就绪状态的 fd 事件,查询时直接返回就绪链表
  4. 红黑树与就绪链表直接存放内核态中,避免了用户态与内核态间的大量拷贝 (epoll_wait 拷贝少量就绪 fd 句柄)

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);

// epoll_create 创建 epoll,设定 fd 数量(内核开辟存储空间)
// epoll_ctl 管理 fd 事件的监控(红黑树的插入/删除)
// epoll_wait 返回相应就绪的事件的 fd(内核态向用户态拷贝就绪链表内的就绪事件)
epoll

LT 与 ET

  • LT(水平触发):epoll_wait 不会删除就绪链表,每次 epoll_wait 均返回
  • ET(边缘触发):epoll_wait 后会删除就绪链表
ET 下读写方式:
    只要可读,就一直读,直到读完或失败
    只要可写,就一直写,直到数据发送完或失败

【经典问题】
1. LT 下 ‘可写就绪’ 一直触发,怎么解决
    要写数据时,添加fd可写事件通过 epoll_crt 添加到epoll里,写完后移除。
2. TCP accept 
    接收到连接到达时, while(accept) 循环处理所有连接,避免连接丢失

Reactor

反应堆模式
也叫 Dispatcher 模式,即 I/O 多路复用监听事件,收到事件后,根据事件类型分配(Dispatch)给某个线程。

单 Reactor 单进程 / 线程

只适用于业务处理非常快速的场景,不适用计算机密集型的场景。需要 handler 尽量快速地执行处理,否则会影响吞吐。

  • Reactor 对象的作用是监听和分发事件;
  • Acceptor 对象的作用是获取连接;(连接建立的事件,则交由 Acceptor 对象进行处理)
  • Handler 对象的作用是处理业务;(不是连接建立事件, 则交由当前对应的 Handler 来处理)
单 Reactor 单进程 / 线程

单 Reactor 多进程 / 线程

事件处理由 worker 线程池负责,解决了单线程下 handler处理耗时导致吞吐降低的问题。
但还存在大并发量情况下 dispatch 速率影响吞吐的问题。

单 Reactor 多进程 / 线程

多(主从) Reactor 多进程 / 线程

Reactor 只负责 dispatch 事件,因此为了充分利用cpu,可以通过多 Reactor 并行 dispatch。
主从 Reactor,主负责建立连接(处理accept),子 Reactor 负责 dispatch 事件到 worker 线程池

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

推荐阅读更多精彩内容

  • 1.Linux网络IO模型 在linux系统中所有的外部设备的操作都可以看作是一个文件操作,linux对文件操作的...
    daof阅读 4,831评论 0 1
  • 1.Java IO读写原理 无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底...
    飘渺丶_3c75阅读 4,881评论 0 9
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,505评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,165评论 4 8
  • 怎么对待生活,它也会怎么对你 人都是哭着来到这个美丽的人间。每个人从来到尘寰到升入天堂,整个生命的历程都是一本书,...
    静静在等你阅读 4,947评论 1 6