嵌入式学习之Linux驱动:IO模型(1)概览

什么是IO呢?

IO的英文全称是input和output,翻译过来就是输入和输出。
在冯诺依曼结构中,将计算机分成为5个部分:运算器、控制器、存储器、输入设备、输出设备。其中输入设备指的是向计算机输入数据或信息,如鼠标,键盘都是输入设备。输出设备指的是用于接收计算机输出信息的设备,如电脑显示器。
在这里插入图片描述

IO执行过程

操作系统(Linux)负责对计算机的资源进行管理,应用程序运行在操作系统上,处在用户空间。应用程序不能直接对硬件进行操作,只能通过操作系统提供的API来操作硬件。

所以当我们在进行IO操作的时候,如读写磁盘的操作,进程需要切换到内核空间才可以执行这样的操作。并且应用程序不能直接操作内核空间的数据,需要把内核空间的数据拷贝到用户空间。

一个完整的IO过程包含以下几个步骤:

  1. 应用程序向操作系统发起IO调用请求(系统调用)。
  2. 操作系统准备数据,把IO的数据加载到内核缓冲区。
  3. 操作系统拷贝数据,把内核缓冲区的数据从内核空间拷贝到用户/应用空间。

IO模型引入

但是在IO执行过程中,由于CPU和内存的速度远远高于外设的速度,所以就存在速度严重不匹配的情况。

举个例子,比如我要给磁盘写入100M的数据,CPU输出100M的数据可能只需要几秒钟,但是磁盘如果要接收100M的数据可能需要几分钟。
怎么处理这个矛盾呢?就可以使用IO模型进行编程。

IO模型的种类

IO模型有阻塞IO,非阻塞IO,信号驱动IO,IO多路复用,异步IO,其中前四个被称之为同步IO。

是否等待IO的执行结果就是同步IO与异步IO的区别,等待IO的执行结果就是同步,不等待就是异步。

阻塞IO

阻塞的意思就是一直等着。
在C语言中非常有代表性的库函数就是scanf函数

在这里插入图片描述

非阻塞IO

非阻塞IO就是不等着。

在这里插入图片描述

IO多路复用

多了一个select函数,select函数里面的一个参数是文件描述符的集合。通过它来对这些文件进行监听。当某个文件描述就绪的时候就对这个文件描述符进行处理。

在这里插入图片描述

信号驱动IO

在这里插入图片描述

异步IO

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_28877125/article/details/128407272