前置:简单的个人学习笔记上传,仅供参考,想要md文档的可以评论留言
参考内容
CSDN博主 BitHachi的博文 《王道操作系统》学习笔记总目录+思维导图
CSDN博主 小林coding的图解操作系统
5 I/O管理
5.1 I/O管理概述
5.1.1 I/O设备
-
I/O设备概念
-
I/O设备就是可以将数据输入到计算机或者可以接收计算机输出数据的外部设备,属于计算机中的硬件设备。
在UNIX系统中,外部设备被抽象为特殊的文件,用户可以使用与文件操作相同的方式对外部设备进行操作。
-
-
I/O设备的分类
-
按照使用特性分类
- 人类交互类外部设备
- 鼠标,键盘,打印机等
- 存储设备
- 移动硬盘,光盘等
- 网络通信设备
- 调制解调器等
- 人类交互类外部设备
-
按照传输速率分类
- 低速设备
- 每秒几个到几百个字节,如键盘,鼠标等
- 中速设备
- 每秒传输数千至上万个字节,如激光打印机等
- 高速设备
- 每秒传输数千字节至数千兆字节,如硬盘等
- 低速设备
-
按照信息交换的单位分类
- 块设备
- 传输速率较高,可以寻址,对它可以随机的读/写任意一块
- 如磁盘等,数据传输的基本单位时块
- 字符设备
- 传输速率较慢,不可寻址,输入输出时常采用中断驱动的方式
- 鼠标,键盘等,数据传输的基本单位是字符
- 块设备
-
5.1.2 I/O控制器
-
I/O设备的组成
- 机械部件
- 主要用来执行具体的I/O操作,如鼠标,键盘的按键,显示器的LED屏等
- 电子部件—I/O控制器(设备控制器):通常是一块插入主板扩充槽的印刷电路板
- 接受和识别CPU发出的命令
- 通过I/O控制器中的控制寄存器来存放命令和参数
- 向CPU报告设备的状态
- 状态寄存器用于记录I/O设备的当前状态
- 数据交换
- 数据寄存器,输入时数据寄存器暂存设备发来的数据,之后CPU从数据寄存器中取走数据。输出时,数据寄存器用于暂存CPU发来的数据,之后再由控制器传送设备
- 地址识别
- 需要给寄存器设置一个特定的地址,I/O控制器通过CPU提供的地址判断来判断CPU要读/写哪个寄存器
- 接受和识别CPU发出的命令
- 机械部件
-
I/O控制器的组成
注:
1:一个I/O控制器可能对应多个设备
2:数据寄存器,控制寄存器,状态寄存器可能有多个,且这些寄存器都要有相应的地址才能方便CPU操作。
- I/O控制器的两种寄存器编址方式
- 内存映像I/O—独立编址
- 控制器中的寄存器与内存地址统一编址
- 优点:
- 简化了指令,可以采用对内存进行操作的指令来对控制器进行操作
- 寄存器独立编址
- 寄存器独立编址,I/O控制器中的寄存器使用单独的地址
- 缺点:
- 需要专门的指令来实现对控制器的操作,不仅要指明寄存器的地址,还要置命控制器的编号
- 内存映像I/O—独立编址
5.1.3 I/O控制方式
-
程序直接控制方式
-
CPU轮询等待,CPU需要一直轮询检查,长期处于“忙等”状态,CPU利用率很低。
-
每个字的读写都需要CPU的帮助。
-
-
中断驱动方式
-
I/O控制器通过中断信号主动报告CPU相应的I/O已经完成,CPU不用再轮询,CPU和I/O设备可以并行工作,CPU利用率得到提升。
-
每个字在I/O设备与内存之间的传输都需要经过CPU,频繁的中断处理会消耗CPU时间
-
-
DMA(Direct Memory Access)方式(直接内存访问)
-
DMA方式的主要特点:
- 它使主存与CPU的固定联系脱钩,主存即可被CPU访问,又可被外设访问。
- 在数据块传送时,主存地址的确定、传送数据的计数等都由硬件电路直接实现。
- 主存中要开辟专用缓冲区,及时供给和接收外设的数据。
- DMA传送速度快,CPU和外设并行工作,提高了系统效率。
- DMA在传送开始前要通过程序进行预处理,结束后要通过中断方式进行后处理。
-
DMA控制区的主要功能
- 接受外设发生的DMA请求,并向CPU发出总线请求。
- CPU响应此总线请求,发出总线响应信号,接管总线控制权,进入DMA操作周期。
- 确定传送数据的主存单元地址及长度,并能自动修改主存地址计数和传送长度计数。
- 规定数据在主存和外设间的传送方向,发生读写等控制信号,执行数据传送操作。
- 向CPU报告DMA操作的结束。
-
DMA控制器构成
- DR (Data Register,数据寄存器):暂存从设备到内存,或从内存到设备的数据。
- MAR(Memory Address Register,内存地址寄存器):在输入时,MAR表示数据应放到内存中的什么位置;输出时MAR表示要输出的数据放在内存中的什么位置。
- DC (Data Counter,数据计数器):表示剩余要读/写的字节数。
- CR(Command Register,命令/状态寄存器):用于存放CPU发来的1/0命令,或设备的状态信息。
-
-
通道控制方式
- 可以每次读/写一组数据块,CPU,I/O设备,通道可以并行工作,资源利用率高。
- 实现复杂,需要专门的硬件支持
5.1.4 I/O软件的层次结构
-
软件层次
-
用户层软件
- 实现了与用户交互的接口,用户通过接口中提供的库函数对设备进行操作,库函数封装了系统调用,通过系统调用进一步请求操作系统内核的服务
-
设备独立性软件
- 向上层提供统一的调用接口(如read/write系统调用)
- 设备的保护(不同的用户对不同的设备有不同的权限)
- 差错处理
- 设备的分配与回收
- 数据缓冲区管理
- 建立逻辑设备名到物理设备之间的映射关系,根据设备类型选择调用相应的驱动程序。
- 通过逻辑设备表(Logical Unit Table,LUT)确定逻辑设备对应的物理设备,并找到对应的设备驱动程序
-
设备驱动程序
-
主要负责对硬件设备的具体控制,将上层发出的一系列命令转化成特定设备能够识别的操作,包括设置设备寄存器,检查设备状态等
-
不同的设备有不同的硬件特性,需要厂商分别实现
注:驱动程序一般会以一个独立进程的方式存在
-
-
中断处理程序
- 当I/O任务完成时,I/O控制器会发送一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行
-
硬件
-
5.2 I/O核心子系统
5.2.1 I/O核心子系统及其功能
- I/O核心子系统
- 设备独立性软件
- 设备驱动程序
- 中断处理程序
- I/O核心子系统的主要功能
- 假脱机技术
- I/O调度
- 设备保护
- 设备的分配与回收
- 缓冲区管理
5.2.2 I/O调度与假脱机技术
-
I/O调度算法
- 第一种,没有调度算法,是的,你没听错,它不对文件系统和应用程序的/O做任何处理,这种算法常用在虚拟机/O中,此时磁盘/O调度算法交由物理机系统负责。
- 第二种,先入先出调度算法,这是最简单的1/O 调度算法,先进入I/O 调度队列的I/O请求先发生。
- 第三种,完全公平调度算法,大部分系统都把这个算法作为默认的I/O 调度器,它为每个进程维护了一个1/O调度队列,并按照时间片来均匀分布每个进程的I/O请求。
- 第四种,优先级调度算法,顾名思义,优先级高的I/O请求先发生, 它适用于运行大量进程的系统,像是桌面环境、多媒体应用等。
- 第五种,最终期限调度算法,分别为读、写请求创建了不同的 /O 队列,这样可以提高机械磁盘的吞吐量,并确保达到最终期限的请求被优先处理,适用于在/O压力比较大的场景,比如数据库等。
-
假脱机技术(SPOOLing 技术)
5.2.3 设备的分配与回收
设备分配时应该考虑的因素
-
设备的固有属性
- 独占设备
- 共享设备
- 虚拟设备
-
设备分配算法
- 先来先服务
- 优先级高者优先
- 短任务优先
- …
-
设备分配中的安全性
- 安全分配方式:为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒
- 破坏了“请求和条件”,不会出现死锁
- CPU和I/O设备只能串行
- 不安全分配方式:进程发出I/O请求后,系统为其分配I/O设备,进程可以继续执行,之后还可以发出新的I/O请求,只有某个I/O请求得不到满足时才将进程阻塞
- CPU和I/O设备可以并行处理
- 有可能发生死锁
- 安全分配方式:为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒
-
静态分配和动态分配
-
静态分配
- 进程运行前为其分配全部所需的资源,运行结束后归还资源
-
动态分配
- 进程运行过程中动态申请设备资源
-
-
设备管理:一个通道可以控制多个设备控制器,一个控制器可以控制多个设备
- 通道
- 控制器(多个)
- 设备(多个)
- 控制器(多个)
- 通道
-
设备控制表(DCT):系统为每个设备配置一张DCT,用于记录设备的情况
-
控制器控制表(COCT):每个设备控制器都对应一张COCT,操作系统根据COCT的信息对控制器进行操作和管理
-
通道控制表(CHCT):每个通道对应一张CHCT,操作系统根据CHCT的信息对通道进行操作和管理
-
系统设备表(SDT):记录了系统中全部设备的情况,每个设备对应一个表目
-
设备分配的步骤
-
未改进:
- 根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)。
- 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
- 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
- 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
只有设备,控制器,通道三者都分配成功时,设备的分配才算成功,之后便可以启动I/O设备进行数据传输
-
改进后
- 根据进程请求的逻辑设备名查找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型”)
- 查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
- 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
- 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进
-
5.2.4 缓冲区管理
-
缓冲区:一个专门的存储区域,可以有专门的硬件寄存器组成,也可以用内存作为缓冲区
-
缓冲区的作用
- 缓和CPU和I/O设备之间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断相应时间的限制
- 解决数据粒度不匹配的问题
- 提高CPU与I/O设备之间的并行性
-
缓冲区分类
-
单缓冲:同一时刻只能实现单向通信
- 缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出
- 缓冲区数据为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出
-
双缓冲:同一时刻可以实现双向通信
-
循环缓冲区
- 将多个大小相等的缓冲区链接成一个循环队列
-
缓冲池:由系统中共用的缓冲区组成
- 按照使用状况可以分为:
- 空缓冲队列
- 输入队列:装满输入数据的缓冲队列
- 输出队列:装慢输出数据的缓冲队列
- 按照实际运算中扮演的功能可以分为:
- 用于收容输入数据的工作缓冲区(hin)
- 用于提取输入数据的工作缓冲区(sin)
- 用于收容输出数据的工作缓冲区(hout)
- 用于提取输出数据的工作缓冲区(sout)
备
- 按照使用状况可以分为:
-
通道
- 控制器(多个)
- 设备(多个)
- 控制器(多个)
-
-
设备控制表(DCT):系统为每个设备配置一张DCT,用于记录设备的情况
[外链图片转存中…(img-gzVj37mO-1650693810857)]
-
控制器控制表(COCT):每个设备控制器都对应一张COCT,操作系统根据COCT的信息对控制器进行操作和管理
[外链图片转存中…(img-AIoNyYIx-1650693810857)]
-
通道控制表(CHCT):每个通道对应一张CHCT,操作系统根据CHCT的信息对通道进行操作和管理
[外链图片转存中…(img-2NAuqmLy-1650693810858)]
-
系统设备表(SDT):记录了系统中全部设备的情况,每个设备对应一个表目
[外链图片转存中…(img-heLaTr7D-1650693810858)]
-
设备分配的步骤
-
未改进:
- 根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)。
- 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
- 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
- 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
只有设备,控制器,通道三者都分配成功时,设备的分配才算成功,之后便可以启动I/O设备进行数据传输
-
改进后
- 根据进程请求的逻辑设备名查找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型”)
- 查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
- 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
- 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进
[外链图片转存中…(img-tygUMF1b-1650693810858)]
-
5.2.4 缓冲区管理
-
缓冲区:一个专门的存储区域,可以有专门的硬件寄存器组成,也可以用内存作为缓冲区
-
缓冲区的作用
- 缓和CPU和I/O设备之间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断相应时间的限制
- 解决数据粒度不匹配的问题
- 提高CPU与I/O设备之间的并行性
-
缓冲区分类
- 单缓冲:同一时刻只能实现单向通信
- 缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出
- 缓冲区数据为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出
- 双缓冲:同一时刻可以实现双向通信
- 循环缓冲区
- 将多个大小相等的缓冲区链接成一个循环队列
- 缓冲池:由系统中共用的缓冲区组成
- 按照使用状况可以分为:
- 空缓冲队列
- 输入队列:装满输入数据的缓冲队列
- 输出队列:装慢输出数据的缓冲队列
- 按照实际运算中扮演的功能可以分为:
- 用于收容输入数据的工作缓冲区(hin)
- 用于提取输入数据的工作缓冲区(sin)
- 用于收容输出数据的工作缓冲区(hout)
- 用于提取输出数据的工作缓冲区(sout)
- 按照使用状况可以分为:
- 单缓冲:同一时刻只能实现单向通信