`

Java NIO与IO的详细区别(通俗篇)

    博客分类:
  • Java
 
阅读更多

内核空间用户空间计算机体系结构计算机组成原理、……确实有点儿深奥。

 

我的新书《代码之谜》会有专门的章节讲解相关知识,现在写个简短的科普文:

 

就速度来说 CPU > 内存 > 硬盘

 

  • I- 就是从硬盘到内存
  • O- 就是从内存到硬盘

第一种方式:我从硬盘读取数据,然后程序一直等,数据读完后,继续操作。这种方式是最简单的,叫阻塞IO

 

第二种方式:我从硬盘读取数据,然后程序继续向下执行,等数据读取完后,通知当前程序(对硬件来说叫中断,对程序来说叫回调),然后此程序可以立即处理数据,也可以执行完当前操作在读取数据。

 

在以前的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO。

 

还有一种就是同步 IO 和异步 IO。经常说的一个术语就是“异步非阻塞”,好象异步和非阻塞是同一回事,这大概是一个误区吧。

 

至于 Java NIO 的 Selector,在旧的 Java IO 系统中,是基于 Stream 的,即“流”,流式 IO。

 

当程序从硬盘往内存读取数据的时候,操作系统使用了 2 个“小伎俩”来提高性能,那就是预读,如果我读取了第一扇区的第三磁道的内容,那么你很有可能也会使用第二磁道和第四磁道的内容,所以操作系统会把附近磁道的内容提前读取出来,放在内存中,缓存

 

(PS:以上过程简化了)

 

通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

 

于是,NIO 横空出世。

200
37
分享到:
评论
38 楼 379855529 2017-01-16  
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的你不给我~
37 楼 kun_hu 2014-05-07  
这就没了?
36 楼 ijlkdwg 2014-03-04  
shusansheng 写道
预读,在所有操作系统上都可以实现。 准确来说,是在 FS上实现的,Linux,windows都有,不知道奇葩的 macosx有没有。
另外,推荐楼上所有喷的人读一读 <大话数据存储>

又跑来一个不着调的。这个讨论的主题是NIO,就出现一个“预读”名词而已,你就忙不迭的来露个脸,说这个我知道啊,我知道啊,我是高手啊。顺便加一顶帽子给别人,不需要辩论就胜利了。好一副高手的嘴脸。除了盖帽子和装,你还会什么?前面的技术讨论很多,有料的就摆出来,要不就回家去发挥,那里有的是无知人给你哄骗。无论对错,是爷们就放开自己的观点说,别羞羞答答遮遮掩掩的。
顺便说下,对于专业里的技术问题,我很少看科普读物,特别是儿童版的。我不反对这个,科普读物自然有普及科学的用途,但我不怎么看。比如我的java知识,基本上来自google,上面有对有错,自己去判断思考,试验甄别。同事桌子上有大块头的think in java、java核心卷,偶尔翻翻,索然无味。Effective倒买了本,不知道扔到哪里了,英文版的pdf在桌面上,经常翻。我英文很烂,但是看这些就能忍得住。词霸是我电脑唯一的自动启动软件。
35 楼 shusansheng 2014-02-12  
预读,在所有操作系统上都可以实现。 准确来说,是在 FS上实现的,Linux,windows都有,不知道奇葩的 macosx有没有。
另外,推荐楼上所有喷的人读一读 <大话数据存储>
34 楼 在世界的中心呼喚愛 2014-01-23  
ijlkdwg 写道
nodejs 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!

你写的这两句话就比作者写的强了????真不知道iteye怎么会出来这种人!!

??
有事说事,别上来就含糊的盖什么帽子。
我观点里面哪个有问题,直接提。别搞的羞羞答答的假装不好意思。
别说现在所谓搞技术的,都玩虚的了。


请问下,硬件(或者计算机基础)知识怎么积累。。
有的东西,有心去学,实际工作中,没有用到。。。
我又很快忘记..
反反覆覆....
33 楼 flashing 2014-01-16  
nodejs 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

我很同意作者的观点,至于你说的也很对,但是不冲突。因为阻塞、非阻塞、异步、同步本来就是不同的概念。只是很多人往往误解,把异步和非阻塞等同起来,其实这是不对的。


看到有人回复我又仔细瞅了一眼原文,其实硬伤还是挺多的。
比如说预读的解释就是完全错误的,windows的确会预读,也会为高频率读取的文件做内存映射,但是磁道扇区。。。这是硬盘干的事儿好不好,而且存储不连续是正常现象,这个解释完全不靠谱,哪怕是比喻也是不靠谱的,更重要的是和nio没有半毛钱关系。
关于流的解释我是没看懂,其实楼主讲的看起来只是IO怎么缓存的概念而已,有缓存就有拷贝,性能就得下降一点,要不然要DMI干什么。这里仔细再看一遍,觉得完全是不知所云,虽然堆了几个高大上的名词。。。
32 楼 nodejs 2014-01-14  
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

我很同意作者的观点,至于你说的也很对,但是不冲突。因为阻塞、非阻塞、异步、同步本来就是不同的概念。只是很多人往往误解,把异步和非阻塞等同起来,其实这是不对的。
31 楼 nodejs 2014-01-14  
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!

你写的这两句话就比作者写的强了????真不知道iteye怎么会出来这种人!!
30 楼 artdialog 2014-01-14  
ijlkdwg 写道
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?

满嘴喷粪的傻逼,JJC大大别和他一般见识,这种人见的多了。
29 楼 ijlkdwg 2014-01-14  
justjavac 写道
ijlkdwg 写道
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?

可以总结为:读取的方式

要咬文嚼字也没问题:
你承认是“读取的方式”。
那么,你读取的宾语是什么,前面大块的文字是说磁盘吧。因此加上“磁盘”,就是“读取磁盘的方式”。
然后我们看后面的,技术是为了解决问题的,不是为了给某些人显摆的。你所谓的方式,最终是不是为了“效率速度”?
那么,你的总结,跟我的有什么区别???
顺便看了下你其它的几篇东西,多数是浅尝辄止,人云亦云。比如关于加密签名的那个东西,老外原文里面的确错了,他把签名的反过程说成解密了。但是你稍微考虑下,如果这样,为什么还有加密解密和签名验证俩个说法。这样也不会被他迷惑了。另外关于ssl的握手,google查询"ssl shakehand steps"或者"ssl 握手 过程"都可以找到很多。而这样的过程里面,每一步,你仔细考虑,都是非常有意义的。
很少逛国内站点,偶尔好心给人提醒,却这样的争论,到了咬文嚼字的地步。
技术的路,你这样的心态,不适合。
你继续去做你的高手去吧。
28 楼 justjavac 2014-01-13  
ijlkdwg 写道
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?

可以总结为:读取的方式
27 楼 justjavac 2014-01-13  
ijlkdwg 写道
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?

虽然不是全部,但这也是一个很重要的NIO场景啊!
26 楼 ijlkdwg 2014-01-13  
justjavac 写道
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?

这个是你文字里面的:
==========================
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。
==========================
是不是,这个可以总结为“NIO为了java读写磁盘的速度/效率”?或者你给另外一个简短总结。
理科的东西玩不转了,要玩文科的咬文嚼字了么?
25 楼 justjavac 2014-01-13  
ijlkdwg 写道
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。

我文中几时说过「磁盘读写速度」?
24 楼 ijlkdwg 2014-01-13  
justjavac 写道
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。

入门???
你的东西根本就是错的!入什么门啊!!!
你的入门是什么意思?难道说错的就是入门的?
还自我谦虚下“并未深入”了。还扯什么操作系统、api,你就继续的装吧。开始就错了,你还要怎么深入?
知道瞧你不上的原因是什么么?是你说的“NIO为了解决磁盘读写速度”这样的观点,很让我惊讶,我真的无法想象,你是怎么得到这样结论的!这个说明了你自身逻辑思维能力的极度低下。
其实,这个事情里面同时也说明了你的很多问题,不学无术而高谈阔论,你的圈子里面的人水平也不行(或者很可能你就从来不跟人沟通)。这些都不是什么大问题,人只要坚持学习思考,必然能进步。
但是,如果基本的逻辑思维能力出问题了,那就麻烦了。
23 楼 justjavac 2014-01-10  
Tyrion 写道
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。

本文属于科普,并未深入。至于IO包括:硬件DMI,磁盘系统,文件系统,语言API。讨论底层的并发没有太大意义。

就硬件来说,CPU也是一次执行一条(组)指令,但是对于操作系统层来说,可以进行多任务,多线程。
22 楼 Tyrion 2014-01-09  
flashing 写道
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。

同意,这篇文章写的属于入门介绍级,远谈不上详细二字。
21 楼 flashing 2014-01-09  
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!


说心话我觉得这个作者功力还是太浅了(当然也可能是没系统的说清楚),我几年前曾经和我师弟仔细讨论过阻塞和非阻塞,这个概念其实挺坑爹的,操作系统要做的事情太多了,包括DMI,拷贝的控制,怎么主动阻塞,等等,现代操作系统下所有的io都是并发的,绝对的阻塞只是api级别的设计而已。
20 楼 kelly_zsl 2014-01-08  
分析很好,目前java(5.0+) 实现2中非阻塞io处理,polling机制和回调,必须要操作系统支持才可以的,
ijlkdwg 写道
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!

19 楼 ijlkdwg 2014-01-08  
天!!!就这样也写书。
如果是在当前线程里面IO,这个就是同步,那肯定是io完成,才可以继续走,这个是阻塞的;
如果是另外一个线程IO到buf里面供自己使用,那就是异步。异步里面也可以有俩个情况,如果当前线程阻塞到io完成,这个就是异步阻塞;如果线程去做别的事情了,过会儿来检查下自己的数据IO是不是ok了【轮询】,或者是IO完成时候底层来告诉自己【通知】,这个就是异步非阻塞。
最后,NIO出现的原因,绝对不是为了读写硬盘的速度!!!真的是天方夜谭!!!

相关推荐

Global site tag (gtag.js) - Google Analytics