关于NIO的博文推荐

虽然nio很早就开始存在了,但由于从来没用过,导致一直不太清楚它的理念和原理,但是现在的公司应该都用nio了,宝宝还是处于io的原始状态,今天看了不少文章,推荐几篇写的挺好的,稍微有个感性的认识,我觉得,真正的深刻的理解还是要源于实践。。。

nio入门:http://www.ibm.com/developerworks/cn/education/java/j-nio/
Java NIO原理图文分析及代码实现 :http://weixiaolu.iteye.com/blog/1479656
深入理解Java NIO:http://www.cnblogs.com/geason/p/5774096.html
深入分析 Java I/O 的工作机制:http://www.ibm.com/developerworks/cn/java/j-lo-javaio/

就速度来说 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 横空出世。
摘自:https://segmentfault.com/q/1010000000314712

我觉得以上的简单讲解应该有一个基本认识了,我的几点理解:
1)阻塞式io是基于“流”(字节)的读写操作;而nio是基于“块”的读写操作;
2)服务器端和客户端都是通过channel进行连接,而读写时都是要通过buffer来具体操作(把数据从channel读到buffer,从buffer写到channel中);
3)如何做到非阻塞,主要是通过管理者selector来实现,服务器/客户端会把自己相应的channel和感兴趣的事件注册到selector上,selector会监听这些事件(这时候程序可以执行自己的操作,而无需阻塞在read、write上),当selector监听到事件发生时,会“告诉”程序,“数据来了,可以进行操作啦”(这应该就是所谓的非阻塞吧);

对于知识,没有实践,没啥发言权啊。。希望以后有发声的机会~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值