除了 cpu资源管理、内存管理、文件管理外,操作系统还有一个重要的功能,就是管理连接到计算机的所有输入输出设备(简称 i/o 设备),包括鼠标、键盘、显示器、打印机、硬盘、usb 设备等等。
如同将操作系统中的文件管理功能称为文件系统,我们习惯将操作系统中实现设备管理的部分功能称为 i/o 系统。
i/o 设备的分类
i/o 设备的分类标准有很多,表 1 为大家罗列了一些常见的分类标准。
分类标准 | i/o 设备类别 |
---|---|
按使用特性分类 | 分为存储型设备、输入型设备、输出型设备以及输入/输出型设备。 其中输入型设备指的是 cpu 从中读取数据的设备;输出型设备指的是接收数据的设备。 |
按数据组织分类 | 分为字符设备和块设备。 字符设备指的是以单个字符为单位传输数据的 i/o 设备,传输速率较低,例如交互式终端、打印机等;块设备指的是以数据块为单位传输数据的 i/o 设备,传输速率高,例如硬盘。 |
按外部设备的从属关系分类 | 分为系统设备和用户设备。 系统设备指的是安装操作系统时就已经登记在系统中的 i/o 设备;除系统设备外的,都属于用户设备。 |
按资源的分配角度分类 | 分为独占设备和共享设备。 独占设备指的是一段时间内只允许一个进程使用的设备;共享设备指的是一段时间内允许多个进程同时使用的设备。 |
当然,i/o 设备的分类标准还有很多,这里不再一一举例。
设备控制器
设备控制器又称适配器,是计算机中的一种硬件设备。设备控制器扮演着 cpu 和 i/o 设备之间的中介(中间人)的角色,因为 cpu 是无法直接控制 i/o 设备的,当运行的进程请求执行 i/o 操作时,cpu 需要将控制 i/o 操作的指令发送给设备控制器,由设备控制器控制相应的 i/o 设备完成操作。
因此,每个 i/o 设备都必须配备一个设备控制器,一个设备控制器可以控制多个 i/o 设备。
设备控制器具有如下几个功能:
接收并识别 cpu 发送来的指令;
实现 cpu 与 i/o 设备之间的数据交换;
设备控制器中设有状态寄存器,能够记录 i/o 设备是处于忙碌状态还是空闲状态;
具备地址识别功能 ,能够根据 cpu 发送来的指令,准确控制某一个 i/o 设备去运行;
为了解决 cpu 和 i/o 设备之间速度不匹配的问题,设备控制器中设有数据缓冲器;
能够检测 cpu 所发送指令的正确性,确定无误后,设备控制器才控制相应的 i/o 设备完成操作;反之,如果发现指令有问题,设备控制器会报告给 cpu,cpu 会重新发送一份新的指令。
i/o控制方式
所谓 i/o 控制方式,是指文件系统控制 i/o 设备工作的方式。
文件系统的整个发展历程,一直以“尽量减少 cpu 对 i/o 控制的干预,减少 i/o 操作对 cpu 执行效率的影响”为目标,先后设计了 4 种 i/o 控制方式,分别称为程序 i/o 控制方式、中断驱动 i/o 控制方式、dma 方式和通道方式。
1) 程序i/o控制方式
程序 i/o 控制方式又称程序轮询方式,每一次 i/o 操作可以完成 1 个字符的读取或者写入。
当进程请求 i/o 操作时,cpu 向设备控制器发送 i/o 指令,设备控制器根据指令启动相应的 i/o 设备,同时将设备状态设为忙碌状态(状态寄存器的值由 0 变为 1)。虽然执行的进程会因 i/o 操作转入等待状态,但进程调度程序并不会将 cpu 资源分配给其它进程。
执行 i/o 操作的过程中,cpu 会不断地检测设备控制器中记录的 i/o 设备状态是否发生改变,一旦变化(状态寄存器中的值由 1 变为 0),则表明 i/o 操作执行完毕(i/o 操作的处理结果会保存在设备控制器的数据寄存器中),cpu 会立即从设备控制器中将处理结果取出,并存储在指定的内存空间中。如此,就完成了 1 个字符的 i/o 操作。
显然,此方式最大的不足是,cpu 在整个 i/o 操作过程中一直处于检测状态,cpu 资源没有得到充分利用。
2) 中断驱动 i/o 控制方式
中断驱动 i/o 控制方式对程序 i/o 控制方式做了改进。
当进程请求 i/o 操作时,cpu 向设备控制器发送 i/o 指令,随后进程调度程序将 cpu 资源分配给其他进程使用,整个 i/o 操作由设备控制器负责完成。
当 i/o 操作完成后,设备控制器会向 cpu 发送一个中断信号,cpu 会检测 i/o 操作的处理结果,确认没有问题之后,会读取结果并将其存储到指定位置。由此,就完成了 1 个字符的读写操作。
此方式中,进程调度程序及时将 cpu 分配给其它进程使用,提高了 cpu 资源的利用率。但问题在于,每个字符的 i/o 操作都需要向 cpu 发送中断信号,频繁的中断会影响 cpu 的执行效率。
3) dma i/o控制方式
dma(direct memory access) i/o 控制方式又称直接内存访问 i/o 控制方式,进一步减少了输入输出操作对 cpu 的干扰。
此方式实现 i/o 控制的核心思想是:新增一个 dma 控制器,由它代替 cpu 控制内存和 i/o 设备之间的数据交换过程。也就是说,当进程发出 i/o 操作的请求后,cpu 会初始化 dma 控制器(例如数据的存储位置、数据量等等),同时向设备控制器发送 i/o 指令,之后 cpu 资源由进程调度程序分配给其它进程。
整个 i/o 操作过程中,dma 控制器将内存中存储的数据不断地传输给 i/o 设备(完成写操作),或者将 i/o 设备处理后的结果不断地传输到内存(完成读操作)。整个 i/o 操作完成之后,dma 控制器会发送给 cpu 一个中断信号,通知 i/o 操作完成。
dma 之所以能控制内存和 i/o 设备之间的数据传输,是因为 dma 可以窃取 cpu 系统总线的使用权,从而代替 cpu 管理数据的存入和取出。甚至于,dma 可以强迫 cpu 暂停相关工作,从而强行使用系统总线控制数据的传输。
整个 dma i/o 控制方式的实现,cpu 只需要对 i/o 操作的开始和结束阶段进行干预,数据传输过程全部都由 dma 负责控制。
相比前两种 i/o 控制方式,dma 方式可以实现对一个内存块中数据的 i/o 操作,而不再是一个字符一个字符的处理,大大减少了中断 cpu 的次数,提高了 cpu 资源的利用率。
4) i/o通道控制方式
虽然 dma 方式已经显著提高了 cpu 的利用率,但面对输入输出多个内存块数据的时候,cpu 的中断仍然比较频繁。这种情况下,可以选择 i/o 通道控制方式。
讲解 i/o 通道控制方式之前,我们先了解什么是 i/o 通道。所谓 i/o 通道,它是**于 cpu、专门控制 i/o 操作的处理器,它可以执行 i/o 控制程序(又称通道程序),一个通道程序可以处理多个内存块数据的 i/o 操作。
通道程序本质也是程序,是一些指令的集合,通道程序通常由一些读指令、写指令以及控制转移指令构成。
一个 i/o 通道可以连接多个设备控制器,一个设备控制器可以连接多个 i/o 设备,i/o 通道能够代替 cpu 实现对 i/o 设备的统一管理。
i/o 通道控制方式的实现流程是:
当进程发出 i/o 请求后,cpu 会根据请求生成相应的通道程序(存储到内存中),然后向通道发送启动 i/o 操作的指令;
通道接收到指令后,会去内存中取出通道程序,同时向 cpu 发送信号,令 cpu 执行其他工作。之后,通道开始执行通道程序,向设备控制器发送 i/o 指令,启动 i/o 设备完成相应的工作。
当通道完成最后一条指令后,会向 cpu 发送中断信号,通知 cpu 完成 i/o 操作,同时通道停止运行。
以上 4 种 i/o 控制方式中,程序 i/o 控制方式的 cpu 需要等待 i/o 操作完成后才能继续执行其它任务,这样的 i/o 控制方式称为同步 i/o 控制方式;其它 3 种 i/o 控制方式中,cpu 可以与 i/o 操作并行执行,它们统称为异步 i/o 控制方式。