一. 设备独立性软件
也称与设备无关的软件,是I/O系统的最高层软件,它的下层是设备驱动程序,其界限因操作系统和设备的不同而有所差异。
比如,一些本应由设备独立性软件实现的功能,也可能放在设 备驱动程序中实现。
这样的差异主要是出于对操作系统、设备独立性软件和设备驱动程序运行效 率等多方面因素的权衡。总体而言,设备独立性软件包括执行所有设备公有操作的软件。
二. 高速缓存与缓冲区
磁盘高速缓存(Disk Cache)
设置磁盘缓冲区的目的
操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对访问高速缓存要比访问原始磁 盘数据更为高效。例如,正在运行进程的数据既存储在磁盘上,又存储在物理内存上,也被复制 到CPU的二级和一级高速缓存中。不过,磁盘高速缓存技术不同于通常意义下的介于CPU与内 存之间的小容量高速存储器,而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中 的信息。因此,磁盘高速缓存逻辑上属于磁盘,物理上则是驻留在内存中的盘块。
磁盘高速缓存在内存中分为两种形式:一种是在内存中开辟一个单独的空间作为缓存区,大小 固定;另一种是将未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘I/O时共享。
缓冲区(Buffer)
在设备管理子系统中,引入缓冲区的目的主要如下:
1)缓和CPU与I/O设备间速度不匹配的矛盾。
2)减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
3)解决基本数据单元大小(数据粒度)不匹配的问题。
4)提高CPU和I/O设备之间的并行性。 缓冲区的实现方法如下:
1)采用硬件缓冲器,但由于成本太高,除一些关键部位外,一般不采用硬件缓冲器。
2)利用内存作为缓冲区,本节要介绍的正是由内存组成的缓冲区。 根据系统设置缓冲区的个数,缓冲技术可以分为如下几种:
单缓冲
双缓冲
循环缓冲
缓冲池
三. 设备分配与回收
设备分配概述
设备分配是指根据用户的I/O请求分配所需的设备。
分配的总原则是充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁。
设备分配的数据结构
在系统中,可能存在多个通道,每个通道可以连接多个控制器,每个控制器可以连接多个物 理设备。设备分配的数据结构要能体现出这种从属关系,各数据结构的介绍如下。
设备控制表(DCT):系统为每个设备配置一张DCT,表中的表项就是设备的各个属性,如图所示。在DCT中,应该有下列字段:
- 设备类型:表示设备类型,如打印机、扫描仪、键盘等。
- 设备标识符:即物理设备名,每个设备在系统中的物理设备名是唯一的。
- 设备状态:表示当前设备的状态(忙闲)。
- 指向控制器表的指针:每个设备由一个控制器控制,该指针指向对应的控制器表。
- 重复执行次数或时间:重复执行次数达到规定值仍不成功时,才认为此次I/O失败。
- 设备队列的队首指针:指向正在等待该设备的进程队列(由进程PCB组成)的队首。
注意:当某个进程释放某个设备,且无其他进程请求该设备时,系统将该设备DCT中的设备状 态改为空闲,即可实现“设备回收”。
- 控制器控制表(COCT):每个设备控制器都对应一张COCT,如图5.12(a)所示。操作系 统根据COCT的信息对控制器进行操作和管理。每个控制器由一个通道控制,通过表项 “与控制器连接的通道表指针”可以找到相应通道的信息。
- 通道控制表(CHCT):每个通道都对应一张CHCT,如图5.12(b)所示。操作系统根据CHCT 的信息对通道进行操作和管理。一个通道可为多个控制器服务,通过表项“与通道连接 的控制器表首址”可以找到该通道管理的所有控制器的信息。
- **系统设备表(SDT)😗*整个系统只有一张SDT,如图所示。它记录已连接到系统中 的所有物理设备的情况,每个物理设备对应一个表目。
在多道程序系统中,进程数多于资源数,因此要有一套合理的分配原则,主要考虑的因素有 设备的固有属性、设备的分配算法、设备分配的安全性以及设备的独立性。
设备分配考虑的因素
- 设备的固有属性
设备的固有属性可分成三种,对它们应采取不同的分配策略:
- 独占设备:将它分配给某个进程后,便由该进程独占,直至进程完成或释放该设备。
- 共享设备:可将它同时分配给多个进程,需要合理调度各个进程访问该设备的先后次序。
- 虚拟设备:虚拟设备属于可共享设备,可将它同时分配给多个进程使用。
- 设备分配算法
针对设备分配,通常只采用以下两种分配算法:
- FCFS算法。该算法根据各个进程对某个设备提出请求的先后次序,将这些进程排成一个 设备请求队列,设备分配程序总是将设备首先分配给队首进程。
- 最高优先级优先算法。在用该算法形成设备队列时,优先级高的进程排在设备队列前面, 而对于优先级相同的I/O请求,则按FCFS原则排队。
设备分配中的安全性
设备分配中的安全性是指在设备分配中应防止发生进程死锁。
- 安全分配方式。每当进程发出I/O请求后,便进入阻塞态,直到其1/O操作完成时才被唤 醒。这样,进程一旦获得某种设备后便会阻塞,不能再请求任何资源,而在它阻塞时也 不保持任何资源。
- 优点是设备分配安全
- 缺点是CPU和I/O设备是串行工作的。
- 不安全分配方式。进程在发出I/O请求后仍继续运行,需要时又会发出第二个、第三个 I/O请求等。仅当进程所请求的设备已被另一进程占用时,才进入阻塞态。
- 优点是一个进 程可同时操作多个设备,使进程推进迅速;
- 缺点是有可能造成死锁。
设备分配步骤
下面以独占设备为例,介绍设备分配的过程。
- 分配设备。首先根据I/O请求中的物理设备名,查找SDT,从中找出该设备的DCT,再根据DCT中的设备状态字段,可知该设备的状态。
- 若忙,则将进程PCB挂到设备等待队列中;
- 若不忙,则根据一定的策略将设备分配给该进程。
- 分配控制器。设备分配后,根据DCT找到COCT,查询控制器的状态。
- 若忙,则将进程PCB挂到控制器等待队列中;
- 若不忙,则将控制器分配给该进程。
- 分配通道。控制器分配后,根据COCT找到CHCT,查询通道的状态。
- 若忙,则将进程PCB挂到通道等待队列中;
- 若不忙,则将通道分配给该进程。只有设备、控制器和通道都分配成功时,这次的设备分配才算成功,之后便可启动设备进行数据传送。
在上面的例子中,进程是以物理设备名提出I/O请求的。若指定设备已分配给其他进程,则 该进程分配失败;或者说上面的设备分配程序不具有设备无关性。为了获得设备的独立性,进程 应使用逻辑设备名。这样,系统首先从SDT中找出第一个该类设备的DCT。若该设备忙,则查找第二个该类设备的DCT,仅当所有该类设备都忙时,才将进程挂到该类设备的等待队列上。而 只要有一个该类设备可用,系统便进入进一步的分配操作。
设备分配步骤改进
逻辑设备名到物理设备名的映射
为了实现设备的独立性,进程中应使用逻辑设备名来请求某类设备。但是,系统只识别物理 设备名,因此在系统中需要配置一张逻辑设备表,用于将逻辑设备名映射为物理设备名。 逻辑设备表(Logical Unit Table,LUT)的每个表项中包含3项内容:逻辑设备名、物理设 备名和设备驱动程序的入口地址。当进程用逻辑设备名来请求分配设备时,系统会为它分配一台 相应的物理设备,并在LUT中建立一个表目,填上相应的信息,当以后进程再利用该逻辑设备名 请求I/O操作时,系统通过查找LUT来寻找对应的物理设备及其驱动程序。
在系统中,可采取两种方式设置逻辑设备表:
1)整个系统中只设置一张LUT。如图5.13(a)所示。所有进程的设备分配情况都记录在同一 张LUT中,这就要求所有用户不能使用相同的逻辑设备名,主要适用于单用户系统。
2)为每个用户设置一张LUT。如图5.13(b)所示。系统为每个用户设置一张LUT,同时在多 用户系统中都配置系统设备表。因此,不同用户可以使用相同的逻辑设备名。
四. SPOOLing 技术(假脱机技术)
概述
为了缓和CPU的高速性与I/O设备的低速性之间的矛盾,引入了假脱机技术,它是操作系统 中采用的一项将独占设备改造成共享设备的技术。
该技术利用专门的外围控制机,先将低速I/O 设备上的数据传送到高速磁盘上,或者相反。当CPU需要输入数据时,便可直接从磁盘中读取数 据;反之,当CPU需要输出数据时,也能以很快的速度将数据先输出到磁盘上。
需要多道程序技术支持,系统便可利用程序来模拟脱机输入/输出时的外围控制机,在主机的直接控制下实现**脱机输入/输出功能 **[ 脱机:输入/输出不需要 CPU/主机干预 ]。
SPOOLing系统的组成如图所示。
SPOOLing 系统组成
输入井和输出井
在磁盘上开辟出的两个存储区域。
- 输入井模拟脱机输入时的磁盘,用于收容I/O设备输入的 数据。
- 输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。一个进程的输入(或输出) 数据保存为一个文件,所有进程的输入(或输出)文件链接成一个输入(或输出)队列。
输入缓冲区和输出缓冲区
在内存中开辟的两个缓冲区。
- 输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输 入井。
- 输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。
输入进程和输出进程
- 输入进程用于模拟脱机输入时的外围控制机,将用户要求的数据从输入设备传送到输入缓冲 区,再存放到输入井中。当CPU需要输入数据时,直接从输入井中读入内存。
- 输出进程用于模拟 脱机输出时的外围控制机,将用户要求输入的数据从内存传送到输出井,待输出设备空闲时,再将输出井中的数据经输出缓冲区输出至输出设备。
井管理程序
用于**控制作业与磁盘井之间信息的交换**。
打印机是典型的独占设备,利用SPOOLing技术可将它改造为一台可供多个用户共享的打印 设备。当多个用户进程发出打印输出请求时,SPOOLing系统同意它们的请求,但并不真正立即 将打印机分配给它们,而由假脱机管理进程为每个进程做如下两项工作:
- 在磁盘缓冲区中为进程申请一个空闲盘块,并将要打印的数据送入其中暂存。
- 为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表 挂到假脱机文件队列上。
对每个用户进程而言,系统并非即时执行真实的打印操作,而只是即时将数据输出到缓冲区, 这时的数据并未被真正打印,而只让用户感觉系统已为它打印,真正的打印操作是在打印机空闲 且该打印任务在等待队列中已排到队首时进行的。以上过程用户是不可见的。虽然系统中只有一 台打印机,但是当进程提出打印请求时,系统都在输出井中为其分配一个缓冲区(相当于分配一台逻辑设备),使每个进程都觉得自己正在独占一台打印机,从而实现对打印机的共享。
SPOOLing系统的特点
①提高了I/O速度,将对低速I/O设备执行的操作演变为对磁盘缓 冲区中数据的存取操作,如同脱机输入/输出一样,缓和了CPU和低速I/O设备之间速度不匹配 的矛盾;
②将独占设备改造为共享设备,在假脱机打印机系统中,实际上并没有为任何进程分配 设备;
③实现了虚拟设备功能,对每个进程而言,它们都认为自己独占了一台设备。
** SPOOLing技术是一种以空间换时间的技术**,我们很容易理解它牺牲了空间,因为它开辟了 磁盘上的空间作为输入井和输出井,但它又是如何节省时间的呢?
从前述内容我们了解到,磁盘是一种高速设备,在与内存交换数据的速度上优于打印机、键 盘、鼠标等中低速设备。试想一下,若没有SPOOLing技术,CPU要向打印机输出要打印的数据, 打印机的打印速度比较慢,CPU就必须迁就打印机,在打印机将数据打印完后才能继续做其他的 工作,浪费了CPU的不少时间。在SPOOLing技术下,CPU要打印机打印的数据可以先输出到 磁盘的输出井中(这个过程由假脱机进程控制),然后做其他的事情。若打印机此时被占用,则 SPOOLing系统就会将这个打印请求挂到等待队列上,待打印机有空时再将数据打印出来。向磁 盘输出数据的速度比向打印机输出数据的速度快,因此就节省了时间。
五. 设备驱动程序接口
设备驱动程序是I/O系统的上层与设备控制器之间的通信程序,其主要任务是接收上层应用 发来的抽象I/O请求,如read或write命令,将它们转换为具体要求后发送给设备控制器,进而 使其启动设备去执行任务;反之,它也将设备控制器发来的信号传送给上层应用。
设备驱动程序的功能
为了实现上层应用与设备控制器之间的通信,设备驱动程序应具有以下功能
- ①接收由上层 软件发来的命令和参数,并将抽象要求转换为与设备相关的具体要求。
- 例如,将抽象要求中的盘 块号转换为磁盘的盘面号、磁道号及扇区号。
- ②检查用户I/O请求的合法性,了解设备的工作状态,传递与设备操作有关的参数,设置设备的工作方式。
- ③发出I/O命令,若设备空闲,则立即启动它,完成指定的I/O操作;若设备忙,则将请求者的PCB挂到设备队列上等待。
- ④及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理。
设备驱动程序的特点
相比于普通的应用程序和系统程序,设备驱动程序具有以下差异
①设备驱动程序将抽象的 I/O请求转换成具体的I/O操作后,传送给设备控制器,并将设备控制器中记录的设备状态和I/O 操作的完成情况及时地反馈给请求进程。
②设备驱动程序与设备采用的I/O控制方式紧密相关, 常用的I/O控制方式是中断驱动方式和DMA方式。
③设备驱动程序与硬件密切相关,对于不同类型的设备,应配置不同的设备驱动程序。
④由于设备驱动程序与硬件紧密相关,目前很多设备驱动程序的基本部分已固化在ROM中。
⑤设备驱动程序应允许同时多次调用执行。
为了使所有的设备驱动程序都有统一的接口,一方面,要求每个设备驱动程序与操作系统之 间都有相同或相近的接口,以便更容易地添加一个新的设备驱动程序,同时更容易地编制设备驱 动程序;另一方面,要将抽象的设备名转换为具体的物理设备名,并且进一步找到相应的设备驱 动程序入口。此外,还应对设备进行保护,防止无权访问的用户使用设备。