Linux IO模型漫谈(1)

简介:

基础知识

Linux将所有外部设备都看做一个文件来进行操作。因此,linux对所有外部设备的操作都可以看做是文件的操作。文件的操作当然需要有个标示描述它,这就是文件描述符(file descriptor)。

linux的IO操作如何形象理解呢?

我们说网络socket的read()是一个IO操作命令,具体流程是这样的:

应用程序调用read命令,通知内核需要做读取数据操作

内核创建一个文件描述符

内核从物理层收到读数据的命令,从网络中获取数据包

数据包传递到TCP/IP层,解析数据包的头

内核将数据包缓存在文件描述符的读缓存区(接受缓存区)中,注意这里的读缓存区是在内核中的

当文件描述符读缓存区数据字节数大于应用程序定义的低水位的时候(read的一个参数),此时文件描述符处于读就绪的状态

将读缓存区中的数据复制到应用程序(用户区)返回

clip_image001

这里需要说明的是

1 每个文件描述符都有自己的读缓冲区和写缓冲区,读缓冲区对应的是read操作,写缓冲区对应的就是write操作了

2 读缓冲区和写缓冲区都是在内核区中

IO模型

现有的linux IO模型有5种:

阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型,异步IO模型

经常弄不清楚的就是阻塞,非阻塞,异步,同步

image

说明一下

上图给出的同步异步标准是:数据描述符缓存是由谁来进行读取的?由用户程序读取,则判断为同步;由内核推送,判断为异步

上图给出的阻塞非阻塞标准是:调用的用户进程是否是阻塞的状态

这里关于这五种IO模型的阻塞同步状态有很多种说法,比较有争议的是IO复用模型和信号驱动IO模型的判断分类上,推荐这一种判断:

关于IO的同步、异步、阻塞、非阻塞
目录
相关文章
|
4月前
|
Linux
Linux 下的五种 IO 模型详细介绍
根据上述定义,我们的前4种模型——阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型和信号驱动式I/O模型都是同步I/O模型,因为其中真正的I/O操作(recvfrom )将阻塞进程。异步请求:A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。和上面的阻塞IO模型相比,非阻塞IO模型在内核数据没准备好,需要进程阻塞的时候,就返回一个错误,以使得进程不被阻塞。阻塞请求:A调用B,A一直等着B的返回,别的事情什么也不干。
36 0
Linux 下的五种 IO 模型详细介绍
|
7月前
|
小程序 Linux C语言
【Hello Linux】基础IO(一)
【Hello Linux】基础IO
38 0
|
4月前
|
Unix Linux
Linux五种IO模型
Linux五种IO模型
|
7月前
|
存储 Linux C++
【Hello Linux】基础IO(三)
【Hello Linux】基础IO(三)
35 0
|
7月前
|
Linux C语言 C++
【Hello Linux】基础IO(二)
【Hello Linux】基础IO(二)
95 0
|
7月前
|
Unix Linux C语言
|
11月前
|
存储 Java Linux
Linux之基础IO
Linux之基础IO
55 0
|
网络协议 Linux 调度
Linux 五种Io模型
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用结果通过信号来通知调用者。
Linux 五种Io模型
|
安全 Linux C语言
Linux基础IO
Linux基础IO
127 1
Linux基础IO
|
存储 Linux 索引
Linux —— 基础IO(3)
Linux —— 基础IO(3)
95 0
Linux —— 基础IO(3)