首页 技术 正文
技术 2022年11月7日
0 收藏 789 点赞 673 浏览 1141 个字

这两篇文章分析了Linux下的5种IO模型

http://blog.csdn.net/historyasamirror/article/details/5778378

http://blog.csdn.net/hguisu/article/details/7453390

很多人对阻塞 / 非阻塞, 同步 / 异步 的概念理解的不深入,搞不清楚非阻塞和异步IO的区别,笼统的认为非阻塞IO就是异步IO。其实区别很大,编程模型完全不同

阻塞 / 非阻塞描述的是函数,指访问某个函数时是否会阻塞线程(block,线程进入阻塞状态)。

同步 / 异步描述的是执行IO操作的主体是谁,同步是由用户进程自己去执行最终的IO操作。异步是用户进程自己不关系实际IO操作的过程,只需要由内核在IO完成后通知它既可,由内核进程来执行最终的IO操作。

这两组概念交集在一起参生的非阻塞同步IO和非阻塞异步IO的概念就不难理解。

非阻塞同步IO指的是用户调用读写方法是不阻塞的,立刻返回的,而且需要用户线程来检查IO状态。需要注意的是,如果发现有可以操作的IO,那么实际用户进程还是会阻塞等待内核复制数据到用户进程,它与同步阻塞IO的区别是后者全程等待。

非阻塞异步IO指的是用户调用读写方法是不阻塞的,立刻返回,而且用户不需要关注读写,只需要提供回调操作,内核线程在完成读写后回调用户提供的callback。

这两个概念的不同造成了编程模型的不同

非阻塞同步IO由于读写方法非阻塞,并且需要用户自己来进行读写,所以每次调用读写方法实际读写的字节数是不确定的,所以需要一个Buffer来保存每次读写的字节状态。更重要的是用户不知道什么时候完成了读写,一般需要用while循环判断Buffer的状态来跟踪读写

非阻塞异步IO由于是内核线程进行读写,并且在IO完成后会回调用户提供的callback,编程模型就比较简单,用户只需要调用读写,提供回调就可以了,比如 read(filename, callback)

select / poll / epoll 从本质上说都是非阻塞同步IO,select会收到IO就绪的状态,然后通知用户去处理IO,实际的IO操作还需要用户等待内核复制操作。

要理解IO就绪和完成的区别。就绪指的是还需要用户自己去处理,完成指的是内核帮助完成了,用户不用关心IO过程,只需要提供回调函数。

理解了非阻塞同步IO和非阻塞异步IO的区别之后,就不难理解Java NIO的设计了。NIO是围绕ByteBuffer来进行读写的,ByteBuffer是一个缓冲区,用来记录读写的状态,通过多次检查ByteBuffer的状态来确定IO是否完成

Java 1.7的NIO2.0 引入了非阻塞异步IO的概念,编程模型大大简化了。用户只需要关注回调函数即可。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,105
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,582
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,429
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,836
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,919