设备分配与回收
一、设备分配概述
1、核心目标
- 效率与安全平衡:在满足进程I/O需求的同时,最大化设备利用率,避免死锁 。
- 分配原则:根据设备类型(独占/共享/虚拟)采取不同策略,例如独占设备需独占分配,共享设备通过调度实现多进程交替使用 。
2、分配方式
- 静态分配:进程运行前分配全部所需设备(如独占设备),运行结束后释放。简单但资源利用率低 。
- 动态分配:进程运行时按需申请设备,灵活性高但需处理死锁风险
二、设备分配的数据结构
设备分配通过多级数据结构管理设备、控制器和通道的从属关系,确保资源调度的有序性
1. 设备控制表(DCT)
功能:记录单个设备的属性和状态,是设备分配的基础单元。
关键字段:
- 设备类型(如打印机/磁盘)和标识符(唯一物理设备名) 。
- 设备状态(忙/闲)、控制器表指针(指向所属控制器)。
- 重复执行次数:控制I/O错误重试机制 。
- 设备队列指针:管理等待该设备的进程PCB队列 。
2. 控制器控制表(COCT)
功能:管理设备控制器的状态和连接关系。
关键字段:
- 控制器标识符、状态(忙/闲。
- 通道表指针:指向所属通道,支持多通路分配(如一个控制器可连接多个通道)。
3. 通道控制表(CHCT)
- 功能:跟踪通道状态及其控制的控制器列表。
- 关键字段:
- 通道标识符、状态(忙/闲)。
- 控制器表首址:标识该通道管理的所有控制器。
4. 系统设备表(SDT)
- 功能:全局记录所有物理设备信息,是设备分配的入口。
- 关键字段:
- 设备类型、标识符、DCT指针、驱动程序入口地址 。
- 逻辑设备表(LUT):实现设备独立性,映射逻辑设备名到物理设备
设备分配流程
1、基本步骤
- 步骤1:通过物理设备名查找SDT,获取对应DCT。若设备忙,进程加入等待队列;否则分配设备 。
- 步骤2:通过DCT找到COCT,检查控制器状态。若忙则等待,否则分配控制器 。
- 步骤3:通过COCT找到CHCT,分配通道。若通道忙则等待 。
2、改进方法
- 逻辑设备名映射:用户通过逻辑设备名请求I/O,系统动态分配物理设备,提升灵活性 。
- 多通路优化:若当前控制器或通道忙,尝试其他通路,减少阻塞
三、分配策略
1、设备属性:
设备类型 | 分配策略 | 典型场景 | 关键特点 |
独占设备 | 独占分配,进程完成后释放 | 打印机、磁带机 | 互斥访问,效率低但必要 |
共享设备 | 多进程共享,需调度访问顺序 | 磁盘、网络设备 | 高并发,需避免冲突 |
虚拟设备 | 通过SPOOLing技术模拟共享 | 虚拟打印机(输出井) | 将独占设备转化为逻辑共享 |
注:虚拟设备通过输入井/输出井实现(如打印任务排队),本质是空间换时间。
2、分配算法:
1、先来先服务(FCFS)
- 原理:按请求顺序形成队列,队首优先分配。
- 优点:公平简单,适合低负载场景。
- 缺点:高优先级任务可能被阻塞(如紧急打印任务)。
2、最高优先级优先(HPF)
- 原理:按进程优先级排序,同优先级则FCFS。
- 优点:关键任务快速响应(如实时系统)。
- 缺点:低优先级进程可能“饥饿”。
安全性:
安全分配:进程发出I/O请求→阻塞→I/O完成→唤醒。(防死锁,CPU 与设备串行)。
- 特点:
- 优点:无死锁(进程阻塞时不持有资源)。
- 缺点:CPU与I/O串行,吞吐量低。
- 不安全分配:流程:进程可连续请求多个设备,仅在被占用时阻塞。
- 特点:
- 优点:高并行性(如数据库同时读写磁盘和日志)。
- 缺点:需死锁检测/预防(如银行家算法)。
- 特点:
- 分配后进程继续(可 concurrent 操作多设备,风险:死锁)。
四、分配步骤(独占设备示例-基于物理设备名)
1. 分配设备
步骤:
1、根据I/O请求中的物理设备名查找系统设备表(SDT),找到对应的设备控制表(DCT)。
2、检查DCT中的设备状态字段:
- 若忙:将进程PCB挂到设备的等待队列。
- 若空闲:将设备分配给该进程,标记为“忙”。
- 关键点:物理设备名直接绑定具体硬件,缺乏灵活性。
2. 分配控制器
步骤:
1、通过DCT中的控制器表指针找到控制器控制表(COCT)。
2、检查COCT中的控制器状态:
- 若忙:进程PCB加入控制器等待队列。
- 若空闲:分配控制器,标记为“忙”。
问题:若控制器忙,即使设备空闲也无法使用,可能降低资源利用率。
3. 分配通道
步骤:
1、通过COCT中的通道表指针找到通道控制表(CHCT)。
2、检查CHCT中的通道状态:
- 若忙:进程PCB加入通道等待队列。
- 若空闲:分配通道,标记为“忙”。
成功条件:设备、控制器、通道均分配成功,才能启动I/O操作。
缺陷:
- 设备依赖性:进程必须指定物理设备名,若设备被占用则分配失败。
- 效率问题:串行检查设备→控制器→通道,可能产生不必要的等待
4. 分配设备:
三者(设备、控制器、通道)均分配 → 发启动命令。
五、逻辑设备名分配(设备独立性)
1、改进流程
- 步骤:
- 进程使用逻辑设备名(如“打印机类”)发起I/O请求。
- 系统在SDT中查找所有该类设备的DCT,按顺序检查设备状态:
- 找到第一个空闲设备:进入控制器和通道分配流程。
- 全部忙:进程挂到该类设备的公共等待队列(而非单个设备队列)。
- 优点:
- 灵活性:可动态分配同类设备中的任意空闲设备(如多台打印机中的一台)。
- 负载均衡:避免单个设备过载。
2、实现机制
- 逻辑设备表(LUT):
- 每个进程维护一张LUT,映射逻辑设备名到物理设备名(如“PRN1”→“Printer_A”)。
- 由操作系统动态更新,对进程透明。
- 多通路支持:若当前控制器或通道忙,可尝试其他通路(需COCT/CHCT支持多路径)
六、逻辑设备名到物理设备名的映射
6.1、逻辑设备表(LUT)的核心概念
1. 功能与作用
- 设备独立性:允许进程使用逻辑设备名(如“printer1”)请求I/O,而非直接绑定物理硬件(如“Printer_A”)。
- 动态映射:系统通过LUT将逻辑设备名转换为物理设备名,并关联对应的驱动程序入口地址。
2. LUT表项结构
字段 | 说明 |
逻辑设备名 | 进程使用的设备标识(如“disk1”)。 |
物理设备名 | 实际硬件设备标识(如“DiskController0_Sector1”)。 |
设备驱动程序入口地址 | 指向驱动程序的函数指针,用于执行具体I/O操作。 |
6.2、LUT的两种设置方式
1. 全局单张LUT(单用户系统)
特点:
- 整个系统只有一张LUT,所有进程共享。
- 限制:逻辑设备名必须唯一,不同进程不能重复使用相同逻辑名。
适用场景:单用户操作系统(如早期DOS系统)。
问题:多用户环境下易冲突,安全性低。
2. 每用户独立LUT(多用户系统)
特点:
- 每个用户拥有自己的LUT,逻辑设备名仅在用户内唯一。
- 结合系统设备表(SDT)全局管理物理设备。
优点:
- 隔离性:用户A的“printer1”可映射到“Printer_A”,用户B的“printer1”可映射到“Printer_B”。
- 灵活性:支持多用户并发使用同类设备。
适用场景:现代多用户操作系统(如Linux、Windows)。
6.3、逻辑设备名映射的完整流程
1、进程请求I/O:
- 使用逻辑设备名(如“scanner1”)调用系统调用(如
open()
)。
2、查找LUT:
系统根据进程所属用户查找其LUT:
- 若命中:直接获取物理设备名和驱动程序。
- 若未命中:从SDT中选择一个空闲的同类设备,在LUT中创建新表项。
3、分配与操作:
- 通过物理设备名完成设备→控制器→通道的分配(见前述步骤)。
- 调用驱动程序入口地址执行I/O操作。
总结
设备分配是“资源竞争与协调”的艺术:通过数据结构跟踪状态,算法公平高效,安全性权衡并发与死锁。理解分配步骤(设备→控制器→通道)和 LUT 映射,能解释为何系统有时“卡”在设备分配(如通道忙导致打印机虽闲却无法用)。
✨ 一句话记忆:设备分配看三高(高内聚数据结构、高公平算法、高安全策略),LUT 映射逻辑妙! ✨