使用资源阶段:真正进行数据接收和发生。
举例说就是排队和服务。
IO请求的两个阶段:
- 异步IO:由于异步IO请求只是写入了缓存,从缓存到硬盘是否成功不可知,因此异步IO相当于把一个IO拆成了两部分,一是发起请求,二是获取处理结果。因此,对应用来说增加了复杂性。但是异步IO的性能是所有很好的,而且异步的思想贯穿了IT系统放放面面。
2.多路复用确实是阻塞的,但是这个阻塞是在select或者poll函数上的或者是在内部实现上(select虽然阻塞,但是能支持多路IO);对Java来说,由于封装了一层,Java的接口屏蔽了这个阻塞,对外呈现出非阻塞的使用方式。感觉这么说可能更恰当一些——JavaNIO底层实现使用了IO多路复用,而在本身NIO的接口使用方式上,是一种非阻塞IO的方式(轮询检查的方式)。- 同步IO:同步IO保证一个IO操作结束之后才会返回,因此同步IO效率会低一些,但是对应用来说,编程方式会简单。Java的BIO和NIO都是使用这种方式进行数据处理。
在使用资源阶段,IO分为同步IO和异步IO。
从性能上看,异步IO的性能无疑是最好的。
这部分的东西在网络编程经常能看到,不过在所有IO处理中都是类似的。
- 阻塞IO:使用简单,但随之而来的问题就是会形成阻塞,需要独立线程配合,而这些线程在大多数时候都是没有进行运算的。Java的BIO使用这种方式,问题带来的问题很明显,一个Socket需要一个独立的线程,因此,会造成线程膨胀。
按照Unix的5个IO模型划分
- 异步IO
各种IO的特点
同步IO:应用阻塞在发送或接收数据的状态,直到数据成功传输或返回失败。
- 信号驱动的IO
阻塞IO:资源不可用时,IO请求一直阻塞,直到反馈结果(有数据或超时)。
异步IO:应用发送或接收数据后立刻返回,数据写入OS缓存,由OS完成数据发送或接收,并返回成功或失败的信息给应用。
- 阻塞IO
在等待数据阶段,IO分为阻塞IO和非阻塞IO。
- 非阻塞IO
非阻塞IO:资源不可用时,IO请求离开返回,返回数据标识资源不可用
- 非阻塞IO:采用轮询方式,不会形成线程的阻塞。Java的NIO使用这种方式,对比BIO的优势很明显,可以使用一个线程进行所有Socket的监听(select)。大大减少了线程数。
等待资源阶段:IO请求一般需要请求特殊的资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源。
- IO复用
免责声明:本站发布的内容(图片、视频和文字)以原创、来自本网站内容采集于网络互联网转载等其它媒体和分享为主,内容观点不代表本网站立场,如侵犯了原作者的版权,请告知一经查实,将立刻删除涉嫌侵权内容,联系我们QQ:712375056,同时欢迎投稿传递力量。
Copyright © 2009-2022 56dr.com. All Rights Reserved. 特网科技 特网云 版权所有 特网科技 粤ICP备16109289号
域名注册服务机构:阿里云计算有限公司(万网) 域名服务机构:烟台帝思普网络科技有限公司(DNSPod) CDN服务:阿里云计算有限公司 百度云 中国互联网举报中心 增值电信业务经营许可证B2
建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站