`
xly1981
  • 浏览: 141915 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

NIO学习

    博客分类:
  • java
阅读更多
最需要关注的是,应用进程、内核、IO三个概念。
所谓java的NIO的实现,是依赖于JVM和操作系统的实现的,它的设计思路并不是这们语言自己的,而是建立在操作系统IO控制之上的。

按照下面的一步步看。 
可以看得文章,第一篇:http://xmuzyq.iteye.com/blog/783218它的内容说得非常清楚,很好的区分了同步、异步、阻塞、非阻塞

可以参考的好文章http://blog.csdn.net/shallwake/article/details/5265287这里面的图比较好的描述了应用进程和内核通讯的过程。

还有http://www.smithfox.com/?e=191也说得不错,是第一篇的补充。

最后可以补充学习一下,涉及proactor和reactor模式的图http://www.cnblogs.com/ericchen/archive/2011/05/08/2036993.html
proactor模式两个要点:
1.不注册开始读取状态而注册读取完成状态;
2.应用程序把内存空间给到内核,而不是通过读取或写入。

Reactor中需要应用程序自己读取或者写入数据,
Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.

nio2.0介绍,就使用到了proactor模式
http://www.iteye.com/topic/472333

可以看出,java的发展都是依赖于OS的发展来的

阻塞IO不必说了
非阻塞IO ,IO请求时加上O_NONBLOCK一类的标志位,立刻返回,IO没有就绪会返回错误,需要请求进程主动轮询不断发IO请求直到返回正确
IO复用同非阻塞IO本质一样,不过利用了新的select系统调用,由内核来负责本来是请求进程该做的轮询操作。看似比非阻塞IO还多了一个系统调用开销,不过因为可以支持多路IO,才算提高了效率
信号驱动IO,调用sigaltion系统调用,当内核中IO数据就绪时以SIGIO信号通知请求进程,请求进程再把数据从内核读入到用户空间,这一步是阻塞的。
异步IO,如定义所说,不会因为IO操作阻塞,IO操作全部完成才通知请求进程。
这样以来,同步和阻塞,异步和非阻塞就不会被混淆了,它们不是同一个方面上的概念,不能比较区别
同步和异步是只跟IO操作过程中进程的状态变化有关
阻塞和非阻塞就是进程的两种状态。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics