漫话 | 运维如何给女朋友解释 IO 中的阻塞、非阻塞、同步、异步?
来源:漫画编程
周末在家加班,正在疯狂的撸代码,女朋友很开心的跑过来,手里拿着他刚刚画好的一副漫画。
我刚刚画了一个很好看的漫画,能不能帮我做个网站把它上传到网上啊?
做网站可难不倒我。漫画上传,你希望是同步的还是异步的啊?
啥同步异步的我不懂,同步吧。
哦,那是阻塞的还是非阻塞的呢?
额、阻塞吧。
恭喜你,选择了一种最慢的方式。
什么鬼嘛,你给我绕懵了,给我讲讲这都是啥意思。
同步、异步、阻塞、非阻塞都是和IO(输入输出)有关的概念。最简单的文件读取就是IO操作。而在文件读取这件事儿上,可以有多种方式。
又拽概念了,你先给我说说啥叫同步、啥叫异步。
好吧,你去给我烧点水,泡杯咖啡我慢慢给你讲。
什么是同步和异步
别急,听我慢慢和你说。
什么是阻塞和非阻塞
当然不是啦。
阻塞、非阻塞和同步、异步的区别
你可以简单的这么理解。
那我的网站我想选择异步非阻塞的形式。
其实阻塞、非阻塞和同步、异步之间的组合并不是全都有的。
那都有那些呢?
三种IO模型
以Java语言为例,Java一共提供了三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)、异步IO(AIO)。
这里面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,异步IO指的是异步非阻塞IO。
BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
NIO (New I/O):同时支持阻塞与非阻塞模式,但主要是使用同步非阻塞IO。
AIO (Asynchronous I/O):异步非阻塞I/O模型。
额、刚刚好像明白了,现在又不懂了。
那我再拿烧水的例子给你解释一遍。
BIO (Blocking I/O):有一排水壶在烧开水,BIO的工作模式就是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。
NIO (New I/O):NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
AIO ( Asynchronous I/O):为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。
奥,你就说烧水我就明白了。
嗯,这就是Java中的三种IO模型。
Java好厉害啊,自己都能实现这些IO组合。
也不是啦,Java中的IO还是借助操作系统的IO模型的,只不过是对操作系统IO模型的封装而已啦。
那你再给我讲讲操作系统的IO模型吧。
滴滴滴滴,这时候水壶响了,打断了女朋友的发问。女朋友去拿来烧好的热水,给我泡了一杯咖啡。
诺,给你咖啡,我选好了,你就用AIO给我实现个漫画上传的网站吧。我晚上就要用。
额…
END
官方站点:www.linuxprobe.com
Linux命令大全:www.linuxcool.com
刘遄老师QQ:5604241
Linux技术交流群:3762708
(新群,火热加群中……)
想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!
微信扫码关注该文公众号作者