嵌入式学习之Linux驱动:IO模型(1)概览
文章目录
- 什么是IO呢?
- IO执行过程
- IO模型引入
- IO模型的种类
- 阻塞IO
- 非阻塞IO
- IO多路复用
- 信号驱动IO
- 异步IO
什么是IO呢?
IO的英文全称是input和output,翻译过来就是输入和输出。
在冯诺依曼结构中,将计算机分成为5个部分:运算器、控制器、存储器、输入设备、输出设备。其中输入设备指的是向计算机输入数据或信息,如鼠标,键盘都是输入设备。输出设备指的是用于接收计算机输出信息的设备,如电脑显示器。
IO执行过程
操作系统(Linux)负责对计算机的资源进行管理,应用程序运行在操作系统上,处在用户空间。应用程序不能直接对硬件进行操作,只能通过操作系统提供的API来操作硬件。
所以当我们在进行IO操作的时候,如读写磁盘的操作,进程需要切换到内核空间才可以执行这样的操作。并且应用程序不能直接操作内核空间的数据,需要把内核空间的数据拷贝到用户空间。
一个完整的IO过程包含以下几个步骤:
- 应用程序向操作系统发起IO调用请求(系统调用)。
- 操作系统准备数据,把IO的数据加载到内核缓冲区。
- 操作系统拷贝数据,把内核缓冲区的数据从内核空间拷贝到用户/应用空间。
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函数里面的一个参数是文件描述符的集合。通过它来对这些文件进行监听。当某个文件描述就绪的时候就对这个文件描述符进行处理。