I/O 设备
I/O 设备分类
按使用特性分类
人机交互类外设:如鼠标打印机键盘等。数据传输慢。
存储设备:移动硬盘、光盘等,数据传输速率快。
网络通信设备:调制解调器等用于网络通信,速度中等。
按速率分类
低速设备:鼠标键盘。
中速:激光打印机。
高速:移动硬盘等。
按信息交换的单位分类
块为单位:磁盘。
字符为单位:鼠标键盘等。
I/O 控制器
IO设备包括:
- 机械部件:用于执行具体 IO 操作的,如鼠标按钮、显示器屏、磁盘盘面。
- 电子部件:插入主板扩充槽的印刷电路板。
CPU 要通过 IO 控制器作为中介才能控制机械部件。
一个 IO 控制器可能控制多个设备;而且可能有多个寄存器。有的操作系统让这些寄存器存到内存里,叫做内存映像 IO;有的采用专门的地址,即寄存器独立编址。独立编址不在内存里,因此还要设置专门的指令来实现对其的操作,还要指明具体对哪个控制器操作。
IO 控制方式
关注:一次读写操作的流程;CPU 干预的频率;数据传送单位;数据流向;优缺点。
程序直接控制
读:
重点在轮询。CPU要不断轮询。
数据传送单位:每次一个字。
数据流向:内存和 IO 设备经由 CPU 读写。每个字读写都需要 CPU 帮助。
简单,但是 CPU 和 IO 只能串行工作,CPU 一直轮询检查效率也很低。
中断驱动方式
CPU 发出读写命令后,等待 IO 的进程暂时阻塞,先运行其他程序。IO 完成后控制器会向 CPU 发一个中断信号,CPU 收到后继续执行。
CPU 执行完每个指令的周期末尾检查中断。中断处理过程需要保存、恢复进程的运行环境,也需要一定时间开销。
CPU 只有 IO 开始时干预一下,等待 IO 过程中就运行其他进程了。
数据传送单位:每次一个字。
数据流向:内存和 IO 设备经由 CPU 读写。每个字读写都需要 CPU 帮助。
相比程序直接控制,CPU 利用率高一点了。但是一个字一个字的传,速度还是慢。
DMA 方式
数据传输单位是块;设备和内存之间数据传输不用每次都经过 CPU ,只有开始传输或结束时才需要干预。
缺点:CPU 每发一条 IO 指令,只能读写几次连续的数据块。离散的数据块就要多次中断。
通道控制方式
通道相当于简化版的 CPU。CPU向通道发出指令,指明通道程序在内存中的位置,并指明要操作的是哪个 IO 设备,然后 CPU 就去运行其他程序了。
通道能执行的指令很单一,而且放在内存中。
CPU 干预次数极少,效率也高,就是需要专门的通道程序支持。
I/O 软件层次
设备独立性软件:向上提供接口(入库函数)。校验用户是否有权限使用当前设备。差错处理。分配和回收设备。管理数据缓冲区。建立逻辑设备名到物理设备名的映射,并根据实际的物理设备选择合适的驱动程序。
可以只设立一个系统 LUT,但是所有用户的逻辑设备名不能重复;也可以给每个用户设计一个。
为什么不同设备驱动程序也不同?因为不同设备内部结构也不一样。比如不同打印机内部寄存器数量可能不一样。驱动程序一般作为单独的进程。
设备驱动程序:主要负责具体控制硬件设备。
中断处理程序:IO 顺利完成后,进行中断处理。并从设备读入一个字长的数据。
I/O 核心子系统
假脱机技术
脱机技术是什么?我们记得最早期的计算机是人手动打孔纸带放入计算机中的,因为人打孔太慢,CPU 运行再快也得等着。
批处理几段引入了脱机输入,先通过外围控制机把数据输入到更快速的磁带上再让主机读入。脱机指的是脱离主机控制的 IO 操作。
不仅 IO 快了,而且 CPU 忙的时候用户也可以先处理数据到磁带上。
假脱机技术 SPOOLing 用软件模拟脱机技术。
输入输出进程模拟外围控制机。
借助 SPOOLing 技术,可以让打印机实现共享。收到用户的打印请求时,在输出井里申请空闲缓冲区(在磁盘上),并放入要打印的数据;且给用户进程申请一张空白的打印请求表,里面存储打印的相关信息,并把该表挂到假脱机文件队列上。打印机空闲时从队列中取出打印请求表,根据表取出打印的数据到输出缓冲区,再到打印机打印。
设备的分配和回收
分配设备要考虑:设备属性(独占?共享?虚拟?虚拟就是假脱机技术等独占改成共享)。设备分配算法(FCFS 优先级高的优先 短任务优先)。安全性。
分配分为静态分配和动态分配。
设备分配管理中的数据结构
设备控制表 DCT
控制器控制表 COCT
通道控制表 CHCT
系统设备表 SDT
设备分配步骤
- 根据进程的物理设备名,去 SDT 找设备。
- 根据 SDT 找 DCT,空闲就直接把设备分给这个进程,忙碌就把这个进程的 PCB 挂到设备等待队列中。
- 根据 DCT 找到 COCT,空闲就分配,不空闲就等待。
- 根据 COCT 找到 CHCT,空闲就分配,不空闲就等待。
以上方法缺点在于用户要知道物理设备名,不透明;而且只指定这一个设备,如果该设备坏了或者堵塞哪怕其他设备能用也无法切换。
可以建立逻辑设备,用逻辑设备找物理设备。
SDT 中设备类型就是逻辑设备名。
通过逻辑设备表 LUT 建立逻辑设备名和物理设备名之间的映射关系。
缓冲区
缓冲区是一个存储区域,可以用专门的硬件寄存器,也可以用内存做。速度快,成本高,容量小,比如快表。本节中介绍的主要是内存缓冲区。
可以缓冲 CPU 和 IO 之间速度不匹配的矛盾,进而 CPU 中断次数也会减少;解决数据颗粒度不匹配的问题;提高 CPU 与 IO 的并行性。
单缓冲区
某用户进程请求设备读入若干个块的数据。。如果采用单缓冲策略,主存中会被分配一个缓冲区(一般是一个块大小)。缓冲区中只有空的时候才能冲入数据,只有非空的时候才能传出数据。
双缓冲区
一满一空,可以空的边读,满的边往工作区写。
用时=Max(C+M, T)
如果两台机器各配置2个缓冲区,就能同时收发了。
循环缓冲区
多个大小相同的缓冲区链接成一个循环队列。
缓冲池
放满了各种各样缓冲区的池子。
输入:取出一个空缓冲区挂到收容输入队列中,输入放到收容输入队列中,装好了挂到输入队列中。
提取输入:从输入队列取下来,放到提取输入队列中提取到用户进程,再挂回空缓冲区。