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

JAVA NIO原理个人理解

2014-08-07 15:24 363 查看
参考: http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf http://blog.csdn.net/chenchong_219/article/details/35822803
一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作。

同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO。

阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。

同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

所以,IO操作可以分为3类:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、异步(AIO)。

同步阻塞:

在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式。

同步非阻塞:

在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。

异步:

此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。

NIO比较好的书籍 Java NIO 中文版

JAVA多线程模型和NIO非组设模型之间的一点个人理解。

多线程模型

例如当我们启用一个新线程请求读取文件,CPU发现读取文件时间很长,CPU表示哥很忙,你慢慢玩,我去招待别人了。

为什么时间很长呢?因为这个过程,CPU发出读文件命令,操作系统需要读取磁盘数据到OS buffer中,这个过程耗时很长,CPU长时间没事干,所以他去照顾别人(读数据库)。所以我们的线程会阻塞掉,知道BUFFER数据足够了,操作系统接到命令,同时通知jvm,jvm调用我们的工作线程执行具体的工作。

缺点:开启大量线程 耗费内存,线程上下文切换也耗费资源。

NIO模型

同样我们读取一个文件和读取数据库,我们读取文件并不使用新线程,而是把读取文件作为一个事件 注册到事件队列,等待操作系统处理,同理读取数据库也是一个事件,

当然这两个事件有自己独特的标志,操作系统收到命令就开始工作,例如读取文件,流程也是一样,当buffer数据足够的时候,他只是更新事件的状态,也并关心我们的工作线程。

而我们的工作线程需要一直监视事件的状态,如果事件的状态OK,表示我们的数据准备好了,可以执行了,我们就开始执行我们业务代码了。

对比 只有一个线程

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: