设备分配的数据结构:设备控制表、控制器控制表、通道控制表、系统设备表
目录
设备分配中至关重要的四种数据结构 构成了操作系统I/O核心子系统的骨架,它们像一套精心设计的档案系统,记录着所有I/O资源的状态和关系,使得操作系统能够高效、安全地进行设备分配。
1. 设备控制表
设备控制表是设备管理中最核心的数据结构,它为系统中的每一台物理设备都建立了一张“档案卡”。
- 作用:描述一个特定设备的详细信息、当前状态和等待队列。
- 包含字段:
- 设备标识符:设备的唯一ID,如
printer1,disk0。 - 设备类型:指明设备的种类,如字符设备(键盘、打印机)或块设备(硬盘)。
- 设备状态:最重要的字段之一,标明设备当前是忙碌还是空闲。
- 指向控制器表的指针:指明该设备连接在哪个控制器上。这是DCT与COCT之间的关键链接。
- 等待队列指针:指向一个进程队列的指针。所有因请求该设备而未成功的进程,都会按其策略(如FCFS)在此队列中排队等待。
- 重复次数:由于外部设备容易出错,该字段记录I/O操作失败后的重试次数。
- 设备标识符:设备的唯一ID,如
- 生活比喻:好比是一台打印机的使用登记表。表上记录了打印机型号(类型)、当前是“正在使用”还是“空闲”(状态)、它连接在哪个打印服务器上(控制器指针),以及谁在排队等待使用(等待队列)。
2. 控制器控制表
控制器是控制一个或多个设备的电子部件(如SCSI控制器、USB主控制器)。COCT就是为每个控制器建立的档案卡。
- 作用:描述一个I/O控制器的状态以及它所连接的设备。
- 包含字段:
- 控制器标识符:控制器的唯一ID。
- 控制器状态:标明控制器是忙碌还是空闲。即使设备空闲,如果控制器忙碌,设备也无法使用。
- 指向通道表的指针:指明该控制器连接在哪个通道(见CHCT)上。这是COCT与CHCT之间的关键链接。
- 等待队列指针:指向因请求该控制器而未成功的进程队列。
- 连接的设备列表:记录该控制器上连接了哪些设备(指向相应DCT的指针)。
- 生活比喻:好比是一个USB集线器的管理界面。界面显示了集线器本身是否工作正常(状态)、它插在电脑的哪个USB口上(通道指针)、有哪些设备(U盘、键盘)连接在这个集线器上(设备列表),以及有哪些数据请求在等待通过这个集线器传输。
3. 通道控制表
通道是一种特殊的、专门用于管理I/O操作的处理器(IOP),可以看作一个“小CPU”,它独立于主CPU执行通道程序来控制I/O。在现代系统中,其概念通常被DMA控制器或更复杂的I/O总线架构所吸收,但逻辑上依然存在。
- 作用:描述一个I/O通道的状态。通道是I/O操作的最终执行者。
- 包含字段:
- 通道标识符:通道的唯一ID。
- 通道状态:标明通道是忙碌还是空闲。
- 等待队列指针:指向因请求该通道而未成功的进程队列。
- 连接的控制器列表:记录该通道上连接了哪些控制器(指向相应COCT的指针)。
- 生活比喻:好比是一条高速公路的交通监控系统。系统显示这条高速公路是否拥堵(状态)、有哪些入口(连接的控制器)连接在这条高速上,以及有多少车辆(数据请求)在入口处等待上高速。
4. 系统设备表
SDT是系统级别的全局视图,是整个设备管理的起点和总目录。
- 作用:记录整个系统中所有设备的基本信息,是操作系统感知所有硬件设备的入口。
- 包含字段:
- 表项:SDT中的每一行对应一个系统可识别的设备。
- 设备标识符:与DCT中的标识符对应。
- 设备类型:与DCT中的类型对应。
- 设备驱动程序入口点:极其重要的字段。它是一个指针,指向该设备对应的设备驱动程序的地址(如
open,read,write等函数的入口)。这是连接抽象设备与具体驱动代码的桥梁。 - 指向设备控制表的指针:指向该设备对应的DCT。这是SDT与DCT之间的关键链接。
- 生活比喻:好比是公司的总机接线员手中的通讯录。通讯录列出了每个部门(设备)的名称(标识符)和分机号(驱动程序入口)。当有外部请求(进程请求)找某个部门时,总机先查通讯录(SDT),然后才能把电话转接过去(调用驱动)。
总结与关系
这四张表的关系是自上而下、层层细化的:
- 系统设备表 是总目录,通过它找到任何设备及其驱动入口和对应的DCT。
- 设备控制表 是核心,记录了每个设备的详细信息。它向上被SDT指向,向下指向其所属的COCT。
- 控制器控制表 是中间层,管理着控制设备的电子部件。它向上被DCT指向,向下指向其所属的CHCT。
- 通道控制表 是底层执行层,管理着实际的I/O通路。它向上被COCT指向。
分配设备时,操作系统必须依次检查并锁定:设备 -> 控制器 -> 通道。 只有当这条路径上的所有资源(DCT, COCT, CHCT)都可用时,分配才能成功。任何一环忙碌,进程都会被放入相应的等待队列中。这种精细的管理确保了I/O操作能够有序、高效、无冲突地进行。
好的,以下是一个基于Mermaid语法的时序图,描述了进程请求设备并进行I/O操作的完整流程,其中涉及了设备分配的核心数据结构(SDT, DCT, COCT, CHCT)和关键角色。
设备分配与I/O操作时序图
sequenceDiagram
participant P as 进程
participant IOM as I/O管理程序
participant SDT as 系统设备表(SDT)
participant DCT as 设备控制表(DCT)
participant COCT as 控制器控制表(COCT)
participant CHCT as 通道控制表(CHCT)
participant Drv as 设备驱动程序
participant IH as 中断处理程序
participant Dev as 硬件设备
Note over P, Dev: 1. 分配请求阶段
P->>IOM: 发出I/O请求(设备名)
activate IOM
IOM->>SDT: 查找设备入口
activate SDT
SDT-->>IOM: 返回DCT指针&驱动入口
deactivate SDT
IOM->>DCT: 检查设备状态(忙?)
activate DCT
alt 设备空闲
DCT-->>IOM: 状态=空闲
IOM->>DCT: 标记状态=忙碌
IOM->>COCT: 检查控制器状态(忙?)
activate COCT
alt 控制器空闲
COCT-->>IOM: 状态=空闲
IOM->>COCT: 标记状态=忙碌
IOM->>CHCT: 检查通道状态(忙?)
activate CHCT
alt 通道空闲
CHCT-->>IOM: 状态=空闲
IOM->>CHCT: 标记状态=忙碌
IOM-->>P: 返回成功,分配完成
else 通道忙碌
CHCT-->>IOM: 状态=忙碌
IOM->>CHCT: 将进程加入等待队列
IOM-->>P: 阻塞进程
end
deactivate CHCT
else 控制器忙碌
COCT-->>IOM: 状态=忙碌
IOM->>COCT: 将进程加入等待队列
IOM-->>P: 阻塞进程
end
deactivate COCT
else 设备忙碌
DCT-->>IOM: 状态=忙碌
IOM->>DCT: 将进程加入等待队列
IOM-->>P: 阻塞进程
end
deactivate DCT
deactivate IOM
Note over P, Dev: 2. I/O操作执行阶段 (假设分配成功)
P->>Drv: 调用驱动函数(如read)
activate Drv
Drv->>COCT: 配置控制器寄存器
activate COCT
Drv->>CHCT: 启动通道程序
activate CHCT
CHCT->>Dev: 执行实际I/O传输(DMA)
activate Dev
Note right of Dev: 设备忙碌工作...
Dev-->>IH: I/O完成,发出中断信号
deactivate Dev
Note over P, Dev: 3. 完成与回收阶段
IH->>IH: 处理中断
activate IH
IH->>DCT: 标记设备状态=空闲
activate DCT
IH->>COCT: 标记控制器状态=空闲
activate COCT
IH->>CHCT: 标记通道状态=空闲
activate CHCT
IH->>DCT: 检查等待队列
DCT-->>IH: 返回下一个等待进程(如有)
IH->>IOM: 唤醒下一个等待进程
activate IOM
IOM-->>P: 解除阻塞(或其他进程)
deactivate IOM
IH-->>P: 返回成功状态
deactivate CHCT
deactivate COCT
deactivate DCT
deactivate IH
deactivate Drv
时序图阶段说明:
阶段 1: 分配请求(内核态)
- 进程向I/O管理程序(设备独立性软件层)发出请求(如
read)。 - I/O管理程序查询系统设备表,找到对应设备的设备控制表和驱动程序入口。
- I/O管理程序检查DCT状态:
- 忙碌:将进程加入DCT的等待队列,并阻塞进程。流程结束。
- 空闲:将其标记为“忙碌”,并继续检查其对应的控制器控制表。
- 检查COCT状态:
- 忙碌:将进程加入COCT的等待队列,并阻塞进程。
- 空闲:将其标记为“忙碌”,并继续检查其对应的通道控制表。
- 检查CHCT状态:
- 忙碌:将进程加入CHCT的等待队列,并阻塞进程。
- 空闲:将其标记为“忙碌”,分配成功,返回用户态。
阶段 2: I/O操作执行
- 分配成功后,进程调用设备驱动程序的具体函数。
- 驱动程序向下层硬件发出命令:配置控制器、启动通道。
- 硬件设备在通道的控制下(通常通过DMA方式)开始与内存进行数据交换,整个过程无需CPU干预。
- 设备完成工作后,向CPU发出中断信号。
阶段 3: 完成与回收
- 中断处理程序被触发:
- 将相应的DCT、COCT、CHCT状态标记为“空闲”。
- 检查这些表的等待队列。如果队列不为空,则取出队首进程,唤醒它,并重新为它执行分配流程(跳回阶段1)。
- 向原发起I/O的进程发送信号,通知其I/O操作已完成。
这个时序图清晰地展示了设备分配是一个层层递进、申请资源的过程,而回收则是一个触发中断、反向释放资源并唤醒等待者的过程。所有决策都基于那四个关键的数据结构(SDT, DCT, COCT, CHCT)的状态。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号