UNIX下的5种IO模型

套接字的IO操作,如recvfrom,分为两个阶段:

(1)等待内核中的接收缓冲区中有数据可读。

(2)将接收缓冲区中的数据复制进应用缓冲区。

1,阻塞式IO

文件描述符open时,如果没有指定flags为O_NONBLOCK,或者open后,没有使用fcntl设置O_NONBLOCK,默认文件描述符为阻塞模式。

阻塞式IO在等待接收缓冲区数据到来时,会阻塞;

数据到来,进行数据复制时,也会阻塞。


阻塞式IO

2,非阻塞式IO

如上所述,可以通过open或者fcntl设置文件描述符为非阻塞模式。

非阻塞式IO,当内核缓冲区没有数据时,不会阻塞,会立即返回一个错误——EAGAIN或者EWOULDBLOCK。EAGAIN表示需要再次调用recvfrom,以判断数据是否准备好,这也是非阻塞式IO的用法,不断的调用recvfrom,以判断是否可以读。EWOULDBLOCK是虚拟语气,表示“本应该阻塞”,其实没有阻塞。由于并不确定返回EAGAIN还是EWOULDBLOCK,因此需要对这两个值都进行判断。

从接收缓冲区向应用缓冲区复制数据阶段,调用进程阻塞。


非阻塞式IO

3,IO复用

在阻塞式IO中,如果接收缓冲区没有数据,调用进程阻塞于recvfrom操作。使用select或者poll,可以在此情况下使进程阻塞于select或者poll操作(因此要把文件描述符设置为非阻塞式),而且可以同时检测多个文件描述符是否可读,即检测这些描述符对应的内核中的接收缓冲区是否有数据。

从接收缓冲区向应用缓冲区复制数据阶段,调用进程阻塞。


IO复用

4,信号驱动式IO

信号驱动式IO与上述三个IO模型相比,即不像阻塞式IO那样阻塞于recvfrom操作,也不像非阻塞式IO那样需要多次调用甚至轮询recvfrom才能得知是否有数据,也不像IO复用那样阻塞于select或者poll,而是当内核接收缓冲区有数据时向调用进程发送一个信号。

从接收缓冲区向应用缓冲区复制数据阶段,调用进程阻塞。


信号驱动式IO

5,异步IO

上述4种IO模型,其不同点在于当接收缓冲区没有数据时,如何判断数据已经到来:阻塞式IO中recvfrom会阻塞直到接收缓冲区有数据;非阻塞式IO通过轮询recvfrom以判断接收缓冲区是否有数据;IO复用中使用select或者poll以判断接收缓冲区是否有数据;信号驱动IO通过信号通知接收缓冲区是否有数据。

其相同点在于,IO操作的第二个阶段,即从内核接收缓冲区向应用缓冲区复制数据时,调用recvfrom的进程会阻塞。

可见,上述4种IO模型都会使进程阻塞,直到IO操作的两个阶段都完成才能执行其他操作,因此称为同步IO。

异步IO模型中,IO操作的两个阶段都不阻塞,因此称为异步IO。


异步IO

六、几种I/O模型的比较

前四种模型的区别是第一阶段,第二阶段基本相同,都是将数据从内核拷贝到调用者的缓冲区。而异步I/O的两个阶段都不同于前四个模型。

几种I/O模型的比较

同步I/O和异步I/O

a.同步I/O操作引起请求进程阻塞,直到I/O操作完成。异步I/O操作不引起请求进程阻塞。

b.我们的前四个模型都是同步I/O,只有最后一个异步I/O模型是异步I/O。

  • 举例

有一个钓鱼的例子经常被拿来比喻这5种IO模型,这里也不免俗套的讲一下:

阻塞式IO:老蒋钓鱼时把鱼竿伸进水中,需要一直守着鱼竿(第一阶段的阻塞),直到有鱼上钩了才拉杆(拉杆是第二阶段的阻塞);

非阻塞IO:老宋鱼竿有个功能,可以显示是否有鱼上钩(返回EAGAIN或者EWOULDBLOCK),因此他可以边和旁边的MM聊天,边看看是否有鱼上钩(轮询调用recvfrom);

IO复用:老孔的鱼竿和老蒋的一样,但他想了一个好办法,同时放了多个鱼竿,然后一直守着,一旦某个鱼竿上有鱼,马上将其拉起;

信号驱动IO:老陈很有钱,但又喜欢拉杆的快感,于是他雇了个人帮他守着,一旦那人发现有鱼上钩,马上通知老陈收杆;

异步IO:老刘也有钱,但很懒,直接雇了个人帮他钓鱼,一旦钓上了鱼就通知老刘。

目前很多成熟的高并发框架使用的基本都是IO多路复用并不是异步IO。因为异步IO编写复杂但性能上提升并不高。

IO多路复用三种技术迭代

image.png

image.png

image.png

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

推荐阅读更多精彩内容