一文彻底搞定(阻塞/非阻塞/同步/异步)网络IO、并发编程模型、异步编程模型的爱恨情仇

概述

  是否和我有一样的困惑。什么阻塞IO、非阻塞IO、同步IO、异步IO,多路复用(epoll)等本质还是同步IO,这时可能你和我一样懵逼多路复用是同步的IO,那么使用epoll的nginx、redis、swoole等服务端程序又是异步的,这不前后矛盾么?网上文章又是五花八门,越看越糊涂。终于我无法忍受这样概念不清晰,乱麻一般的萦绕在我的心头。我决定要彻底拨开云雾见蓝天,啊!终于在一个阳光明媚的午后,就彻底顿悟了,这感觉如同德芙一般丝滑。今天就跟随我的步伐让你有丝滑一般的感觉,兄弟们走起来!!!!

网络IO

IO:IO是input/ouput英文缩写,顾名思义就是输入输出的意思,在计算中以CPU为视角,所有和外设(键盘、显卡、网卡、打印机的等)的数据操作都是涉及IO操作,外设流向CPU的是input,流向外设的就是ouput。网路IO就是网卡和CPU之间的数据交互
思考一个问题:网卡数据流向CPU都经过那些流程

数据流向示意图

用户进程发起一个网络IO操作的时候,大致上分为三个部分

  1. 用户进程读取数据,读取数据只会有三个可能(有数据、没有数据、出错)
  2. 网卡数据从网卡外设到内核空间(此过程现代计算机是不需要CPU参与,网卡控制器通过DMA技术直接搬运到内核空间)。数据完成空网卡控制器会发出中断信号。
  3. 数据到内核之后CPU负责复制(在此我们先不考虑零拷贝情况)到用户空间。

用户进程和内核交互围绕着1和3进行。到此在1和3环节就会有很多故事发生了。且听我慢慢道来!!!!

在给出分类之前我先抛出阻塞、非阻塞、异步、同步的定义,定义来自《UNIX 网络编程卷一 》的 6.2 章节
根据 POSIX 定义:

  • A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes(导致请求进程阻塞, 直到 IO 操作完成)。
  • An asynchronous I/O operation does not cause the requesting process to be blocked(不导致请求进程阻塞)。

上述定义是说:如果在1阶段系统挂起用户进程,那么该IO操作就是阻塞IO,反之不挂起,就是非阻塞IO。如果在2阶段系统挂起用户进程,那么这次IO操作就是同步,反之不挂起就是异步。

有了上述的定义,我们如何尚方宝剑一样,在也不担心傻傻分不清网络IO相关晦涩难懂的概念了。就如同初中老师教会我们如何判断什么是化学反应变化是物理变化,判断标准就是看有无新的物质生成。我们判断网络分类标准就是如上述的定义。对,就是这么狭义!!!

操作针对上述1和3处理行为,我们将网络IO分类下列5类。

  • 阻塞IO 此IO操作在1和3两个阶段,用户进程都在休眠状态
  • 非阻塞I/O 此IO操作在1阶段未被挂起,3阶段被挂起
  • 多路复用I/O 此IO操作在1阶段 (select,poll)被挂起、epoll未挂起,3阶段被挂起
  • 信号驱动I/O 此IO操作在1阶段未挂起,的数据到从网卡到内核之后,CPU通过信号机制通知用户进程。用户进程3阶段被挂起
  • 异步I/O 此IO操作在1和3阶段都不需要用户进程参与,数据拷贝完成后CPU会通知用户进程

此刻来一张很经典的图

image

IO对比图

从图中和上述定义就能看到真正的异步IO只有最后一个是。其余四个都是同步IO。对于同步和异步深入理解,其实在3这个阶段CPU需要拷贝数据到用户空间,等于用户进程切换到内核空间去执行拷贝操作,这个时候用户进程只能被挂起等待CPU拷贝数据直到完成。用户进程被挂起这段时间,用户进程的后续代码都是无法执行的只能同步等待。

并发编程模型

追求性能极致的程序员们,不遗余力地压榨CPU。基于系统提供的网络IO模型,人类设计出形形色色的并发模型。

  • 阻塞IO这种是完美无法提供并发的能力,只能串行的去处理客户端连接,所以网络IO就有了新的发展,进入到了非阻塞IO
  • 非阻塞IO 这种IO模型 就能设计出多线程、多进程并发模型
  • 多路复用 这便是并发能力秘密武器,基于这种网络IO 衍生出了 reactor反应堆并发模型,大名鼎鼎的nginx、redis就是reactor模型
  • 信号驱动和异步IO 暂时还未有更多的使用

异步编程模型

在上述的并发模型中其实单纯靠多进程和多线程,还无法达到人们的预期。所以就有了异步编程模型,异步编程模型的宗旨就是,用户程序调用同步的网络IO 模拟异步IO。人们经常说的异步IO更多指的是 异步编程模型(netty就是典型的异步IO)

在异步编程过有两个核心的技术技术回调和协程。

总结

并非同步IO就会性能差,异步IO就会性能好。要具体情况而定!!!

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

推荐阅读更多精彩内容