`
和你在一起
  • 浏览: 677613 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

说说IO(二)- IO模型

阅读更多

 

这部分的东西在网络编程经常能看到,不过在所有IO处理中都是类似的。

IO请求的两个阶段

       等待资源阶段IO请求一般需要请求特殊的资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源。

       使用资源阶段:真正进行数据接收和发生。

       举例说就是排队服务。

 等待数据阶段,IO分为阻塞IO和非阻塞IO

       阻塞IO:资源不可用时,IO请求一直阻塞,直到反馈结果(有数据或超时)。

       非阻塞IO:资源不可用时,IO请求离开返回,返回数据标识资源不可用

 使用资源阶段,IO分为同步IO和异步IO

       同步IO:应用阻塞在发送或接收数据的状态,直到数据成功传输或返回失败。

       异步IO:应用发送或接收数据后立刻返回,数据写入OS缓存,由OS完成数据发送或接收,并返回成功或失败的信息给应用。

 

 

按照Unix5IO模型划分

 

  • 阻塞IO
  • 非阻塞IO
  • IO复用
  • 信号驱动的IO
  • 异步IO

从性能上看,异步IO的性能无疑是最好的。

 

各种IO的特点

  • 阻塞IO:使用简单,但随之而来的问题就是会形成阻塞,需要独立线程配合,而这些线程在大多数时候都是没有进行运算的。JavaBIO使用这种方式,问题带来的问题很明显,一个Socket需要一个独立的线程,因此,会造成线程膨胀。
  • 非阻塞IO:采用轮询方式,不会形成线程的阻塞。JavaNIO使用这种方式,对比BIO的优势很明显,可以使用一个线程进行所有Socket的监听(select)。大大减少了线程数。

 

  • 同步IO:同步IO保证一个IO操作结束之后才会返回,因此同步IO效率会低一些,但是对应用来说,编程方式会简单。JavaBIONIO都是使用这种方式进行数据处理。
  • 异步IO:由于异步IO请求只是写入了缓存,从缓存到硬盘是否成功不可知,因此异步IO相当于把一个IO拆成了两部分,一是发起请求,二是获取处理结果。因此,对应用来说增加了复杂性。但是异步IO的性能是所有很好的,而且异步的思想贯穿了IT系统放放面面。

 

17
3
分享到:
评论
6 楼 linuxfs 2013-01-22  
谢谢了,纠结了挺长时间的问题。
5 楼 罗卜头 2011-01-05  
和你在一起 写道
很仔细的同学,好问题:)说不上赐教,一点个人解读,共同学习。

1.Java NIO的底层实现(*nix)就是使用select函数或者poll函数(详见*nix相关书籍),他们两个都属于IO复用的方式,因此,第一个问题,Java NIO属于多用复用;Windows的不知道了。

2.多路复用确实是阻塞的,但是这个阻塞是在select或者poll函数上的或者是在内部实现上(select虽然阻塞,但是能支持多路IO);对Java来说,由于封装了一层,Java的接口屏蔽了这个阻塞,对外呈现出非阻塞的使用方式。感觉这么说可能更恰当一些——JavaNIO底层实现使用了IO多路复用,而在本身NIO的接口使用方式上,是一种非阻塞IO的方式(轮询检查的方式)。




谢谢,您的解释让我茅舍顿开,我对这个问题纠结了好久
window 好像也是多路复用,我不确定
顺便再请教几个问题
1 信号IO在等待阶段是怎么处理的
2 JAVA 以后的AIO 是否就是使用 第5种模型(unix下)
4 楼 和你在一起 2011-01-04  
很仔细的同学,好问题:)说不上赐教,一点个人解读,共同学习。

1.Java NIO的底层实现(*nix)就是使用select函数或者poll函数(详见*nix相关书籍),他们两个都属于IO复用的方式,因此,第一个问题,Java NIO属于多用复用;Windows的不知道了。

2.多路复用确实是阻塞的,但是这个阻塞是在select或者poll函数上的或者是在内部实现上(select虽然阻塞,但是能支持多路IO);对Java来说,由于封装了一层,Java的接口屏蔽了这个阻塞,对外呈现出非阻塞的使用方式。感觉这么说可能更恰当一些——JavaNIO底层实现使用了IO多路复用,而在本身NIO的接口使用方式上,是一种非阻塞IO的方式(轮询检查的方式)。



罗卜头 写道
我有几个模糊不清的概念想请教下
1 在unix中 JAVA NIO === 多路复用? 或者说完全使用多路复用
2 如果是的话, 多路复用 在图上在等待阶段是“堵塞”的,但是你说 "Java的NIO使用这种方式,对比BIO的优势很明显,可以使用一个线程进行所有Socket的监听(select)。大大减少了线程数"

望赐教

3 楼 罗卜头 2011-01-04  
我有几个模糊不清的概念想请教下
1 在unix中 JAVA NIO === 多路复用? 或者说完全使用多路复用
2 如果是的话, 多路复用 在图上在等待阶段是“堵塞”的,但是你说 "Java的NIO使用这种方式,对比BIO的优势很明显,可以使用一个线程进行所有Socket的监听(select)。大大减少了线程数"

望赐教
2 楼 和你在一起 2010-12-22  
IO复用方式,主要还是在IO等待阶段,实现上使用了select或poll方式,为什么说复用呢?可以考虑下Java的NIO实现,使用select函数,N个socket通过select返回当前需要处理的IO,而其他IO则继续阻塞。

与上图的“非阻塞I/O”相比,非阻塞IO需要一直轮询,而IO复用提供了类似通知的方式,因此效率更高。

juda 写道
写的很好,能解释下IO复用吗?谢谢
:evil:

1 楼 juda 2010-12-21  
写的很好,能解释下IO复用吗?谢谢
:evil:

相关推荐

Global site tag (gtag.js) - Google Analytics