北航OS课程笔记--五、设备管理
设备管理
IO管理概述
接入I/O设备的主要方式:总线。

- 逻辑IO:完成设备无关的操作,如设备分配、设备回收、数据准备等。
- 设备驱动程序:负责对设备控制器进行控制
- 中断服务程序:设备工作结束后负责向CPU中发中断信号,中断服务程序完成相应处理。
IO设备的分类:
按数据组织分类:
- 块设备:以数据块为单位存储、传输信息。传输速率较高,可寻址(随机读写)
- 磁盘
- 字符设备:以字符为单位存储、传输信息。传输速率低,不可寻址
- 鼠标、键盘
- 常采用中断驱动的方式
按用途分类:
- 存储设备
- 传输设备
- 人际交互设备
从资源分配角度:
- 独占设备
- 共享设备
- 虚设备
IO管理的目标:
- 按用户请求,控制设备操作,完成IO设备与内存间的数据交换,最终完成用户的IO请求。
- 建立方便、统一的独立于设备的接口
- 提高CPU与设备、设备与设备之间的并行工作能力,充分利用资源
- 保护:保护传输的数据的安全性。
IO硬件组成
设备控制器
功能:
- 接收和识别CPU命令
- 数据交换:CPU与控制器、控制器与设备
- 设备状态的了解和报告
- 设备地址识别
- 缓冲区
- 对设备传来的数据进行差错检测
组成:
- 控制器与CPU接口:数据寄存器、控制寄存器、状态寄存器
- 控制器与设备接口:数据信号、控制信号、状态信号
- IO逻辑:用于实现CPU对IO设备的控制
IO端口地址
接口电路中,每个寄存器具有唯一的地址。
IO指令的形式与IO地址是相互关联的:内存映像IO模式(内存映像编址)和IO独立编址(IO专用指令)
-
内存映射IO的特点:
控制器的内存/寄存器作为物理内存空间的一部分。
优点:
- 不需要特殊的保护机制来组织用户进行相应的IO操作,操作系统要避免把包含了控制寄存器的那部分地址空间放入用户的虚拟地址空间中
- 可以引用内存的每一条指令 都适用于引用控制寄存器
缺点:
- 不能通过高速缓存。
-
IO独立编址的特点:
Intel体系架构in/out指令。
优点:
- 外设不占用内存空间
- 编程时易于区分是对内存操作还是对IO操作。
缺点:
- IO端口操作的指令类型少,操作不灵活
IO控制方式
IO控制技术有:
- 程序控制IO
- 中断驱动方式
- 直接存储访问DMA
- 通道技术
以上从上往下,越来越高效(CPU被打断少),但硬件代价越来越高。
程序控制IO(轮询方式)

- CPU提出一个读数据的请求,IO设备启动,状态为未就绪;数据准备好后状态修改为就绪。
- 设备驱动程序检查设备的状态
- 如果状态正常,就给设备发出相应的控制命令
- 不断去测试这个设备是否完成了这次执行过程,实际上就是一个轮询
- 设备控制器完成操作,把数据送给CPU,再传入内存
- 应用程序继续进行相应的处理。

-
这种方式CPU的干预频率很高,CPU效率低
-
实现简单
-
数据传送单位:字
-
数据流向:IO——CPU寄存器——内存
(读操作从左到右;写操作相反)
中断驱动方式

-
用户程序提出IO请求
-
设别驱动程序检查设备的状态
-
如果设备已经准备好,那么就向设备发出控制命令
-
将状态记录在设备状态表中,CPU继续其他工作
-
设备完成工作后向CPU发中断信号,转入中断处理程序
-
中断处理程序在确定正确完成任务后,把结果提交给设备管理程序
完成后,由设备控制器主动通知设备驱动程序,而不是让设备驱动程序不断询问。
-
设备管理程序从设备状态表中查询是哪一个请求的完成
-
把相应的数据送到应用程序
-
通知应用程序可以继续执行
- 优点:提高了CPU利用率,可以处理不确定事件。
- 缺点:每次输入/输出一个字数据都要中断CPU,多次中断浪费CPU时间,只适于数据传输率较低的设备。
- 数据传送单位:每次读/写一个字
直接存储访问方式(DMA)
主要用于对块设备的控制。
- 由程序设置DMA控制器中的若干寄存器值(内存始址,传送字节数等),然后发起IO操作。
- DMA控制器完成内存与外设的成批数据交换
- 在操作完成时DMA控制器向CPU发出中断。
- 数据的流向不再经过CPU,CPU只需在IO操作的开始和结束时干预,适用于高速设备。
- 读写单位比那位一个或多个块(PS:多个块在读入和写出后必须连续)
- 每个设备占用一个DMA控制器,当设备增加时,需要增加新的DMA控制器。
IO通道控制方式
通道:一种硬件,可以识别并执行一系列通道指令。
- CPU向通道发出IO指令,指明通道程序在内存中的位置,并指明要操作哪个IO设备(提供了一个任务清单)。
- 通道执行内存中的通道程序。
- 通道执行完任务后,向CPU发出中断信号。
特点:
- 通道的程序放在主机内存中,即通道与CPU共享内存。
- 每次可以读/写一组数据块
- 资源利用率很高,但需要特殊的通道硬件支持。
- 相比DMA,通道有自己的指令和程序,有更强的独立处理IO的功能;一个通道可以同时控制多种设备。
IO软件组成
分层设计思想:把IO软件组织称多个层次。

设备独立性软件
即设备无关性软件。
主要实现的功能:
-
对上层提供接口
-
设备的保护(类似文件保护)
-
IO调度、分配与回收管理、缓冲区管理
-
建立逻辑设备名到物理设备名的映射关系,根据设备类型选择调用相应的驱动程序。
通过逻辑设备表LUT来记录映射关系以及找到对应的驱动程序。
管理LUT的方式:
- 整个系统只设置一张LUT,只适合单用户操作系统
- 为每个用户设置一张LUT,各个用户使用的逻辑设备名可以重复,适用多用户操作系统。LUT存放在用户管理进程的PCB中。
实现设备独立性后带来的好处:
- 设备分配时的灵活性:同类设备共同参与分配
- 易于实现IO重定向:用于IO操作的设备可以更换,而不用改变应用程序。
设备驱动程序
主要负责对硬件设备的具体控制,将上层发出的一系列命令转化为特定设备的一系列操作。
每个设备驱动程序处理一种设备类型。
包括设置设备寄存器、检查设备状态、释放命令、监督运行等。
特点:
- IO进程与设备控制器之间的通信程序
- 驱动程序与IO设备的特性、IO控制方式紧密相关
- 与硬件紧密相关
工作列表 | 对应层次 |
---|---|
用户进程请求打印一个输出文件 | 用户层 |
将一维磁盘块号转换为三维物理地址(柱面、磁道和扇区) | 设备驱动程序 |
获得设备驱动程序的入口地址 | 设备独立性软件 |
将终端输入的字符转换为ASCⅡ码 | 设备独立性软件 |
设备驱动进程被唤醒 | 中断处理程序 |
向设备寄存器写命令 | 设备驱动程序 |
检查用户是否有权使用设备 | 设备独立性软件 |
将二进制整数转化成ASCⅡ码以便打印 | 用户层 |
维护一个最近使用块的缓存 | 设备独立性软件 |
IO缓冲管理
缓冲技术可以提高外设利用率。在设备无关软件实现。
缓冲区在内存中。
单缓冲:一个缓冲区
缓冲区数据非空时,不能往其中冲入数据;缓冲区为空时,可以往缓冲区冲入数据,但必须在缓冲区充满后,才能把数据传出。(默认一个缓冲区大小就是一块)
其中T和C可以并行。
所以单块数据的平均处理时间:M+max(T,C)。
双缓冲:两个缓冲区
如果C<T,则块设备可以连续输入;
T<C,则CPU可以连续处理。
单块数据平均处理时间:Max(C,T)
注意王道版平均耗时:Max(T,C+M)
下图基于T>C+M的情况。

环形缓冲
CPU与外设的处理速度差过大,双缓冲效果不够理想,引入多缓冲机制,可以将多个缓冲区组织成循环缓冲形式。
组成如下:
- 空缓冲区R,和指向下一次可用的空缓冲区的指针Nexti;
- 已装满缓冲区G,和指向计算进程下一次可用的G缓冲区的Nextg;
- 正在使用的工作缓冲区C,和指针Current。
缓冲池
包括三种类型的缓冲区(队列):
- 空缓冲区
- 装满输入数据的缓冲区
- 装满输出数据的缓冲区
IO设备管理
外设资源有限,在分配外设上有两种常见的做法:
- 进程间交替使用外设,如鼠标和键盘
- 通过一个虚拟设备把外设和应用进程隔开
需要的数据结构
-
设备控制表DCT:用于记录设备的使用情况
-
控制器控制表COCT:每个设备控制器都会对应一张COCT。
-
通道控制表CHCT:每个通道对应一张CHCT。
-
系统设备表SDT:记录了系统中全部设备的情况,每个设备对应一个表目。
设备分配过程
- 分配设备:根据进程请求分配时提供的物理设备名查SDT,找到对应的设备控制器表DCT
- 分配设备控制器:在DCT中找相应的控制器控制表COCT
- 分配通道:从COCT中找到对应的CHCT。
SPOOLing技术
假脱机技术,使用软件的方式模拟脱机技术,在用户层软件实现。
在多道程序系统中,专门利用一道程序来完成对设备的IO操作,无需使用外围IO处理机。
系统由三部分组成:
- 输入井和输出井:模拟脱机输入/输出时的磁盘,在磁盘上。输入井暂存IO设备输入的数据,输出井暂存用户程序和输出数据。
- 输入缓冲区和输出缓冲区:在内存中。缓和CPU和磁盘之间速度不匹配。
- 输入进程SPi和输出进程SPo:利用两个进程来模拟脱机IO时的外围控制机。
输入设备—>输入缓冲区—>输入井—>内存
内存—>输出井—>输出缓冲区—>输出设备
特点:
-
高速虚拟IO操作
-
实现对独享设备的共享:由SPOOLing程序提供虚拟设备(把一台物理设备虚拟成多台虚拟设备),可以对独享设备依次共享使用。
采用SPOOLing技术实现的共享设备,在同一时刻可以让多个进程使用它进行I/O。( F )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)