第五章-IO管理
I/O设备的电子部件:CPU无法直接控制I/O设备的机械部件,因此I/O设备还要有一个电子部件座位CPU和I/O设备机械部件的“中介”,用于实现CPU对设备的控制。
I/O控制器的功能:
- 接受和识别CPU发出的命令:I/O控制器中会有相应的控制寄存器,来存放命令和参数
- 向CPU报告设备的状态:会有响应的状态寄存器,用于记录I/O设备的当前状态
- 数据交换:设置响应的数据寄存器
- 地址识别:需要给各个寄存器设置一个特定的“地址”
- 一个I/O控制器可能会对应多个设备
- 数据存储器、控制寄存器、状态机村可能有多个(内存映像I/O、寄存器独立编址)
- 内存映射I/O:控制器中的寄存器与内存统一编制,可以采用堆内存进行操作的指令来对控制器进行操作
- 寄存器独立编制:控制器中的寄存器独立编址,需要设置专门的指令来操作控制器
I/O控制方式
程序直接控制方式
cpu会向I/O模块进行轮询检查,判断所对应的I/O模块的状态,从而进行相关操作。
CPU干预很频繁,I/O操作开始之前、完成后需要CPU介入,并且在等待I/O完成的过程中CPU需要不断地轮询检查。
每次读写一个字,每个字的读写都需要CPU帮助
- 优点:实现简单
- 缺点:CPU和I/O设备只能串行工作,CPU需要移植轮询检查,长期处于“忙等”状态,CPU利用率低。
中断驱动方式
引入中断机制。由于I/O设备速度很慢,因此在CPU发出读/写命令后,可将等待I/O的进程阻塞,先切换到别的进程执行。当I/O完成后,控制器回想CPU发出一个中断信号,CPU检测到中断信号后,会保存当前进程的运行环境信息,转去执行中断处理程序该中断。处理终端过程中,CPU从I/O控制器读一个字的数据传送到CPU寄存器,再写入主存。接着,CPU恢复等待I/O的进程的运行环境,然后继续执行。
- CPU会在每个指令周期的末尾检查中断
- 中断处理过程中需要保存、恢复进程的运行环境,这个过程是需要一定时间开销的。如果中断发生的频率过高,会降低系统性能。
每次读/写一个字
- 优点:CPU和I/O设备并行工作,CPU利用率得到明显提升
- 缺点:频繁的中断处理会消耗较多的CPU时间
DMA方式
直接存储器存取。主要用于块设备的I/O控制。数据的传送单位是“块”,多个块必须是连续存放,仅在传送一个或多个数据块的开始和结束时才需要CPU干预。
DMA控制器(==本身就是I/O设备==):
- DR(数据寄存器):暂存从设备到内存,或从内存到设备的数据
- MAR(内存地址寄存器):在输入时,MAR表示数据应放到内存中的什么位置;输出时MAR表示要输出的数据放在内存中的什么位置
- DC(数据计数器):表示剩余要读/写的字节数
- CR(命令状态寄存器):用于存放CPU发来的I/O命令,或设备的状态信息
优点:数据传输效率增加,CPU利用率高。
缺点:读取离散的块需要执行多条I/O指令,进行多次中断处理才能完成。
通道控制方式
通道可以识别并执行一系列通道指令。
与CPu相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中,也就是说通道与CPU共享内存。
- 优点:实现复杂,需要专门的通道硬件支持
- 缺点:CPU、通道、I/O设备可并行工作,资源利用率高
I/O软件层次
- 用户层软件:实现了与用户交互的接口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作(SPOOLING技术)
- 设备独立性软件:用户层软件将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务
- 设备驱动程序:向上层提供统一的调用接口;设备的保护;差错处理;设备的分配与回收;数据缓冲区管理;建立逻辑设备名到物理设备名的映射关系:根据设备类型选择调用相应的驱动程序(逻辑设备表LUT)
- 中断处理程序:根据中断信号类型找到中断处理程序并执行
输入输出应用接口
- 字符设备接口:get/put
- 块设备接口:read/write、seek(寻址)
- 网络设备接口:socket、bind、connect、read/write
阻塞I/O:应用程序发出I/O系统调用,进程需转为阻塞态等待
非阻塞I/O:应用程序发出I/O系统调用,系统调用可迅速返回,进程无需阻塞等待
设备驱动程序接口会被统一规定好
I/O核心子系统
SPOOLING系统
引入脱机技术后,缓解了CPU与慢速I/O设备的速度矛盾。另一方面,即使CPU在忙碌,也可以提前将数据输入到磁带;即使慢速的输出设备正在忙碌,也可以将数据输出到磁带。
SPOOLING技术需要多道批道程序支持
设备的分配
设备的固有属性:独占设备、共享设备、虚拟设备
从进程运行的安全性上考虑:
- 安全分配方式:为进程分配一个设备后就将进程阻塞,本溪I/O完成后才将进程唤醒
- 不安全分配方式:进程发出I/O请求后,系统为其分配I/O设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞(==死锁避免==)
根据进程的分配过程: - 静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源(破坏了“请求和保持”条件,不会发生死锁)
- 动态分配:进程运行过程中动态申请设备资源
设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)、系统设备表(记录系统全部设备情况)
设备分配步骤:
- 根据进程请求的物理设备名查找系统设备表(物理设备名是进程请求分配设备时提供的参数)
- 根据系统设备表找到设备控制表,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
- 根据设备控制表找到控制器控制表,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙陆泽将控制器分配给进程
- 根据控制器控制表找到通道控制表,若通道忙碌则将进程PCb挂到通道等待队列中,不忙碌则将通道分配给进程
缺点:
- 底层细节对用户不透明,不方便编程
- 换物理设备则程序无法运行
- 若进程请求的物理设备正在忙碌,则机试系统中还有同类型的设备,进程也必须阻塞等待
改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名
缓冲区
缓冲区是一个存储区域,可以有专门的硬件寄存器组成,也可利用内存作为缓冲区。
使用硬件作为缓冲区的成本较高,容量也较小,一般金庸在队速度要求非常高的场合。
缓冲区的作用:
- 缓和CPU与I/O设备之间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
- 解决数据粒度不匹配的问题
- 提高CPU与I/O设备之间的并行性
单缓冲
操作系统在主存中为一个进程分配一个缓冲区。当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。
双缓冲
处理一个数据块的平均耗时为MAX(T,C+M)
循环缓冲区
将多个大小相等的缓冲区链接成一个循环队列
缓冲池
缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数据的缓冲队列、装满输出数据的缓冲队列
磁盘调度算法
寻找时间(寻道时间):在读/写数据前,将磁头移动到制定此岛所花的时间
延迟时间:通过旋转磁盘,使磁头定位到目标扇区所需要的时间
传输时间:从磁盘读出或向磁盘写入数据所经历的时间。
先进先出算法、最短寻找时间优先(容易产生饥饿现象)、扫描算法(SCAN)、LOOK调度算法(边移动边观察)、循环扫描算法(C-Scan,磁头返回时直接快速移动至起始端而不处理任何请求)、C-LOOK算法
减少延迟时间的方法:
- 交替编号:让逻辑上相邻的扇区在物理上有一定的间隔,可以实读取连续的逻辑扇区所需要的延迟时间更小
- 错位命名
磁盘管理
一个扇区通常可划分为头、数据区域、尾。
完整的自举程序放在磁盘的启动块(引导块),启动块位于磁盘的固定位置。
- 标题: 第五章-IO管理
- 作者: XCurry
- 创建于 : 2024-09-13 21:15:00
- 更新于 : 2024-09-17 13:33:49
- 链接: https://github.com/XYXMichael/2024/09/13/操作系统/第五章-IO管理/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。