设备分配与回收
- 是什么:设备分配的任务是按照一定的策略,为提出I/O请求的进程分配合适的设备,确保CPU与I/O设备之间能正常通信,还应分配相应的控制器和通道。
- 设备分配管理中的数据结构
- 设备控制表DCT:每个设备对应一张DCT,用于记录设备情况
- 关键字段有:类型、标识符、状态、指向COCT的指针、重复执行次数或时间(当重复执行多次io后仍不成功会认为此次io失败)、等待队列指针(由进程PCB组成队列)
- 控制器控制表COCT:每个控制器对应一张COCT,操作系统根据COCT的信息对控制器进行操作和管理
- 关键字段有:控制器标识符、状态、指向CHCT的指针、等待队列指针
- 通道控制表CHCT:每个控制器对应一张CHCT。操作系统根据CHCT的信息对通道进行操作和管理
- 关键字段有:通道标识符、状态、指向COCT的指针、等待队列指针
- 系统设备表SDT:记录整个系统中所有设备的情况,每个设备对应一个表目
- 关键字段有:设备类型、设备标识符(即物理设备名)、DCT、驱动程序入口
- 设备控制表DCT:每个设备对应一张DCT,用于记录设备情况
- 设备分配的步骤
- 根据进程请求的物理设备名查找SDT
- 根据SDT找到DCT
- 若设备忙碌则将进程PCB挂到设备等待队列中
- 若设备不忙碌则将设备分配给进程
- 根据DCT找到COCT
- 若控制器忙碌则将进程PCB挂到控制器等待队列中
- 不忙碌则将控制器分配给进程
- 根据COCT找到CHCT
- 若通道忙碌则将进程PCB挂到通道等待队列中
- 不忙碌则将通道分配给进程
- 只有设备、控制器、通道三者都分配成功,这次设备分配才算成功。之后便可启动I/O设备进行数据传送
设备分配步骤的改进
- 改成根据进程请求的逻辑设备名(即设备类型)查找SDT。
- 增加一个逻辑设备表LUT:用户根据逻辑设备名查找SDT时若找到指定类型的、且空闲的设备,就将其分配给该进程。操作系统在LUT中新增一个表项
- 逻辑设备表LUT建立了逻辑设备名与物理设备名之间的映射关系。如上所示,用户进程第一次使用设备时是用逻辑设备名向操作系统发出请求,然后操作系统查SDT找到空闲设备分配并在LUT中新增表项。若之后用户进程再通过相同的逻辑设备名请求使用该设备,操作系统通过LUT表即可知道该进程要使用哪个物理设备,也能知道该设备的驱动程序入口地址
- LUT和DMT(Device Mapping Table设备映射表)是一个东西。DMT是Windows下的,LUT是Unix下的,都是建立逻辑设备名到物理设备名的映射关系(以便之后根据设备类型选择调用相应的驱动程序)。属于设备独立性软件要干的事情
- 设备分配中应考虑的因素
- 设备的固有属性:
- 独占性
- 共享性
- 虚拟性
- 原则是既要充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁
- 设备的分配算法
- 先来新服务
- 高优先级优先
- 设备分配中的安全性
- 安全分配方式:进程只要发出一个I/O请求就立即阻塞,直到I/O完成才被唤醒。即一个进程在同一时间段内只能使用一个设备,发出I/O请求后就不能再请求任何资源。破坏了死锁产生的“请求和保持”条件,不会发生死锁。但对于同一个进程,CPU和I/O设备串行工作,进程推进的效率不高
- 不安全分配方式:进程可以同时发出多个I/O请求,直到某个I/O设备不可用才阻塞。这种方式下一个进程可同时操作多个设备,使得进程快速推进。但分配不安全,可能造成死锁(可用银行家算法来避免死锁)
- 设备独立性:将用户程序与具体物理设备隔离开来,即用户面对的是逻辑设备,而分配程序将逻辑设备转换为物理设备后,再根据要求的物理设备号进行分配
- 使得系统增减或变更设备时不必修改源程序,便于处理I/O设备故障,提高系统可靠性,并使设备的分配更加灵活,提高设备的利用率
- 设备的固有属性:
缓冲区管理
- 缓冲区的作用
- 缓和CPU与I/O设备之间速度不匹配的矛盾:CPU可以把要输出的数据快速放入缓冲区,之后就可以做别的事。慢速的I/O设备可以慢慢从缓冲区取走数据
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
- 解决数据粒度不匹配问题:如输出进程每次可以生成一块数据,但I/O设备每次只能输出一个字符
- 提高CPU与I/O设备之间的并行性
- 单缓冲:用户进程请求某种块设备读入若干块数据,操作系统在主存中为其分配一个缓冲区。用户进程的内存空间中,会分出一片工作区来接受输入/输出数据,一般默认工作区大小与缓冲区大小相同
- 双缓冲:若用户进程请求某种块设备读入若干块数据,操作系统会在主存为其分配两个缓冲
- 循环缓冲
- 缓冲池
- 三个队列:空缓冲队列、输入队列、输出队列
- 四种工作缓冲区:
- 用于收容输入数据的工作缓冲区、用于提取输入数据的工作缓冲区
- 用于收容输出数据的工作缓冲区、用于提取输出数据的工作缓冲区