5.2 缓冲区管理、设备分配与 SPOOLing
磁盘高速缓存与缓冲区的作用;单缓冲、双缓冲、循环缓冲、缓冲池及其时间计算;设备分配的因素、安全与不安全分配方式,设备分配的数据结构(SDT、DCT、COCT、CHCT)与逻辑设备表;假脱机技术 SPOOLing 与共享打印机;设备驱动程序接口。
高速缓存与缓冲区
磁盘高速缓存
磁盘高速缓存(disk cache)利用内存中的存储空间暂存从磁盘中读出的一系列盘块中的信息。它在逻辑上属于磁盘,物理上驻留在内存中。磁盘高速缓存可以是内存中一个单独的、大小固定的存储空间,也可以把所有未用的内存空间变为一个缓冲池,供请求分页系统和磁盘 I/O 共享。
缓冲区的作用
在设备管理子系统中,引入缓冲区的目的主要有:
- 缓和 CPU 与 I/O 设备之间速度不匹配的矛盾;
- 减少对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制;
- 解决基本数据单元大小(数据粒度)不匹配的问题;
- 提高 CPU 与 I/O 设备之间的并行性。
缓冲区可以用硬件缓冲器实现(成本高,只在关键地方使用),更多的是利用内存作为缓冲区。
单缓冲与双缓冲
分析时设:T 为把一块数据从设备输入到缓冲区的时间,M 为把数据从缓冲区传送到用户区的时间,C 为 CPU 处理一块数据的时间。
- 单缓冲:在设备和处理机之间只设置一个缓冲区。缓冲区中的数据必须全部传送到用户区后,才能输入下一块;而用户区中的数据处理完后,才能从缓冲区传送下一块。因此每块数据的平均处理时间为 max(C, T) + M。
- 双缓冲:设置两个缓冲区。设备先向缓冲区 1 输入,装满后转向缓冲区 2 输入,同时 CPU 从缓冲区 1 取数据处理……两个缓冲区交替使用,设备可以连续输入。每块数据的平均处理时间为 max(C + M, T)。若 C + M < T,磁盘可以连续工作;若 C + M > T,CPU 不必等待设备输入。
双缓冲常用于两台机器之间的双向通信:为每台机器设置两个缓冲区,一个用作发送缓冲区,一个用作接收缓冲区。
循环缓冲与缓冲池
- 循环缓冲:包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个,构成环形。用 in 指针指向可以输入数据的第一个空缓冲区,out 指针指向可以提取数据的第一个满缓冲区。
- 缓冲池:由多个系统公用的缓冲区组成,按使用状况分为三个队列:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列);还有四种工作缓冲区:用于收容输入数据的、提取输入数据的、收容输出数据的、提取输出数据的工作缓冲区。
缓冲区是一种临界资源,同一时刻只允许一个进程访问。
设备分配与回收
设备分配时应考虑的因素
- 设备的固有属性:独占设备(一个时段只允许一个进程使用,如打印机);共享设备(允许多个进程同时访问,宏观上同时、微观上交替,如磁盘);虚拟设备(采用 SPOOLing 技术把独占设备改造为共享设备)。
- 设备分配算法:先来先服务、优先级高者优先等。
- 设备分配中的安全性:
- 安全分配方式:进程发出 I/O 请求后便进入阻塞态,直到 I/O 完成才被唤醒。这样进程不会在占有一个设备的同时再请求其他设备,摒弃了「请求和保持」条件,不会死锁;但 CPU 与 I/O 设备是串行工作的。
- 不安全分配方式:进程发出 I/O 请求后仍继续运行,需要时又可以发出第二个、第三个 I/O 请求。进程推进迅速,但可能死锁。
设备分配的数据结构
- 系统设备表(SDT):整个系统一张,记录系统中全部设备的情况,每个设备占一个表目,包括设备类型、设备标识符、指向 DCT 的指针、驱动程序入口等;
- 设备控制表(DCT):每个设备一张,记录设备类型、设备标识符、设备状态(忙/闲)、指向 COCT 的指针、重复执行次数、设备队列的队首指针(等待该设备的进程 PCB 队列)等;
- 控制器控制表(COCT):每个设备控制器一张,记录控制器的状态以及与之相连的通道(指向 CHCT 的指针);
- 通道控制表(CHCT):每个通道一张,记录通道的状态以及与之相连的控制器。
分配过程:① 根据进程请求的物理设备名查找 SDT,找到该设备的 DCT,若设备忙则把进程的 PCB 挂到设备等待队列上,否则分配设备;② 根据 DCT 找到 COCT,若控制器忙则把 PCB 挂到控制器等待队列上,否则分配控制器;③ 根据 COCT 找到 CHCT,若通道忙则挂到通道等待队列上,否则分配通道。只有设备、控制器和通道三者都分配成功,这次设备分配才算成功,然后才能启动 I/O。
为了实现设备独立性,用户编程时使用逻辑设备名。系统设置一张逻辑设备表(LUT),每个表项包含逻辑设备名、物理设备名和设备驱动程序的入口地址。进程用逻辑设备名请求设备时,系统为它分配相应的物理设备,并在 LUT 中建立一个表项;以后进程再用这个逻辑设备名请求 I/O 时,系统查 LUT 就能找到物理设备和驱动程序。LUT 可以整个系统设置一张(适用于单用户系统),也可以每个用户一张(放在用户的 PCB 中)。
假脱机技术(SPOOLing)
早期为了缓和 CPU 的高速性与 I/O 设备低速性的矛盾,引入了脱机输入/输出技术:用专门的外围控制机把低速 I/O 设备上的数据传送到高速磁盘上(或相反)。SPOOLing(假脱机)技术则是在联机情况下实现的同时外围操作:利用多道程序设计技术,用一道程序来模拟脱机 I/O 中外围控制机的功能。
SPOOLing 系统由三部分组成:
- 输入井和输出井:在磁盘上开辟的两个存储区域。输入井模拟脱机输入时的磁盘,暂存 I/O 设备输入的数据;输出井模拟脱机输出时的磁盘,暂存用户程序的输出数据;
- 输入缓冲区和输出缓冲区:在内存中开辟的两个缓冲区,输入缓冲区暂存由输入设备送来的数据,以后再传送到输入井;输出缓冲区暂存从输出井送来的数据,以后再传送到输出设备;
- 输入进程和输出进程:输入进程模拟脱机输入时的外围控制机,把用户要求的数据从输入设备经输入缓冲区送到输入井;输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据从输出井经输出缓冲区送到输出设备。
共享打印机是 SPOOLing 的典型应用。用户进程请求打印时,SPOOLing 系统并不真正把打印机分配给它,而是:① 在输出井中为它申请一个空闲盘块区,把要打印的数据送入其中;② 为用户进程申请一张空白的用户请求打印表,填入打印要求,再把该表挂到假脱机文件队列上。对用户进程而言,打印已经「完成」了。打印机空闲时,输出进程从队首取出一张请求表,把数据从输出井传送到输出缓冲区,再由打印机打印。
SPOOLing 的特点:提高了 I/O 的速度(对低速 I/O 设备的操作变成了对磁盘输入井、输出井的操作);把独占设备改造成了共享设备;实现了虚拟设备的功能——每个进程都感觉自己独占了一台设备。
设备驱动程序接口
为了使新的设备驱动程序能方便地加入系统,要求每个设备驱动程序与操作系统之间都有统一的接口:操作系统为每类设备定义一组驱动程序必须提供的函数(如 open、read、write、ioctl),并规定驱动程序可以调用的内核函数。这样,添加新设备时只需按照接口编写驱动程序,而不必修改操作系统的其他部分。
即时练习
- 1某文件占 10 个磁盘块,现要把该文件磁盘块逐个读入主存缓冲区,并送用户区进行分析。假设一个缓冲区与一个磁盘块大小相同,把一个磁盘块读入缓冲区的时间为 100 μs,将缓冲区的数据传送到用户区的时间是 50 μs,CPU 对一块数据进行分析的时间为 50 μs。在单缓冲区和双缓冲区结构下,读入并分析完该文件的时间分别是( )。
- 2下列关于 SPOOLing 技术的叙述中,错误的是( )。
- 3程序员利用系统调用打开 I/O 设备时,通常使用的设备标识是( )。
- 4在采用 SPOOLing 技术的系统中,用户进程请求打印输出时,打印数据首先被送到( )。
- 5下列关于设备分配的叙述中,正确的是( )。
- 6引入缓冲技术的主要目的不包括( )。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。