近期分享:BIO与NIO的实质区别到底是什么?
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
近期分享:BIO与NIO的实质区别到底是什么?
作为⼀个 java 中年兵,每每遇到⾯试要准备的时候,都绕不开 BIO、NIO 这个话题。
最近⼜打开了⼀篇 NIO ⽂章,刚阅读前⾯部分的时候,突然想通了⼀些问题。
想阅读原⽂的朋友可以vx⽂章⾥搜⼀下“NIO 概览”这个标题,是收集于 JavaGuide 公众号的⼀篇⽂章。
其在最开始提到:
NIO中的N可以理解为Non-blocking,不单纯是New。
它⽀持⾯向缓冲的,基于通道的I/O操作⽅法。
看到“缓冲”两个字,我觉得醍醐灌顶了,后⾯说的“基于管道”,我觉得只是基于英⽂API“Channel”的⼀个翻译⽽已。
BIO 和 NIO API之所以如此不同,全在于“缓存”的精髓上。
BIO,我们⽹上所查资料,都会千篇⼀律告诉你,它是基于“流”的。
⽽这个“流”这个概念,是怎么出来的,可能因为都翻不到⼀⼿资料⼤家都略过不谈,⽽且 BIO 现存 API 数量和例⼦也较少,⼤家也不远深究了。
被虐千百遍后,再谈 BIO 的“流”和 NIO 的“管道”
现在我们知道,NIO 是⾯向缓冲的、基于通道的 I/O 操作⽅法。
BIO 是⾯向“流”的。
NIO 为什么可以不⽤阻塞?原因在于可以缓存了。
底层操作系统得到 I/O 数据包后可以存放到缓冲区中,不需要⽤户线程 CPU ⼀直等待。
⽽且这种⽅式的便利之处是解放了单核 CPU 的多任务处理能⼒,可以同时处理多个缓冲区,也就是处理多个 IO 请求,⽽受到的 IO 之间的互相影响降到了最低。
BIO 为什么是阻塞的?这应该和 IO API 本⾝发展阶段密不可分。
所有事物都可能要经历从简单到复杂的阶段。
BIO 的操作原理,实现和理解起来简单得多。
创造 BIO 时当时的 PC 条件可能就不怎么期望去处理多任务,最多也就⼏个或者⼗个任务,简单的起⼗条线程绑定处理就好了。
或者从内存上考虑,如果要应⽤到缓存,势必会增加内存的⽤量。
从如今编程界的⼀些经典算法和产品看,不可能在“远古时期”想不
到“缓存”这个⽅案,⽽是实在是场景有限,不需要做到那么复杂,因此第⼀代 IO 就以 BIO 的⾯⽬产⽣了。
那,流这个思想是怎么命名出来的呢?我说⼀下我的猜想。
结合今天发现的 NIO 的特点,NIO 能缓存,数据在内存中留存的时间增加了。
⽽ BIO 的“流”取⽔流之意,就好⽐⼀个⽔龙头,拧开⽔就倾泻⽽下,你把⼿放在⽔龙头下⽅,⽔龙头中的⽔会从第⼀滴到最后⼀滴从你⼿上快速的流过,要洗⼿就得趁这个时间赶快洗。
NIO 对于这个⽔龙头来说,等于在下⾯接了个盆,你在盆中洗⼿,可以重复多次利⽤⽔资源,直到它“不⼲净”为⽌。
最后总结:不谈缓存的 NIO 介绍都是耍流氓
NIO 相⽐ BIO 的变化是加⼊了“缓存”。
⽽顺⼿改了名的 API Channel(通道)等也是顺应了 API 的发展取的。
如果不叫“通道”,它还可以叫别的,只是刚好⼤佬们写的时候⽤ Channel ⽽已。
Channel 中⽂翻译还可以有多种,如频道,渠道,⽅法,航道,海峡等等,翻译的⼈取了⼀个“通道”作为意译。
因此中⽂译法叫什么就不过多纠结了。