ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

近期分享:BIO 与 NIO 的实质区别到底是什么?

2021-07-01 02:31:34  阅读:173  来源: 互联网

标签:BIO 缓存 NIO API IO 水龙头 分享


作为一个 java 中年兵,每每遇到面试要准备的时候,都绕不开 BIO、NIO 这个话题。

最近又打开了一篇 NIO 文章,刚阅读前面部分的时候,突然想通了一些问题。想阅读原文的朋友可以vx文章里搜一下“NIO 概览”这个标题,是收集于 JavaGuide 公众号的一篇文章。

其在最开始提到:

NIO中的N可以理解为Non-blocking,不单纯是New。

它支持面向缓冲的,基于通道的I/O操作方法。

看到“缓冲”两个字,我觉得醍醐灌顶了,后面说的“基于管道”,我觉得只是基于英文API“Channel”的一个翻译而已。

BIO 和 NIO API之所以如此不同,全在于“缓存”的精髓上。

而我们现在所用的 API 中已经很少有 BIO 的 API 了,印象中应该只有网络IO还有一块API是BIO的,就是 Socket 和 ServerSocket 兄弟两了吧。

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 都是耍流氓~

标签:BIO,缓存,NIO,API,IO,水龙头,分享
来源: https://www.cnblogs.com/christmad/p/14957115.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有