Java NIO(一)-I/O模型: 阻塞、非阻塞、I/O复用、同步、异步

目的##

为后期学习 Netty框架打好理论基础,并且在分布式RPC 服务中对客户端与服务端之间服务的调用,底层数据通讯可以使用Netty 进行封装。

记录结构##


今天记录I/O模型中的阻塞、非阻塞、I/O复用、同步、异步。

混沌的概念##

对于上述四种概念,常常使我陷入混沌,我经常这样想同步不就是阻塞的么?异步不就是非阻塞的么?
我也会去看下别人写的博客以验证我的想法是正确的,事实上,大多博客也这样举例子:同步类似于你叫某人吃饭,某人不应答你,你就一直等着他,这期间你什么事情都不能做,也就是说你在等待某人去吃饭这个时刻内一直都是阻塞的。
针对于上述的举例,我一直深信不疑,一句话,没毛病

但直到我看到UNIX 网络编程之后,才发现理解有偏差,起码我之前的理解是将I/O操作中的概念结合起来记忆。即:同步==阻塞 异步==非阻塞。

但其实,以上的记忆有点以偏概全,或者说根本没有清晰的认识。

话不多说,开始记录。

1. 明确I/O考察的对象和流程##


1.1 参考Unix网络编程,一个输入操作通常包括两个不同的阶段:

  • 等待数据准备好;
  • 从内核向进程复制数据。

1.2 对于一个套接字的输入操作:

  • 通常涉及等待数据从网络到达,当所等待分组到达时,被复制到内核的某个缓冲区;
  • 把数据从内核缓冲区复制到应用进程缓冲区。

注意: 理解上述两个不同阶段对于后续理解I/O模型尤其是非阻塞I/O与同步I/O关系十分必要。

2. I/O模型##


2.1 阻塞式I/O模型
阻塞式I/O是最流行的I/O,也是所有套接字默认的I/O。Java BIO中对socket 网络数据通信的
封装 就采用的是这种方式。当然效率也是低下的。

阻塞式I/O是最流行的I/O,也是所有套接字默认的I/O。

阻塞式I/O.png

(注:所有图片来源 Unix网络编程卷1,第三版)

如图所示,进程调用recvfrom系统调用,直到网络数据报到达且被复制到应用进程缓冲区中或发生错误才返回。

注意:也就是说,进程从调用recvfrom开始到返回的整个时段都是阻塞的(上述1.1两个阶段都是阻塞),recvfrom成功返回后,应用进程才开始处理数据报。

上述的注意读三遍

2.2 非阻塞I/O模型
直接上图:

非阻塞式I/O

如图所示,不同于阻塞式I/O,非阻塞I/O在第一阶段数据没有准备好的时候,不阻塞,而是直接返回一个错误(EWOULDBLOCK)。

所以一般采用轮询(polling)的方式,应用进程持续轮询内核,查看数据是否准备好。当数据准备好时,被复制到应用进程缓冲区(第二阶段)。

注意:值得注意的一点是,当第一阶段数据准备完成后,进入第二阶段,内核向内存的复制。这一阶段仍然是阻塞的,这对于后续理解非阻塞与同步的关系十分重要。

上述注意项读三遍。

2.3 I/O多路复用模型
I/O复用最常见的就是select和epoll,其阻塞发生在上述两个系统调用之一,而不是真正的I/O系统调用上。 Java NIO 对TCP 网络通信的封装内部采用的就是这种原理。

I/O复用模型.png

当用户进程调用了select,那么整个进程会被阻塞与select。内核会“监视”所有select负责的套接字,当任何一个套接字中的数据准备好了,select就会返回。(进程阻塞)

这时候进入第二阶段,完成内核向内存的数据复制。(进程阻塞)

注意:I/O复用的优势在于同时等待多个描述符就绪,单就一个描述符可言,其没有优势,反而还会因为多一次select系统调用存在劣势。

上述注意项读三遍。

2.4 异步I/O模型
异步I/O的工作机制是告知内核启动某个操作,并让内核在整个操作(包括第二阶段数据从内核向内存的复制)完成后告知我们。

如下图所示:

异步I/O 模型.png

注意:异步I/O要通过调用特殊API实现(如POSIX的aio_read),可以看出,其在两个阶段都是没有对于用户进程的阻塞的,依靠信号通知进程整个过程完成。

上述注意读三遍

2.5 同步、异步与阻塞、非阻塞、I/O复用的关系
在了解了阻塞式I/O、非阻塞式I/O、I/O多路复用、异步I/O后我们看下这几个模式的I/O模型与同步异步模型有什么关系。
注意:重头戏,接下来就是彻底领悟这几个概念之间关系,让你不再混沌,请保持接受状态,保持信心看下去。

首先先来再明确一下同步、异步I/O之间的区别。
书中所述,POSIX把两种术语定义如下:
同步I/O:导致请求进程阻塞,直到I/O操作完成;(两个阶段(等待网络数据到达内核空间缓存区域,以及将内核空间缓存区域中的数据复制到用户进程缓存中)中只要有一个阶段阻塞,那整个I/O操作就就是同步)
异步I/O:不导致请求进程阻塞。 (两个阶段都不阻塞,那么就是异步I/O)

注意:所以说,阻塞式I/O, 非阻塞I/O, I/O复用由于都导致了请求进程阻塞,所以均属于同步I/O。
(值得注意的是非阻塞I/O,正如之前提示要注意的,其在第二阶段内核向内存复制数据是会导致用户进程的阻塞,所以也属于同步I/O

上述注意读三遍

3. 总结
如下图所示:(暂时忽略信号驱动I/O)

每种I/O的特点和调用流程.png

可以看出阻塞式、非阻塞式、与I/O复用,其不同之处在于第一阶段,第二阶段的处理方式相同(均阻塞与recvfrom调用),这也是刚才说到的将他们归于同步I/O的原因。

注意:异步I/O不存在请求进程阻塞的情况。同时注意前三种I/O模型在第一阶段的处理方式(阻塞,返回+轮询,阻塞于select等),区分这三种I/O模型。

上述注意读三遍

关于公众号

精进!
道友们,你们好。早前个人就有开设公众号的念想,今年10月终于开搞了。
我的个人的 订阅号--T客来了;
平时自己会总结一些后端开发相关的技术;
最近也迷上了音视频开发相关技术;

技术分享包括:

  • 1.FFmpeg 工程实战、
  • 2.数据库 MySQL原理与实战、
  • 3.Redis中间件、
  • 4.Nginx、Java并发编程、
  • 5.Go语言方面的技术知识与实操;


    T客来了

点击微信图标,扫码就可以添加哦~
完。

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

推荐阅读更多精彩内容