1.设备分配时应考虑的因素
①设备的固有属性
设备的固有属性可分为三种:独占设备、共享设备、虚拟设备。
独占设备 | 一个时段只能分配给一个进程(如打印机) |
共享设备 | 可同时分配给多个进程使用(如磁盘),各进程往往是宏观上同时共享使用设备而微观上交替使用。 |
虚拟设备 | 采用 SPOOLing技术将独占设备改造成虚拟的共享设备,可同时分配给多个进程使用(如采用 SPOOLing 技术实现的共享打印机) |
②设备分配算法
设备的分配算法:
先来先服务
优先级高者优先
短任务优先
……
③设备分配中的安全性
从进程运行的安全性上考虑,设备分配有两种方式:
安全分配方式: | 为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒。(eg:考虑进程请求打印机打印输出的例子) | 一个时段内每个进程只能使用一个设备。 优点:破坏了“请求和保持”条件,不会死锁; 缺点:对于一个进程来说,CPU和I/O设备只能串行工作 |
不安全分配方式: | 进程发出I/O请求后,系统为其分配I/O设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞。 | 一个进程可以同时使用多个设备 优点:进程的计算任务和I0任务可以并行处理,使进程迅速推进 缺点:有可能发生死锁(死锁避免、死锁的检测和解除) |
2.静态分配与动态分配
静态分配: | 进程运行前为其分配全部所需资源,运行结束后归还资源 | 破坏了“请求和保持”条件,不会发生死锁 |
动态分配: | 进程运行过程中动态申请设备资源 |
3.设备分配管理中的数据结构
①设备控制表(DCT Device Control Table)
系统为每个设备配置一张DCT,用于记录设备情况
设备控制表(DCT) | |
设备类型 | 如:打印机/扫描仪/键盘 |
设备标识符 | 即物理设备名,系统中的每个设备的物理设备名唯一 |
设备状态 | 忙碌/空闲/故障.. |
指向控制器表的指针 | 每个设备由一个控制器控制,该指针可找到相应控制器的信息 |
重复执行次数或时间 | 当重复执行多次1/0操作后仍不成功,才认为此次I/O失败 |
设备队列的队首指针 | 指向正在等待该设备的进程队列(由进程PCB组成队列) |
注:
“进程管理”章节中曾经提到过“系统会根据阻塞原因不同,将进程PCB挂到不同的阻塞队列中”,说的就是DCT中的设备队列的队尾。
②控制器控制表(COCT )
每个设备控制器都会对应一张COCT。操作系统根据COCT的信息对控制器进行操作和管理。
控制器控制表(COCT) | |
控制器标识符 | 各个控制器的唯一ID |
控制器状态 | 忙碌/空闲/故障. |
指向通道表的指针 | 每个控制器由一个通道控制,该指针可找到相应通道的信息 |
控制器队列的队首指针 | |
控制器队列的队尾指针 | 指向正在等待该控制器的进程队列(由进程PCB组成队列) |
③通道控制表(CHCT)
每个通道都会对应一张CHCT。操作系统根据CHCT的信息对通道进行操作和管理。
通道控制表(CHCT) | |
通道标识符 | 各个通道的唯一ID |
通道状态 | 忙碌/空闲/故障.. |
与通道连接的控制器表首址 | 可通过该指针找到该通道管理的所有控制器相关信息(COCT) |
通道队列的队首指针 | |
通道队列的队尾指针 | 指向正在等待该通道的进程队列(由进程PCB组成队列) |
④系统设备表(SDT)
记录了系统中全部设备的情况,每个设备对应一个表目。
4.设备分配的步骤
①根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)②根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配
给进程。
④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
注:只有设备、控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可启动I/O设备进行数据传送
缺点:
①用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程
②若换了一个物理设备,则程序无法运行
③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待
5.设备分配步骤的政进方法
改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名
①逻辑设备表(LUT)
逻辑设备表(LUT)建立了逻辑设备名与物理设备名之间的映射关系。
某用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据用户进程指定的设备类型(逻辑设备名)查找系统设备表,找到一个空闲设备分配给进程,并在LUT中增加相应表项。
如果之后用户进程再次通过相同的逻辑设备名请求使用设备则操作系统通过LUT表即可知道用户进程实际要使用的是哪个物理设备了,并且也能知道该设备的驱动程序入口地址。
逻辑设备表的设置问题:
整个系统只有一张LUT: | 各用户所用的逻辑设备名不允许重复,适用于单用户操作系统 |
每个用户一张LUT: | 不同用户的逻辑设备名可重复,适用于多用户操作系统 |
②步骤
①根据进程请求的逻辑设备名査找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型”
②查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。