操作系统-设备的分配与回收
设备的分配与回收
设备分配时应考虑的因素
- 设备的固有属性
- 设备的分配算法
- 设备分配中的安全性
设备的固有属性可分为三种:独占式设备、共享式设备、虚拟设备。
独占式设备:一个时间段只能分配给一个进程
共享式设备:可同时分配给多个进程使用,各个进程往往是宏观上同时共享使用设备,微观上交替使用。
虚拟设备:采用假脱机技术将独占式设备改造成虚拟共享设备,可同时分配给多个进程使用。
设备分配算法:
先来先服务算法、短作业优先算法,优先级高优先算法等。
从进程运行的安全性上考虑,设备分配有两种方式:
-
安全分配方式:为进程分配一个设备后就将进程阻塞,本次IO完成后才将这个进程唤醒。这种方式是安全的破坏了“请求和保持条件”,不会发生死锁。但是对于进程来说,CPU和IO设备只能串行工作。
-
不安全分配方式:进程发出IO请求后,系统为其分配IO设备,进程可以继续执行,之后还可以发出新的IO请求。只有某个IO请求得不到满足的情况下才将进程阻塞。
静态分配与动态分配
静态分配:进程运行前,为其分配全部所需资源,运行结束后归还资源。
动态分配:进程运行过程中,动态的申请设备资源。
设备分配管理中的数据结构
设备与控制器通道之间的关系。
一个通道可以有多个控制器,一个控制器又能控制多台设备。所以他们三者之间是一对多的关系,也就可以用树状结构来描述。
系统会为每个设备配置一个设备控制表(DCT),用来记录设备情况。
这个设备控制表中包含有一下字段:设备类型(扫描仪/打印机/键盘),设备标识符(系统中每个设备的唯一ID),设备状态,指向控制表的指针(因为每个设备都有对应的控制器控制,所以这个指针就是用来指向控制它的控制器),重复执行次数或时间(当IO操作多次仍然不成功,才认为此次IO失败),设备队列的队首指针(这个指针指向一个队列,这个队列里面是PCB,这些PCB是正在等待该设备的)
控制器控制表(COCT)
每个设备控制器都会对应一张COCT。
控制器控制表中的属性有:控制器标识符(各个控制器的唯一ID),控制器状态(忙碌,空闲,故障),指向通道的指针(每个控制器都有对应的通道,该指针用来找到对应的通道),控制器队列的队首指针,控制器队列的队尾指针(指向正在等待该控制器的阻塞队列(由PCB组成的队列))
通道控制表(CHCT)
每个通道都会对应一张CHCT。操作系统根据CHCT信息对通道进行操作和管理。
通道控制表中含有的属性:
- 通道标识符:各个通道的唯一ID
- 通道状态
- 与通道连接的控制器表首地址(根据该指针找到该通道管理的所有控制器相关信息)
- 通道队列队首指针,通道队列队尾指针(指向正在等待该通道的进程队列(有进程控制块组成))
系统设备表(SDT)
记录系统中全部设备的情况,每个设备对应一个表目录。
设备分配的步骤
- 按照进程请求的物理设备名查找SDT
- 根据系统设备表找到DCT(设备控制表),若设备忙碌则将进程挂到设备等待队列中,不忙碌则将设备分配给进程。
- 根据设备控制表找到COCT(控制器控制表),若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
- 根据COCT找到CHCT(通道控制表),若通道忙碌则将PCB挂到通达等待队列中,不忙碌则将通道分配给进程。
只有设备。控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可以启动IO设备进行数据传送
缺点:
-
用户编程时必须使用物理设备名,底层细节对用户不透明,不方便编程
-
若换了一个物理设备,则程序无法执行
-
若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待
设备分配的改进方式
①根据进程请求的逻辑设备名查找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型"
②查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
③根据DCT找到COCT,若控制器忙碌,则将PCB挂到控制器等待队列中;不忙碌,则将控制器分配给进程。
④根据COCT找到CHCT,若通道忙碌,则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程
用户编程时使用逻辑设备名申请设备,操作系统负责实现从逻辑设备名到物理设备名的映射。LUT(逻辑设备表)
如果整个系统只有一张LUT:各个用户所用的逻辑设备名不能重复,如果每个用户一张LUT:各个用户的逻辑设备名可以重复。