Linux IO模型漫谈(1)
2012-05-29 11:20
204 查看
基础知识
Linux将所有外部设备都看做一个文件来进行操作。因此,linux对所有外部设备的操作都可以看做是文件的操作。文件的操作当然需要有个标示描述它,这就是文件描述符(file descriptor)。linux的IO操作如何形象理解呢?
我们说网络socket的read()是一个IO操作命令,具体流程是这样的:应用程序调用read命令,通知内核需要做读取数据操作
内核创建一个文件描述符
内核从物理层收到读数据的命令,从网络中获取数据包
数据包传递到TCP/IP层,解析数据包的头
内核将数据包缓存在文件描述符的读缓存区(接受缓存区)中,注意这里的读缓存区是在内核中的
当文件描述符读缓存区数据字节数大于应用程序定义的低水位的时候(read的一个参数),此时文件描述符处于读就绪的状态
将读缓存区中的数据复制到应用程序(用户区)返回
![](http://images.cnblogs.com/cnblogs_com/yjf512/201205/20120529111931269.png)
这里需要说明的是
1 每个文件描述符都有自己的读缓冲区和写缓冲区,读缓冲区对应的是read操作,写缓冲区对应的就是write操作了
2 读缓冲区和写缓冲区都是在内核区中
IO模型
现有的linux IO模型有5种:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型,异步IO模型
经常弄不清楚的就是阻塞,非阻塞,异步,同步
![](http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205291119326856.png)
说明一下
上图给出的同步异步标准是:数据描述符缓存是由谁来进行读取的?由用户程序读取,则判断为同步;由内核推送,判断为异步
上图给出的阻塞非阻塞标准是:调用的用户进程是否是阻塞的状态
这里关于这五种IO模型的阻塞同步状态有很多种说法,比较有争议的是IO复用模型和信号驱动IO模型的判断分类上,推荐这一种判断:
关于IO的同步、异步、阻塞、非阻塞
参考文档
高性能服务器开发深入浅出异步I/O模型
IO - 同步,异步,阻塞,非阻塞
关于IO的同步,异步,阻塞,非阻塞
相关文章推荐
- Linux IO模型漫谈(6)- 信号驱动IO模型
- Linux IO模型漫谈(5)- IO复用模型之select
- Linux IO模型漫谈
- Linux下select, poll和epoll IO模型的详解
- 聊聊Linux 五种IO模型
- Linux下select, poll和epoll IO模型的详解
- Linux五种IO模型
- 聊聊Linux 五种IO模型
- 深入理解JAVA I/O系列六:Linux中的IO模型
- Linux五种IO模型性能分析
- linux网络编程之IO模型
- 幽默讲解linux的Socket IO模型
- linux IO模型与AIO
- 用linux的几种IO模型编的段子
- Windows五种IO模型性能分析和Linux五种IO模型性能分析
- netty学习(一)--linux下的网络io模型简单介绍
- Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
- linux下5种网络IO模型简介
- linux高性能网络IO模型EPOLL(转)
- 常见Linux IO模型分析