您的位置:首页 > 编程语言 > Java开发

深入理解java NIO

2013-12-29 20:59 302 查看
好久没写博客啦。。。。。。

文归主题,本文中关于java NIO的介绍主要包含NIO的三个方面,即NIO中的三个主要概念----Buffer,Channel,Selecter

首先先介绍一下Buffer和Channel,

selector,相对于传统的IO模型显著的提高了多并发IO情况下的性能(这里主要说的是网络IO)。NIO比IO效率高,其实说白了就是IO通道的多路复用,你也可以理解我异步IO模型,当然这里的异步IO是不是理想的IO模型还要取决于操作系统。说到这里我觉得还是把几个概念先讲一下,异步,同步,阻塞,非阻塞。这几个概念刚开始的时候比较模糊前段时间也查了好多资料去进一步的了解,在网上发现一篇文章讲的相当的好  http://www.smithfox.com/?e=191

我这里给链接中的文章总结一下:

在同步模型中分为同步阻塞和同步非阻塞,同步阻塞为cpu在等待IO的过程中暂停执行该进程或者是线程,该进程或者是线程交出cpu的,让cpu去执行其他的进程或者是线程;同步非阻塞是cpu在等待io的过程中在交出cpu控制权的同时还有机会时不时的去坚持io是否已经准备好了。从上面两个模型可以看出,阻塞让自己的进程失去了cpu的控制权;相反非阻塞模型是自己时不时的还能有机会获得cpu的时间片段,但这大多数会造成cpu的浪费。

异步模型为:异步可以说是I/O最理想的模型: CPU的原则是, 有必要的时候才会参与, 既不浪费, 也不怠慢。

下面通过比较传统IO和NIO来说明NIO带来的好处:

1,传统IO在出来网络并发的情况下服务器程序会开启多个线程去处理客户端的请求,为了提高性能可以采用线程池。但是这种方式在大并发的情况下还是会开启很多的线程,这就会带来系统的资源的巨大开销;而NIO会开启一个线程去监督所有的网络连接线程,一旦网络线程触发了某种事件,就会从线程池中取出进行相应的处理(这就是我们所说的Selector)。

2,针对1中提到的方式,感觉还是不够好,因为还是会存在守护线程不停的去检查轮询,这样的话一旦大并发的情况下,轮询的时间开销也会增加。那么我们顺着这个思路去想可不可有一种监听的机制?答案是肯定的,比如在linux下,nio可以去调用linux网络编程中的epoll去实现这里监听或者是类似监听的机制。(epoll是一种内核级别的io监视机制,这个在linux内核2.6及其以上的版本中增加了此功能)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: