当前位置: 首页 > news >正文

设备分配与回收

一、设备分配概述

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、改进流程
  • 步骤
  1. 进程使用逻辑设备名(如“打印机类”)发起I/O请求。
  2. 系统在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 映射逻辑妙! ✨        

http://www.dtcms.com/a/301386.html

相关文章:

  • 数据处理实战(含代码)
  • OpenFeign-远程调用((Feign的使用方法))
  • Spring Boot 配置文件常用配置属性详解(application.properties / application.yml)
  • 【PCIe 总线及设备入门学习专栏 5.3.4 -- PCIe PHY Firmware 固件加载流程】
  • 如何思考一个动态规划问题需要几个状态?
  • [每周一更]-(第150期):AI Agents:从概念到实践的智能体时代
  • net8.0一键创建支持(Elastic)
  • 2025C卷 - 华为OD机试七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD
  • Spring 容器注入时查找 Bean 的完整规则
  • Flutter中 Provider 的基础用法超详细讲解(二)之ChangeNotifierProvider
  • 力扣热题100----------53最大子数组和
  • 咨询进阶——解读40页公司战略解码方法【附全文阅读】
  • sed命令
  • 通信名词解释:I2C、USART、SPI、RS232、RS485、CAN、TCP/IP、SOCKET、modbus
  • 【通识】设计模式
  • catkin_make生成的编译文件夹目录结构说明
  • uart通信
  • python---类型转换
  • Milvus 实战全流程
  • Deja Vu: 利用上下文稀疏性提升大语言模型推理效率
  • Spring 解析 XML 配置文件的过程(从读取 XML 到生成 BeanDefinition)
  • 扩展组件(uni-ui)之uni-group
  • 「iOS」————消息传递和消息转发
  • 26.删除有序数组中的重复项
  • MyBatis-Plus高效开发实战
  • 内存管理和垃圾收集-02: 操作系统如何管理内存?
  • Linux驱动开发笔记(五)——设备树(中)——节点的标准属性
  • 益莱储:明智地投资测试仪器
  • S7-1500 与 S7-1200 存储区域保持性设置特点详解
  • 电子板原理功能区解析与PlantUML图示