1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-11-03 22:03:48 +08:00

更新设备管理

This commit is contained in:
Didnelpsun
2021-08-30 23:31:26 +08:00
parent 362b38a33e
commit 28f0ae83c3
2 changed files with 316 additions and 123 deletions

View File

@@ -1,2 +1,161 @@
# 设备管理习题
## I/O概述
### I/O设备的基本概念、
**例题** 以下关于设备属性的叙述中,正确的是()。
$A.$字符设备的基本特征是可寻址到字节,即能指定输入的源地址或输出的目标地址
$B.$共享设备必须是可寻址的和可随机访问的设备
$C.$共享设备是指同一时间内允许多个进程同时访问的设备
$D.$在分配共享设备和独占设备时都可能引起进程死锁
解:$B$。可寻址是块设备的基本特征,$A$选项不正确。共享设备是指一段时间内允许多个进程同时访问的设备,因此$C$选项不正确。分配共享设备是不会引起进程死锁的,$D$选项不正确。
### I/O控制方式
#### 通道控制方式
**例题** ()用作连接大量的低速或中速$I/O$设备。
$A.$数据选择通道
$B.$字节多路通道
$C.$数据多路通道
$D.I/O$处理机
解:$B$。字节多路通道,它通常含有许多非分配型子通道,其数量可达几十到几百个,每个通道连接一台$I/O$设备,并控制该设备的$I/O$操作。这些子通道按时间片轮转方式共享主通道。各个通道循环使用主通道,各个通道每次完成其$I/O$设备的一个字节的交换,然后让出主通道的使用权。这样,只要字节多路通道扫描每个子通道的速率足够快,而连接到子通道上的设备的速率不太高时,便不至于丢失信息。
**例题** 系统将数据从磁盘读到内存的过程包括以下操作:
①$DMA$控制器发出中断请求
②初始化$DMA$控制器并启动磁盘
③从磁盘传输一块数据到内存缓冲区
④执行“$DMA$结束”中断服务程序
正确的执行顺序是()。
$A.$③→①→②→④
$B.$②→③→①→④
$C.$②→①→③→④
$D.$①→②→④→③
解:$B$。在开始$DMA$传输时,主机向内存写入$DMA$命令块,向$DMA$ 控制器写入该命令块的地址,启动$I/O$设备。然后,$CPU$继续其他工作,$DMA$ 控制器则继续直接操作内存总线,将地址放到总线上开始传输。整个传输完成后,$DMA$控制器中断$CPU$。因此执行顺序是$2,3,1,4$。
**例题** 在一个$32$位$100MHz$的单总线计算机系统中(每$10ns$一个周期),磁盘控制器使用$DMA$以$40MB/s$的速率从存储器中读出数据或向存储器写入数据。假设计算机在没有被周期挪用的情况下,在每个循环周期中读取并执行一个$32$位的指令。这样做,磁盘控制器使指令的执行速度降低了多少?
解:在$32$位单总线的系统中,磁盘控制器使用$DMA$传输数据的速率为$40MB/s$,即每$100ns$传输$4B$($32$位)的数据。控制器每读取$10$个指令就挪用一个周期。因此,磁盘控制器使指令的执行速度降低了$10\%$。
### I/O软件层次结构
**例题** 用户程序发出磁盘$I/O$请求后,系统的处理流程是:用户程序→系统调用处理程序→设备驱动程序→中断处理程序。其中,计算数据所在磁盘的柱面号、磁头号、扇区号的程序是()。
$A.$用户程序
$B.$系统调用处理程序
$C.$设备驱动程序
$D.$中断处理程序
解:$C$。计算磁盘号、磁头号和扇区号的工作是由设备驱动程序完成的。题中的功能因设备硬件的不同而不同,因此应由厂家提供的设备驱动程序实现。
## I/O核心子系统
### 缓冲区管理
**例题** 下列选项中,不能改善磁盘设$I/O$性能的是()。
$A.$重排$I/O$请求次序
$B.$在一个磁盘上设置多个分区
$C.$预读和滞后写
$D.$优化文件物理块的分布
解:$B$。对于$A$,重排$I/O$请求次序也就是进行$I/O$调度,使进程之间公平地共享磁盘访问,减少$I/O$完成所需要的平均等待时间。对于$C$,缓冲区结合预读和滞后写技术对于具有重复性及阵发性的$I/O$进程改善磁盘$I/О$性能很有帮助。对于$D$,优化文件物理块的分布可以减少寻找时间与延迟时间,从而提高磁盘性能。在一个磁盘上设置多个分区与改善设备$I/O$性能并无多大联系,相反还会带来处理的复杂性,降低利用率。
**例题** 某文件占$10$个磁盘块,现要把该文件的磁盘块逐个读入主存缓冲区,并送用户区进行分析,假设一个缓冲区与一个磁盘块大小相同,把一个磁盘块读入缓冲区的时间为$100\mu s$,将缓冲区的数据传送到用户区的时间是$50\mu s$,$CPU$对一块数据进行分析的时间为$50\mu s$。在单缓冲区和双缓冲区结构下,读入并分析完该文件的时间分别是()。
$A.1500\mu s,1000\mu s$
$B.1550\mu s,1100\mu s$
$C.1550\mu s,1550\mu s$
$D.2000\mu s,2000\mu s$
解:$B$。在单缓冲区中,当上一个磁盘块从缓冲区读入用户区完成时,下一磁盘块才能开始读入,分析本块数据的操作在下一块的写入内存操作时一同进行,也就是当最后一块磁盘块读入用户区完毕时所用的时间为$150\times10=1500\mu s$,加上处理最后一个磁盘块的时间$50\mu s$,得$1550\mu s$。双缓冲区中,不存在等待磁盘块从缓冲区读入用户区的问题,一块在读入内存,一块在读出和分析内存,$10$个磁盘块可以连续从外存读入主存缓冲区,加上将最后一个磁盘块从缓冲区送到用户区的传输时间$50\mu s$及处理时间$50\mu s$,也就是$100\times10+50+50=1100\mu s$。
**例题** 缓冲区管理着重要考虑的问题是()。
$A.$选择缓冲区的大小
$B.$决定缓冲区的数量
$C.$实现进程访问缓冲区的同步
$D.$限制进程的数量
解:$C$。在缓冲机制中,无论是单缓冲、多缓冲还是缓冲池,由于缓冲区是一种临界资源,所以在使用缓冲区时都有一个申请和释放(即互斥)的问题需要考虑。
**例题** 考虑单用户计算机上的下列$I/O$操作,需要使用缓冲技术的是()。
Ⅰ.图形用户界面下使用鼠标
Ⅱ.多任务操作系统下的磁带驱动器(假设没有设备预分配)
Ⅲ.包含用户文件的磁盘驱动器
Ⅳ.使用存储器映射$I/O$,直接和总线相连的图形卡
$A.$Ⅰ、Ⅲ
$B.$Ⅱ、Ⅳ
$C.$Ⅱ、Ⅲ、Ⅳ
$D.$全选
解:$D$。在鼠标移动时,若有高优先级的操作产生,为了记录鼠标活动的情况,必须使用缓冲技术,Ⅰ正确。由于磁盘驱动器和目标或源$I/O$设备间的吞吐量不同,必须采用缓冲技术,Ⅱ正确。为了能使数据从用户作业空间传送到磁盘或从磁盘传送到用户作业空间,必须采用缓冲技术,Ⅲ 正确。为了便于多幅图形的存取及提高性能,缓冲技术是可以采用的,特别是在显示当前一幅图形又要得到下一幅图形时,应采用双缓冲技术,Ⅳ正确。
**例题** 在系统内存中设置磁盘缓冲区的主要目的是()。
$A.$减少磁盘$I/O$次数
$B.$减少平均寻道时间
$C.$提高磁盘数据可靠性
$D.$实现设备无关性
解:$A$。设置硬盘缓冲区的目的就是为了解决内存速度和内存速度不平衡的问题。通过高速缓存能把经常访问的数据放入内存从而减少磁盘$I/O$次数。
<!-- ### 设备分配回收 -->
### 假脱机技术
**例题** 采用$SPOOLing$技术的计算机系统,外围计算机需要()。
$A.$一台
$B.$多台
$C.$至少一台
$D.0$台
解:$D$。$SPOOLing$技术需要使用磁盘空间(输入井和输出井)和内存空间(输入/输出缓冲区),不需要外围计算机的支持。

View File

@@ -17,6 +17,7 @@
+ 按信息交换的单位分类:
+ 块设备:传输速率较高,可寻址,即对它可随机地读/写任一块,如硬盘、磁盘。
+ 字符设备:传输速率较慢,不可寻址,在输入/输出时常采用中断驱动方式,键盘、鼠标。
+ 计算机系统为每台设备确定一个编号以便区分和识别设备,这个确定的编号称为设备的**绝对号**。
### I/O控制器
@@ -112,14 +113,22 @@
+ $CPU$每发出一条$I/O$指令,只能读/写一个或多个连续的数据块。
+ 如果要读/写多个离散存储的数据块,或者要将数据分别写到不同的内存区域时,$CPU$要分别发出多条$I/O$指令,进行多次中断处理才能完成。
$DMA$的控制器与$CPU$分时使用内存,通常采用以下三种方法:停止$CPU$访内存、周期挪用、$DMA$与$CPU$交替访内存。(计算机组成原理会具体讲到)
+ 数据块传送方式:在$I/O$接口电路中设置一个比较大的数据缓冲区,一般能存放一个数据块,$I/O$接口电路与内存之间的数据交换以数据块为单位。总线仲裁器判定究竟是$DMA$控制器还是$CPU$能获得总线的使用权。
+ 周期挪用方式:当$I/O$接口没有$DMA$请求时,$CPU$按程序要求访问内存;一旦$I/O$接口有$DMA$请求,则$I/O$接口挪用一个或几个周期。缺点是:数据输入或庶出过程中实际占用了$CPU$时间。
+ 交替访存方式:$CPU$与$DMA$控制器交替访问内存。不需要总线使用权的申请、建立和归还过程。
效率高,但实现起来有困难,基本上不被使用。
#### 通道控制方式
+ 通道:一种硬件,可以理解为是简版的$CPU$,因为与$CPU$相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中的,也就是说通道与$CPU$共享内存。
。通道可以识别并执行一系列通道指令。
+ 通道可以识别并执行一系列通道指令。
+ 通道控制设备控制器、设备控制器控制设备工作。
+ 完成读写的流程:
1. $CPU$向通道发出$I/O$指令。指明通道程序在内存中的位置,并指明要操作的是哪个$I/O$设备。之后$CPU$就切换到其他进程执行。
1. $CPU$向通道发出$I/O$指令。指明通道程序在内存中的位置,并指明要操作的是哪个$I/O$设备。之后$CPU$就切换到其他进程执行。启动时无论成功与否都需要回答$CPU$。
2. 通道执行内存中的通道程序(其中指明了要读入/写出多少数据,读/写的数据应放在内存的什么位置等信息),类似任务清单。
3. 通道执行完规定的任务后,向$CPU$发出中断信号,之后$CPU$对中断进行处理。
3. 通道执行完规定的任务后,此时向$CPU$发出中断信号,之后$CPU$对中断进行处理。
+ $CPU$干预的频率:极低,通道会根据$CPU$的指示执行相应的通道程序,只有完成一组数据块的读/写后才需要发出中断信号,请求$CPU$干预。
+ 数据传送的单位:每次读/写一组数据块。
+ 数据的流向((在通道的控制下进行):
@@ -189,116 +198,14 @@ $I/O$软件结构层次:
+ 设备分配与回收。
+ 缓冲区管理(即缓冲与高度缓存)。
### 假脱机技术
也称为SPOOLing技术。
#### 脱机技术
+ 脱机处理是一种计算机技术,是指在不受主机控制的外部设备上进行数据处理,或与实时控制系统、主机不直接相连的数据处理。常用于主机速度不高的数据处理中提高设备的利用率。
+ 如输入输出设备速度慢,远小于$CPU$处理速率,而$CPU$要处理就必须等待输入输出设备,导致$CPU$资源浪费,而脱机技术能让数据更快进出$CPU$,从而速度加快。
#### 假脱机技术实现
+ “假脱机技术”,又称“SPOOLing技术”是用软件的方式模拟脱机技术。
+ SPOOLing系统组成:
+ 输入井:在磁盘上,模拟脱机输入时的磁带,用于收容$I/O$设备输入的数据。
+ 输出井:在磁盘上,模拟脱机输出时的磁带,用于收容用户进程输出的数据。
+ 输入进程:在内存中,模拟脱机输入时的外围控制机。
+ 输出进程,在内存中,模拟脱机输出时的外围控制机。
+ 输入缓冲区与输出缓冲区:在内存中,用于暂存输入的数据转存到输入井中,或暂存输出的数据转存到输出井中。
#### 共享打印机
打印机是一种独占式设备,而通过假脱机技术变成共享设备。
当多个用户进程提出输出打印的请求时,系统会答应它们的请求,但是并不是真正把打印机分配给他们,而是由假脱机管理进程处理:
1. 在磁盘输出井中为进程申请一个空闲缓冲区(也就是说,这个缓冲区是在磁盘上的),并将要打印的数据送入其中。
2. 为用户进程申请一张空白的打印请求表,并将用户的打印请求填入表中(其实就是用来说明用户的打印数据存放位置等信息的),再将该表挂到假脱机文件队列(打印任务队列)上。
3. 当打印机空闲时,输出进程会从文件队列的队头取出一张打印请求表,并根据表中的要求将要打印的数据从输出井传送到输出缓冲区,再输出到打印机进行打印。用这种方式可依次处理完全部的打印任务。
#### 设备分配回收
#### 设备分配考虑因素
+ 固有属性:
+ 独占设备。
+ 共享设备。
+ 虚拟设备:将独占设备改造成共享的虚拟设备。
+ 分配算法。
+ 安全性:
+ 安全分配方式:
+ 为进程分配一个设备后就将进程阻塞,本次$I/O$完成后才将进程唤醒。一个时段内每个进程只能使用一个设备。
+ 优点:破坏了“请求和保持”条件,不会死锁。
+ 缺点:对于一个进程来说,$CPU$和$I/O$设备只能串行工作。
+ 不安全分配方式:
+ 进程发出$I/O$请求后,系统为其分配$I/O$设备,进程可继续执行,之后还可以发出新的$I/O$请求。只有某个$I/O$请求得不到满足时才将进程阻塞。一个进程可以同时使用多个设备。
+ 优点:进程的计算任务和$I/O$任务可以并行处理,使进程迅速推进。
+ 缺点:有可能发生死锁(死锁避免、死锁的检测和解除)。
#### 设备分配数据结构
+ 一个通道可控制多个设备控制器,每个设备控制器可控制多个设备。
+ 设备控制表(DCT),系统为每个设备配置一张DCT,用于记录设备情况:
+ 设备类型:如打印机/扫描仪/键盘。
+ 设备标识符:即物理设备名,系统中的每个设备的物理设备名唯一。
+ 设备状态:忙碌/空闲/故障……。
+ 指向控制器表的指针:每个设备由一个控制器控制,该指针可找到相应控制器的信息。
+ 重复执行次数或时间:当重复执行多次$I/O$操作后仍不成功,才认为此次$I/O$失败。
+ 设备队列的队首指针:指向正在等待该设备的进程队列(由进程PCB组成队列)。
+ 控制器控制表(COCT),每个设备控制器都会对应一张COCT。操作系统根据COCT的信息对控制器进行操作和管理:
+ 控制器标识符:各个控制器的唯一ID。
+ 控制器状态:忙碌/空闲/故障……
+ 指向通道表的指针:每个控制器由一个通道控制,该指针可找到相应通道的信息。
+ 控制器队列的队首指针:指向正在等待该控制器的进程队列(由进程PCB组成队列)。
+ 控制器队列的队尾指针:指向控制器的队尾。
+ 通道控制表(CHCT),每个通道都会对应一张CHCT。操作系统根据CHCT的信息对通道进行操作和管理:
+ 通道标识符:各个通道的唯一ID。
+ 通道状态:忙碌/空闲/故障……
+ 与通道连接的控制器表首址:可通过该指针找到该通道管理的所有控制器相关信息(COCT)。
+ 通道队列的队首指针:指向正在等待该通道的进程队列(由进程PCB组成队列)。
+ 通道队列的队尾指针:指向通道队列的队尾。
+ 系统设备表(SDT),记录了系统中全部设备的情况,每个设备对应一个表目:
+ 设备类型:打印机/扫描仪/键盘。
+ 设备标识符:物理设备名。
+ DCT(设备控制表)。
+ 驱动程序入口:对应设备驱动的程序地址。
#### 设备分配过程
1. 根据进程请求的物理设备名查找SDT(物理设备名是进程请求分配设备时提供的参数)。
2. 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
3. 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
4. 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
5. 只有设备、控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可后动$I/O$设备进行数据传送。
缺点:
1. 用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程。
2. 若换了一个物理设备,则程序无法运行。
3. 若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待这个名字设备。
改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名。
1. 根据进程请求的逻辑设备名查找SDT(用户编程时提供的逻辑设备名其实就是“设备类型”)。
2. 查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
3. 根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
4. 根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
优点:
+ 逻辑设备表(LUT)建立了逻辑设备名与物理设备名之间的映射关系。
+ 某用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据用户进程指定的设备类型(逻辑设备名)查找系统设备表,找到一个空闲设备分配给进程,并在LUT中增加相应表项。
+ 如果之后用户进程再次通过相同的逻辑设备名请求使用设备,则操作系统通过LUT表即可知道用户进程实际要使用的是哪个物理设备了,并且也能知道该设备的驱动程序入口地址。
逻辑设备表的设置问题:
+ 整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复,适用于单用户操作系统。
+ 每个用户一张LUT:不同用户的逻辑设备名可重复,适用于多用户操作系统。
### 缓冲区管理
#### 磁盘高速缓存
利用内存中的存储空间暂存从磁盘中读出的一系列盘块中的信息,逻辑上是属于磁盘,物理上驻留在内存中。
分为两种形式:在内存中开辟出一个单独的存储空间作为磁盘高速缓存,大小固定;另一种把未利用的内存空间作为缓冲池,供请求分页系统和磁盘$I/O$时共享。
#### 缓冲区概念
+ 缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。
@@ -315,19 +222,19 @@ $I/O$软件结构层次:
+ 假设某用户进程请求某种块设备读入若干块的数据。若采用单缓冲的策略,操作系统会在主存中为其分配一个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)。
+ 当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。
+ 常考题型:计算每处理一块数据平均需要多久?技巧:假定一个初始状态(如工作区满、缓冲区空),分析下次到达相同状态需要多少时间,这就是处理一块数据平均所需时间。
+ 处理一块数据平均耗时max(C,T)+M。其中C代表处理时间、M代表传输时间、T代表输入时间。
+ 处理一块数据平均耗时$\max(C,T)+M$。其中$C$代表处理时间、$M$代表传输时间、$T$代表输入时间。
#### 双缓冲
+ 假设某用户进程请求某种块设备读入若干块的数据。若采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)。
+ 处理一块数据平均耗时max(T,(C+M))。其中C代表处理时间、M代表传输时间、T代表输入时间。
+ 一块存,一块可以取,处理一块数据平均耗时$\max(T,(C+M))$。其中$C$代表处理时间、$M$代表传输时间、$T$代表输入时间。
+ 若两个相互通信的机器设置双缓冲区,则同一时刻可以实现双向的数据传输。否则单缓冲区只能单向数据传输。
#### 循环缓冲
+ 将多个大小相等的缓冲区链接成一个循环队列。
+ in指针,指向下一个可以冲入数据的空缓冲区。
+ out指针,指向下一个可以取出数据的满缓冲区。
+ $in$指针,指向下一个可以冲入数据的空缓冲区。
+ $out$指针,指向下一个可以取出数据的满缓冲区。
#### 缓冲池
@@ -336,11 +243,138 @@ $I/O$软件结构层次:
+ 装满输入数据的缓冲队列(输入队列)。
+ 装满输出数据的缓冲队列(输出队列)。
+ 根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:
+ 用于收容输入数据的工作缓冲区(hin)。
+ 用于提取输入数据的工作缓冲区(sin)。
+ 用于收容输出数据的工作缓冲区(hout)。
+ 用于提取输出数据的工作缓冲区(sout)。
+ 输入进程请求输入数据:从空缓冲队列中取出一块作为收容输入数据的工作缓冲区(hin)。冲满数据后将缓冲区挂到输入队列队尾。
+ 计算进程想要一块输入数据:从输入队列中取得一块冲满输入数据的缓冲区作为提取输入数据的工作缓冲区(cin)。缓冲区读空后挂到空缓冲区队列。
+ 计算进程将准备好的数据冲入缓冲区:从空缓冲队列中取出一块作为收容输出数据的工作缓冲区(hout)。数据冲满后将缓冲区挂到输出队列队尾。
+ 输出进程请求输出数据:从输出队列中取得一块冲满输出数据的缓冲区作为提取输出数据的工作缓冲区(sout)。缓冲区读空后挂到空缓冲区队列。
+ 用于收容输入数据的工作缓冲区($hin$)。
+ 用于提取输入数据的工作缓冲区($sin$)。
+ 用于收容输出数据的工作缓冲区($hout$)。
+ 用于提取输出数据的工作缓冲区($sout$)。
+ 输入进程请求输入数据:从空缓冲队列中取出一块作为收容输入数据的工作缓冲区($hin$)。冲满数据后将缓冲区挂到输入队列队尾。
+ 计算进程想要一块输入数据:从输入队列中取得一块冲满输入数据的缓冲区作为提取输入数据的工作缓冲区($cin$)。缓冲区读空后挂到空缓冲区队列。
+ 计算进程将准备好的数据冲入缓冲区:从空缓冲队列中取出一块作为收容输出数据的工作缓冲区($hout$)。数据冲满后将缓冲区挂到输出队列队尾。
+ 输出进程请求输出数据:从输出队列中取得一块冲满输出数据的缓冲区作为提取输出数据的工作缓冲区($sout$)。缓冲区读空后挂到空缓冲区队列。
&nbsp;|高速缓存|缓冲区
:----:|:------:|:----:
存放数据|存放的是低速设备上的某些数据的复制数据,即高速缓存上有的,低速设备上面必然有|存放的是低速设备传递给高速设备的数据(或相反),而这些数据在低速设备(或高速设备)上却不一定有备份,这些数据再从缓冲区传送到高速设备(或低速设备)
目的|高速缓存存放的是高速设备经常要访问的数据,若高速设备要访问的数据不在高速缓存中,则高速设备就需要访问低速设备|高逑设备和低速设备的通信都要经过缓冲区,高速设备永远不会直接去访问低速设备
### 设备分配回收
设备分配方法:
+ 静态分配:主要是独占设备的分配,在用户作业开始前,由系统一次性分配,直到作业完成才会取消占用,不会死锁。
+ 动态分配:主要是共享设备的分配,进程执行期间进行,通过系统调用提出设备请求,可能死锁。
#### 设备分配考虑因素
+ 固有属性:
+ 独占设备:同时只能被一个进程访问。如打印机、磁带机。
+ 共享设备:同时能被多个进程访问,不会死锁。如磁盘。
+ 虚拟设备:将独占设备改造成共享的虚拟设备。
+ 分配算法:
+ 先请求先分配。
+ 优先级高者优先。
+ 安全性:
+ 安全分配方式:
+ 为进程分配一个设备后就将进程阻塞,本次$I/O$完成后才将进程唤醒。一个时段内每个进程只能使用一个设备。
+ 优点:破坏了“请求和保持”条件,不会死锁。
+ 缺点:对于一个进程来说,$CPU$和$I/O$设备只能串行工作。
+ 不安全分配方式:
+ 进程发出$I/O$请求后,系统为其分配$I/O$设备,进程可继续执行,之后还可以发出新的$I/O$请求。只有某个$I/O$请求得不到满足时才将进程阻塞。一个进程可以同时使用多个设备。
+ 优点:进程的计算任务和$I/O$任务可以并行处理,使进程迅速推进。
+ 缺点:有可能发生死锁(死锁避免、死锁的检测和解除)。
+ 独立性。
#### 设备分配数据结构
+ 一个通道可控制多个设备控制器,每个设备控制器可控制多个设备。
+ 设备控制表($DCT$),系统为每个设备配置一张$DCT$,用于记录设备情况:
+ 设备类型:如打印机/扫描仪/键盘。
+ 设备标识符:即物理设备名,系统中的每个设备的物理设备名唯一。
+ 设备状态:忙碌/空闲/故障……。
+ 指向控制器表的指针:每个设备由一个控制器控制,该指针可找到相应控制器的信息。
+ 重复执行次数或时间:当重复执行多次$I/O$操作后仍不成功,才认为此次$I/O$失败。
+ 设备队列的队首指针:指向正在等待该设备的进程队列(由进程$PCB$组成队列)。
+ 控制器控制表($COCT$),每个设备控制器都会对应一张$COCT$。操作系统根据$COCT$的信息对控制器进行操作和管理:
+ 控制器标识符:各个控制器的唯一$ID$。
+ 控制器状态:忙碌/空闲/故障……
+ 指向通道表的指针:每个控制器由一个通道控制,该指针可找到相应通道的信息。
+ 控制器队列的队首指针:指向正在等待该控制器的进程队列(由进程$PCB$组成队列)。
+ 控制器队列的队尾指针:指向控制器的队尾。
+ 通道控制表($CHCT$),每个通道都会对应一张$CHCT$。操作系统根据$CHCT$的信息对通道进行操作和管理:
+ 通道标识符:各个通道的唯一ID。
+ 通道状态:忙碌/空闲/故障……
+ 与通道连接的控制器表首址:可通过该指针找到该通道管理的所有控制器相关信息($COCT$)。
+ 通道队列的队首指针:指向正在等待该通道的进程队列(由进程$PCB$组成队列)。
+ 通道队列的队尾指针:指向通道队列的队尾。
+ 系统设备表($SDT$),整个系统只有一张,记录了系统中全部设备的情况,每个设备对应一个表目:
+ 设备类型:打印机/扫描仪/键盘。
+ 设备标识符:物理设备名。
+ $DCT$(设备控制表)。
+ 驱动程序入口:对应设备驱动的程序地址。
#### 设备分配过程
1. 根据进程请求的物理设备名查找$SDT$(物理设备名是进程请求分配设备时提供的参数)。
2. 根据$SDT$找到$DCT$,若设备忙碌则将进程$PCB$挂到设备等待队列中,不忙碌则将设备分配给进程。
3. 根据$DCT$找到$COCT$,若控制器忙碌则将进程$PCB$挂到控制器等待队列中,不忙碌则将控制器分配给进程。
4. 根据$COCT$找到$CHCT$,若通道忙碌则将进程$PCB$挂到通道等待队列中,不忙碌则将通道分配给进程。
5. 只有设备、控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可后动$I/O$设备进行数据传送。
缺点:
1. 用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程。
2. 若换了一个物理设备,则程序无法运行。
3. 若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待这个名字设备。
改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名。
1. 根据进程请求的逻辑设备名查找$SDT$(用户编程时提供的逻辑设备名其实就是“设备类型”)。
2. 查找$SDT$,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表($LUT$)中新增一个表项。
3. 根据$DCT$找到$COCT$,若控制器忙碌则将进程$PCB$挂到控制器等待队列中,不忙碌则将控制器分配给进程。
4. 根据$COCT$找到$CHCT$,若通道忙碌则将进程$PCB$挂到通道等待队列中,不忙碌则将通道分配给进程。
优点:
+ 逻辑设备表($LUT$)建立了逻辑设备名与物理设备名之间的映射关系。
+ 某用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据用户进程指定的设备类型(逻辑设备名)查找系统设备表,找到一个空闲设备分配给进程,并在$LUT$中增加相应表项。
+ 如果之后用户进程再次通过相同的逻辑设备名请求使用设备,则操作系统通过$LUT$表即可知道用户进程实际要使用的是哪个物理设备了,并且也能知道该设备的驱动程序入口地址。
逻辑设备表的设置问题:
+ 整个系统只有一张$LUT$:各用户所用的逻辑设备名不允许重复,适用于单用户操作系统。
+ 每个用户一张$LUT$:不同用户的逻辑设备名可重复,适用于多用户操作系统。
### 假脱机技术
也称为$SPOOLing$技术。
#### 脱机技术
+ 脱机处理是一种计算机技术,是指在不受主机控制的外部设备上进行数据处理,或与实时控制系统、主机不直接相连的数据处理。常用于主机速度不高的数据处理中提高设备的利用率。
+ 如输入输出设备速度慢,远小于$CPU$处理速率,而$CPU$要处理就必须等待输入输出设备,导致$CPU$资源浪费,而脱机技术能让数据更快进出$CPU$,从而速度加快。
#### 假脱机技术实现
+ “假脱机技术”,又称“$SPOOLing$技术”是用软件的方式模拟脱机技术。
+ $SPOOLing$系统组成:
+ 输入井:在磁盘上,磁盘固定区域,模拟脱机输入时的磁带,用于收容$I/O$设备输入的数据。
+ 输出井:在磁盘上,磁盘固定区域,模拟脱机输出时的磁带,用于收容用户进程输出的数据。
+ 输入进程:在内存中,模拟脱机输入时的外围控制机。
+ 输出进程,在内存中,模拟脱机输出时的外围控制机。
+ 输入缓冲区与输出缓冲区:在内存中,用于暂存输入的数据转存到输入井中,或暂存输出的数据转存到输出井中。
+ 由预输入程序、井管理程序、缓输出程序管理。
+ 用户进程实际分配的是外存区,即虚拟设备。
+ 必要条件:
+ 大容量、高速度的外存作为输入井和输出井。
+ $SPOOLing$软件。
+ 由于需要对设备进行虚拟,所以需要独占设备。
#### 共享打印机
打印机是一种独占式设备,而通过假脱机技术变成共享设备。
当多个用户进程提出输出打印的请求时,系统会答应它们的请求,但是并不是真正把打印机分配给他们,而是由假脱机管理进程处理:
1. 在磁盘输出井中为进程申请一个空闲缓冲区(也就是说,这个缓冲区是在磁盘上的),并将要打印的数据送入其中。
2. 为用户进程申请一张空白的打印请求表,并将用户的打印请求填入表中(其实就是用来说明用户的打印数据存放位置等信息的),再将该表挂到假脱机文件队列(打印任务队列)上。
3. 当打印机空闲时,输出进程会从文件队列的队头取出一张打印请求表,并根据表中的要求将要打印的数据从输出井传送到输出缓冲区,再输出到打印机进行打印。用这种方式可依次处理完全部的打印任务。