目录
1、设备分配应考虑的因素
2、静态分配与动态分配
3、设备分配管理中的数据结构
(1)设备控制表 DCT
(2)控制器控制表COCT
(3)通道控制表CHCT
(4)系统设备表SDT
4、分配过程
5、分配改进
6、逻辑设备表LUT的设置
7、回收
1、设备分配应考虑的因素
需要考虑设备固有属性、分配算法、设备安全等因素
什么是设备固有属性?
例如:独占式设备、共享设备、虚拟设备,就是设备的固有属性
独占式设备:同一时间,只能一被分配给一个进程,例如打印机
共享设备:同一时间,可以被多个进程使用,例如磁盘(宏观共享,微观依旧是串行,交替使用)
虚拟设备:例如假脱机技术实现的设备
什么是设备的分配算法?
就是一个设备什么时候分,分给谁等问题
一般的就是以下集中算法
先来先服务算法
优先级高优先算法
短任务优先算法等
什么叫做设备安全?
就是设备在被使用过程中,不能发生异常情况,例如死锁。
根据安全,有两种分配方式:
安全分配方式:一个进程在被分配一个设备后,必须阻塞,等待设备执行完毕,之后进程才可以进行其他任务
这样的优点是,不会发生死锁;但是设备和进程只能串行执行,效率低
不安全分配方式:一个进程被分配一个设备后,不用等待设备的执行,而是可以继续执行其他任务,例如申请新的设备等。
这样的优点是,进程和设备可以并行运行,效率高;但是可能会发生死锁问题
2、静态分配与动态分配
静态分配:就是进程运行前,就为其分配好全部的资源,运行结束后释放资源
动态分配:根据进程需要,动态的进行申请资源。
3、设备分配管理中的数据结构
在理解数据结构之前
需要了解通道、控制器、设备之间的关系
一个通道可以管理多个控制器
一个控制器可以管理多个设备
通道->多控制器->设备
他们三者之间是从属的关系
(1)设备控制表 DCT
系统为每一个设备配置一张DCT,用于记录设备情况
设备控制表记录设备的以下信息
字段 | 说明 | 示例 |
---|---|---|
设备类型 | 标识设备的类型,例如打印机、鼠标、键盘等 | 打印机、鼠标、键盘 |
设备表示符(物理设备名) | 设备的唯一标识符,例如MAC地址、设备ID等 | 00:14:22:01:23:45 (MAC地址) |
设备状态 | 设备当前状态:如空闲、忙碌、故障等 | 空闲、忙碌、故障 |
指向控制器表的指针 | 每个设备由一个控制器控制,该字段指向控制器表中相应控制器 | 指针(例如:控制器表ID) |
重复执行次数或时间 | 设备操作失败后的重复执行次数或时间,超限则视为失败 | 3次、5秒(如:重试3次,超时5秒) |
设备队列的队列指针 | 设备的进程等待队列指针,指向等待设备的进程队列 | 队列ID(如:队列1、队列2) |
设备类型:标识设备的类型,例如打印机、鼠标、键盘等
设备表示符:物理设备名,即MAC地址
设备状态:设备是忙碌的,还是空闲,还是故障等
指向控制器表的指针:每个设备由一个控制器控制,该指针指向相应控制器
重复执行次数或时间:一个设备进行一次操作时,可能会失败,此时设备会进行多次重复,超过一定次数后才认定失败,这个字段就表示的失败次数
设备队列的队列指针:该设备的进程等待队列,很多进程可能在排队等待设备
(2)控制器控制表COCT
每一个设备控制对应一张COCT表,操作系统根据该表对控制器进行操作管理
控制器控制表记录以下信息:
字段 | 说明 | 示例 |
---|---|---|
控制器标识符 | 标识控制器的唯一ID | 控制器ID: 1、控制器ID: 2 |
控制器状态 | 控制器当前状态,例如空闲、忙碌、故障等 | 空闲、忙碌、故障 |
执行通道表的指针 | 控制器由一个通道管理,该字段指向通道表中相应的通道 | 指针(如:通道表ID) |
控制器队列的首指针 | 指向等待使用该控制器的进程队列的第一个进程 | 队列首指针 |
控制器队列的尾指针 | 指向等待使用该控制器的进程队列的最后一个进程 | 队列尾指针 |
控制器标识符:标识控制器的唯一ID
控制器状态:标识控制器的状态,例如忙碌、空闲、故障等
执行通道表的指针:每一个控制器由一个通道管理,该指针指向对应通道
控制器队列的首指针、尾指针:指向等待使用该控制器的进程等待队列
(3)通道控制表CHCT
每一个通道对应一张CHCT,操作系统根据该表对通道进行操作和管理
通道控制表记录以下信息:
通道标识符:标识通道的唯一ID
通道状态:标识通道的状态,例如忙碌、空闲、故障等
通道队列的首指针、尾指针:指向等待使用该通道的进程等待队列
(4)系统设备表SDT
记录系统中全部设备的情况,每一个对应一个表目
表目又指向一个具体的表
该表中记录:
设备类型、设备标识符、设备控制表、驱动程序入口等信息
4、分配过程
(1)进程根据物理设备名,查找系统设备表
(2)根据系统设备表,查找到设备控制表;此时如果设备忙碌,则进程加入该设备的等待队列
(3)根据设备控制表找到控制器表;此时如果控制器忙碌,则进程加入控制器等待队列
(4)根据控制器表到通道控制表;此时如果通道忙碌,则进程加入通道等待队列
只有设备、控制器、通道三者同时空闲并分配,才算做进程分配设备成功
上述这种分配方式有明显的缺点,
缺点如下:
第一,什么是物理设备名?我不知道啊,对应不熟悉的用户,直接没法用
第二,如果物理设备名是A,现在换了一个设备,叫做B,程序崩溃
第三,假设现在有多台同类型的设备,例如有1000台打印机,此时1号打印机忙碌,可是你恰好用的1号打印机的名字,即使其他所有打印机都是空闲,此时进程也只能等,不能切换
5、分配改进
根据上述不足,我们可以改进如下:
不要用物理设备名字
使用逻辑设备名字
让操作系统进行逻辑设备和物理设备的映射
这就需要增加一个新的数据结构表,叫做逻辑设备表,负责物理设备和逻辑设备映射关系
这个逻辑设备表记录设备的物理名、逻辑名、设备驱动程序地址等信息
如图:
此时,怎么分配?
(1)进程申请设备,只提供设备逻辑名,根据此逻辑名,找到系统设备表
什么是设备逻辑名?
其实就是设备类型
(2)根据系统设备表,查找类型匹配,并且空闲的设备
在系统设备表中,就有记录了所有设备的表目,且每个表目都指明了该设备属于什么类型
此时,只需要对系统设备表进行查找,找到类型匹配,并且空闲的设备即可;然后分配
此时操作系统还要做一件事:在逻辑设备表中新增一个表项
此后,如果进程通过相同的逻辑设备名访问该设备
就可以直接通过该逻辑设备表进行查找,进行相应的分配工作
(3)根据设备控制表,找到控制器控制表,如空闲则分配;否则进程挂入控制器等待队列
(4)根据控制器控制表,找到通道;如果忙碌则挂入通道等待队列
只有设备、控制器、通道三者同时被分配,进程才算设备分配成功
6、逻辑设备表LUT的设置
逻辑设备表有几张表?
可以整个系统只有一张:
每个用户所用的逻辑设备名不允许重复,适用于单用户操作系统
也可以每一个用户一张:不同用户的逻辑设备名可以重复,适用于多用户操作系统
7、回收
修改相应的结构数据即可