【Linux】 --- Linux五种IO模型

一、什么是IO

我们知道Linux下一切皆文件,那么怎么样对这些文件进行有效的管理呢,那么文件描述符应运而生,文件描述符是Linux下抽象出的一种标识文件的概念或者术语。它是一个非负整数。Linux下通过一个文件描述符集合来映射管理所有文件。I/O呢?I/O(input/output),即输入和输出端口,操作系统每一个设备都有一个专有的I/O地址用来处理输入输出信息。CPU与外部设备之间的通信连接和数据交换都需要通过I/O地址来实现。Linux内核将所有外部设备都看作一个文件来操作,应用程序通过调用文件操作的系统调用来与内核进行交互,来实现设备的访问和操作。Linux下I/O操作又分为Linux系统提供的I/O方法和C接口提供的I/O操作方法,两者区别在于C标准在用户空间进行了一层封装,基于流式的操作方法,通过在用户空间创建缓冲区来减少系统调用的次数来提高效率。在Linux的缓存I/O机制中,操作系统会将I/O的数据缓存在文件系统的page cache中,数据会先被拷贝到page cache中,操作系统定时将page cache中的数据刷新到磁盘。

二、阻塞和非阻塞、同步和异步

1.同步和异步

这两个概念与消息的通知机制有关。

同步
  所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。

异步
  异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用结果通过信号来通知调用者。

2.阻塞与非阻塞

阻塞与非阻塞与等待消息通知时的状态有关。

阻塞 
  阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。  
  阻塞和同步是完全不同的概念。首先,同步是对于消息的通知机制而言,阻塞是针对等待消息通知时的状态来说的。而且对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

非阻塞
  非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回,并设置相应的errno。
  虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。

事例
  以小明下载文件为例,对上述概念做一梳理:
   
①、同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。
 
  同步:等待下载完成通知;
  阻塞:等待下载完成通知过程中,不能做其他任务处理;

②、同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。

同步:等待下载完成通知;
  非阻塞:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】

③、异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。

异步:下载完成“叮”一声通知;
  阻塞:等待下载完成“叮”一声通知过程中,不能做其他任务处理;

④、异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
  
  异步:下载完成“叮”一声通知;
  非阻塞:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知。

三、五种IO模型

1、阻塞 I/O
2、非阻塞 I/O
3、I/O 多路复用
4、信号驱动 I/O( SIGIO)
5、异步 I/O

一般来说,程序进行输入操作有两步:
1.等待有数据可以读
2.将数据从系统内核中拷贝到程序的数据区。

五种Linux IO模型详解(https://blog.csdn.net/z_ryan/article/details/80873449)

发布了64 篇原创文章 · 获赞 323 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/L19002S/article/details/105079140