操作系统:输入输出系统(下)

4,设备驱动程序

设备处理程序通常又称为设备驱动程序,它是I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象I/O要求,如read或write命令,再把它转换为具体的要求后,发送给设备控制器,启动设备去执行:反之,它也将由设备控制器发来的信号传送给上层软件。由于设备驱动程序与硬件密切相关,故通常应为每一类设备配置一种驱动程序。例如,打印机和显示器需要不同的驱动程序。

4.1,设备驱动程序

1,设备驱动程序的功能

(1)接收由设备独立性软件发来的命令和参数,并将命令中的抽象要求转换为具体要求,例如,将磁盘块号转换为磁盘的盘面、磁道号及扇区号。

(2)检查用户I/O请求的合法性,了解I/O设备的状态,传递有关参数,设置设备的工作方式

(3)发出I/O命令。如果设备空闲,便立即启动I/O设备去完成指定的I/O操作;如果设备处于忙碌状态,则将请求者的请求块挂在设备队列上等待。

(4)及时响应由控制器或通道发来的中断请求,并根据其中断类型调用相应的中断处理程序进行处理

2,设备驱动程序的特点

(1)驱动程序是实现在与设备无关的软件和设备控制器之间通信和转换的程序。它将抽象的I/O请求转换成具体的I/O操作后传送给控制器;又把控制器中所记录的设备状态和I/O操作完成情况,及时地反映给请求I/O的进程。

(2)驱动程序与设备控制器和I/O设备的硬件特性紧密相关,对不同类型的设备应配置不同的驱动程序

(3)驱动程序与I/O设备所采用的I/O控制方式紧密相关。常用的I/O控制方式是中断驱动DMA方式

(4)由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言编写

(5)驱动程序应允许可重入

3,设备处理方式(不同的操作系统中,所采用的设备处理方式并不完全相同)

(1)为每一类设备设置一个进程专门用于执行这类设备的I/O操作。比如,为所有的交互式终端设置一个交互式终端进程;又如,为同一类型的打印机设置一个打印进程。

(2)在整个系统中设置一个I/O进程,专门用于执行系统中所有各类设备的I/O操作。也可以设置一个输入进程和一个输出进程,分别处理系统中所有各类设备的输入或输出操作。

(3)不设置专门的设备处理进程,而只为各类设备设置相应的设备处理程序(模块)供用户进程或系统进程调用

4.2,设备驱动程序的处理过程

设备驱动程序的主要任务是启动指定设备,完成上层指定的I/O工作。但在启动前,应先完成必要的准备工作。

(1)将抽象要求转换为具体要求:通常在每个设备控制器中都含有若干个寄存器,分别用于暂存命令、参数和数据等。由于用户及上层软件对设备控制器的具体情况毫无了解,因而只能发出抽象的要求(命令),这些命令是无法传送给设备控制器的。因此,就需要将这些抽象的要求转换为具体的要求。例如,将要求中的盘块号转换为磁盘的盘面、磁道号及扇面区。而这一转换工作只能由驱动程序来完成,因为在OS中只有驱动程序才同时了解抽象要求和设备控制器中的寄存器情况,也只有它才直到命令、数据和参数应分别送往哪里。

(2)对服务请求进行校验是驱动程序在启动I/O设备之前,必须减产该用户的I/O请求是不是该设备能够执行的。一个非法的请求的典型例子是,用户试图请求从一台打印机读入数据。如果驱动程序能够检查出这类错误,便认为这次I/O请求非法,它将向I/O系统报告I/O出错。I/O系统可以根据具体情况做出不同的决定。如可以停止请求进程的运行,或者仅通知请求进程它的I/O请求有错,但仍让它继续运行。此外,还有些设备如磁盘和终端,它们虽然都是即可读,又可写的,但若在打开这些设备时规定是读,则用户的写请求必然被拒绝。

(3)检查设备的状态:启动某个程序进行I/O操作,其前提条件是该设备正处于就绪状态。为此,在每个设备控制器中,都配置有一个状态寄存器。驱动程序在启动设备之前,要先把状态寄存器中的内容读入到CPU的某个寄存器中,通过测试寄存器中的不同位,来了解设备的状态。

(4)传送必要的参数在确定设备处于接收(发送)就绪状态后,便可向控制器的相应寄存器传送数据及与控制本次数据传输有关的参数。例如,在某种设备控制器中配置了两个控制寄存器,其中一个是命令寄存器,用于存放处理机发来的各种控制命令,以决定本次I/O操作是接收数据还是发送数据等。另一方面是方式寄存器,它用于控制本次传送数据的速率、发送的字符长度等。

(5)启动I/O设备:驱动器完成上述各项准备工作后,驱动程序可以向控制器中的命令寄存器传送相应的控制命令。对于字符设备,若发出的是写命令,驱动程序便把一个字符或字传送给控制器;若发出的是读命令,则驱动程序等待接收数据,并通过读入控制器的状态寄存器中的状态字的方法来确定数据的是否到达。

在多道程序系统中,驱动程序一旦发出I/O命令,启动了一个I/O操作后,驱动程序便把控制返回给I/O系统,把自己阻塞起来,直到中断到来时再被唤醒。具体的I/O操作实在设备控制器的控制下进行的,因此,在设备忙于传送数据时,处理机又可以去干其他的事情,实现了处理机与I/O设备的并行操作。

4.3,对I/O设备的控制方式

1,使用轮询的可编程I/O方式:CPU忙等待方式(查询方式)

2,使用中断的可编程I/O方式CPU与外设并行操作,适用于慢速设备

无中断机构:由于CPU的高速性和I/O设备的低速性,致使CPU的绝大部分时间都处于等待I/O设备完成数据I/O的循环测试中,造成对CPU的极大浪费

例子:老师给学生布置画4幅画的任务。

  • 无中断:先给同学发一张白纸之后老师开始不断地询问“画完了吗?”直到学生画完后,老师将第一幅画收走,放到讲台,然后发放第二张白纸,学生开始画第二幅画…;其间:老师需要不断询问;由老师收画,并放至讲台;
  • 有中断:先给同学发一张白纸之后老师去忙别的事情,学生画完第一幅画后,向老师报告,老师将第一幅画收走,放到讲台,然后发放第二张白纸,学生开始画第二幅画,学生需要报告4次,老师也被打扰4次。其间:老师无需不断询问;由老师收画,并放至讲台;老师频繁地被打断,无法静心完成一项复杂任务
  • DMA:一次给同学发放四张白纸,并告诉学生需要画4 画,画完后交至讲台。交过后向老师报告其间:老师无需不断询问;由学生自己将画放至讲台;老师不再频繁地被打断,可完成一项较为复杂任务;但如果是:学生需要先画画送至讲台后,领取作文纸写5篇文章送至办公室。则需要老师2次布置任务!!
  • I/O通道:老师将学生该做的任务写在纸上,并交待班长到办公室取任务 所有同学都完成任务后,班长向老师汇报其间:老师无需不断询问;由学生自己将画放至讲台,文章送至办公室;班长分担了老师的工作,老师可以去完成复杂任务;一次布置,完成多项任务;

3,DMA(直接存储访问)方式CPU与块设备并行操作

(1)接存储器访问方式的引入虽然中断驱动I/O比程序I/O方式更有效,但它仍以字(节)为单位进行I/O的。每当完成一个字(节)的I/O时,控制器便向CPU请求一次中断。换而言之,采用中断驱动I/O方式时的CPU,是以字(节)为单位进行干预的。如果将这种方式用于块设备的I/O时,显然是极其低效的。

  • 数据传输的基本单位是数据块,即在CPUI/O设备之间,每次传送至少一个数据块;
  • 所传送的数据是从设备直接送入内存的或者相反
  • 仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在控制器的控制下完成的。

可见,DMA方式较之中断驱动方式,又是成百倍地减少了CPUI/O的干预,进一步提高了CPUI/O设备的并行操作程度

(2)DMA控制器的组成:DMA控制器由三部分组成:主机与DMA控制器的接口;DMA控制器与块设备的接口;I/O控制逻辑。

为了实现在主机与控制器之间成块数据的直接交换,必须在DMA控制器中设置如下四类寄存器:

  • 命令/状态寄存器(CR)。用于接收从CPU发来的I/O命令,或有关控制信息,或设备的状态。
  • 内存地址寄存器(MAR)。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。 
  • 数据寄存器(DR)。用于暂存从设备到内存,或从内存到设备的数据。
  • 数据计数器(DC)。存放本次CPU要读或写的字()数。

(3)DMA工作过程:CPU要从磁盘读入一数据块时,便向磁盘控制器发送一条读命令该命令被送到其中的命令寄存器(CR)。同时,还须发送本次要将数据读入的内存起始目标地址,该地址被送入内存地址寄存器(MAR)中;本次要读数据的字()送入数据计数器(DC),还须将磁盘中的源地址直接送至DMA控制器的I/O控制逻辑上。然后,启动DMA控制器进行数据传送,以后,CPU便可去处理其它任务。此后,整个数据传送过程便由DMA控制器进行控制。当DMA控制器已从磁盘中读入一个字()的数据并送入数据寄存器(DR),再挪用一个存储器周期,将该字()传送到MAR所指示的内存单元中。接着便对MAR内容加1,将DC内容减1。若减1DC内容不为0,表示传送未完,便继续传送下一个字();否则,由DMA控制器发出中断请求。图5-9DMA方式的工作流程。

4,I/O通道控制方式

通道通过执行通道程序,与设备控制器共同实现对I/O设备的控制。可实现CPU、通道和I/O设备三者的并行操作,从而更有效地提高整个系统的资源利用率。

CPU要完成一组相关的读(或写)操作及有关控制时,只需向I/O通道发送一条I/O指令,以给出其所要执行的通道程序的首址和要访问的I/O设备,通道接到该指令后,通过执行通道程序便可完成CPU指定的I/O任务。

通道指令与一般的机器指令不同,在它的每条指令中都包含以下信息:

(1)操作码  规定了指令所执行的操作。

(2)内存地址 表明字符送入内存(读操作)和从内存取出(写操作)时的内存首址。

(3)计数 该信息表示本条指令所要读(或写)数据的字节数

(4)通道程序结束位P 表示通道程序是否结束

(5)记录结束标志RR0,表示与下一条指令处理的数据属于一个记录;R=1,表示是处理某记录的最后一条指令。

5,与设备无关的I/O软件

为了方便用户和提高OS的可适应性与扩展性,在现代OS的I/O系统中,都无一例外地增加了与设备无关的I/O软件,以实现设备的独立性,也称为设备无关性。

5.1,设备无关软件的基本概念

1,以物理设备名使用设备

在早期OS中,应用程序再使用I/O设备时,都使用设备的物理名称,这就使得应用程序与系统中的物理设备直接相关。当应用进程运行时,如果所请求的物理设备(独占设备类型)已分配给其他进程,而此时尽管还有几台其他的相同设备空闲可用,但系统只能根据设备的物理名来分配,无法将另外相同的设备(但具有不同的物理设备名)分配给它,致使该应用进程请求I/O失败被阻塞。当应用程序所需要的设备在系统中已经被更新时,该应用程序将再也无法在该系统上运行。可见,应用程序直接与物理设备相关时非常不灵活的,给用户带来了很大的方便,且对提高I/O设备利用率也很不顺利。

2,引入了逻辑设备名

为了实现与设备的无关性而引入逻辑设备物理设备两个概念。逻辑设备是抽象设备名,如/dev/printer,该设备名只是,说明用户需要使用打印机来打印输出,但并没有指定具体是哪一台打印机。这样,如果在应用程序中,使用逻辑设备名称请求使用某类设备,系统在对她进行设备分配时,先查找该类设备中的第一台,如果它已被分配,系统可立即去查找该类设备中的第二台,若又被分配,系统接着去找第三台,若它尚未被分配,便可将这台设备分配给进程。

与设备的无关软件还可实现I/O重定向。所谓I/O重定向是指用于I/O操作的设备可以更换(即重定向)而不必改变应用程序例如,我们在调试一个应用程序时,可将程序的所有输出送往屏幕显示;而在程序调试完后,如需正式将程序的运行结果打印出来,此时便须将I/O重定向的数据结构——逻辑设备表中的显示终端改为打印机,而不必修改应用程序。I/O重定向功能具有很大的实用价值,现已被广泛地引入到各类OS中。

3,逻辑设备名到物理设备名称的转换

在应用程序中,用逻辑设备名称使用设备虽然方便了用户,但系统却只识别物理设备名称,因此在实际执行时,还必须使用物理名称。为了实现设备的独立性,系统必须设置一张逻辑设备表(LUT)用于将应用程序中所使用的逻辑设备名映射为物理设备名

5.2,与设备无关的软件

与设备无关的软件是I/O系统的最高层软件,在它下面的是设备驱动程序,其间的界限,因操作系统和设备的不同有所差异比如,对于一些本应由设备独立性软件实现的功能,却放在设备驱动程序中实现。这样的差异主要时出于对操作系统、设备独立性和设备驱动程序运行效率等多方面的权衡和考虑。总的来说,在与设备无关的软件中,包括了执行所有设备共有操作的软件。

1,设备驱动程序的一接口:为了使所有的设备驱动程序由着统一的接口,一方面,要求每个设备驱动程序与OS之间都有着相同的接口,或者相近的接口,这样会使添加一个新的设备驱动程序变得很容易。另一方面,要将抽象的设备名映射到适当的驱动程序上,或者说,将抽象的设备名转换为具体的物理设备名,并进一步可以找到相应物理设备的驱动程序入口。此外,还要对设备进行保护,禁止用户直接访问设备,以防止无权访问的用户使用。

2,缓冲管理即对字符设备和块设备的缓冲区进行有效的管理,以提高I/O的效率;

3,差错控制。由于在I/O操作中的绝大多数错误都与设备无关,故主要由设备驱动程序处理,而设备独立性软件只处理那些设备驱动程序无法处理的错误;

(1)暂时性错误:因发生暂时性事件引起的,如电源的波动。(2)持久性错误:由持久性故障引起的,如电源掉电。

4,对独立设备的分配与回收:在系统中有两类设备:独占设备和共享设备。对于独占设备,为了避免诸进程对独占设备的争夺,必须由系统统一分配,不允许进程自由使用。每当进程需要使用某(独占)设备时,必须先提出申请。OS接到对设备的请求后,先对进程所请求的独占设备进行检查,看该设备是否空闲。若空闲,才把该设备分配给请求进程。否则,进程将被阻塞,放入该设备的请求队列中等待。等到其他进程释放该设备时,再将队列中的第一个进程唤醒,该进程获得到设备后继续运行。

5,独立于设备的逻辑数据块:不同类型的设备,其数据交换单位是不同的,读取和传输速率也各不相同,如字符型设备以单个字符(字)为单位,块设备是以一个数据块为单位。即使同一类型的设备,其数据交换单位也是由差异的,如不同磁盘由于扇区大小的不同,可能造成数据块大小的不一致。设备独立性软件应能够隐藏这些差异而被逻辑设备使用,并向高层软件提供大小统一的逻辑数据库。

5.3,设备分配

系统借助SDT,COCT,CHCT,DCT四种表格得知当前各部件的使用情况,并对其进行管理。

1,设备分配的数据结构

DCT(Device Control Table):设备控制表每台设备一张,记录设备使用情况

  • 设备队列队首指针。凡因请求本设备而等待的进程,其PCB都按照一定的策略排成一个队列,称该队列为设备请求队列或简称设备队列。其队首指针指向队首PCB。在有的系统中还设置了队尾指针。
  • 设备状态。当设备自身正处于使用状态时,应将设备的/闲标志置“1”。若与该设备相连接的控制器或通道正忙,也不能启动该设备,此时则应将设备的等待标志置“1”。
  • 与设备连接的控制器表指针。该指针指向该设备所连接的控制器的控制表。在设备到主机之间具有多条通路的情况下,一个设备将与多个控制器相连接。此时,在DCT中还应设置多个控制器表指针。 
  • 重复执行次数。由于外部设备在传送数据时,较易发生数据传送错误,因而在许多系统中,如果发生传送错误,并不立即认为传送失败,而是令它重新传送,并由系统规定设备在工作中发生错误时应重复执行的次数。在重复执行时,若能恢复正常传送,则仍认为传送成功。仅当屡次失败,致使重复执行次数达到最大值而传送仍不成功时,才认为传送失败。 

COCT(Controller  Control Table):控制器控制表每个控制器一张,记录控制器使用情况

CHCTCHannel Control Table):通道控制表每个通道一张,记录通道使用情况

SDTSystem Devices Table):系统设备表整个系统一张,记录系统拥有的全部设备

2,设备分配时应考虑的因素

(1)设备的固有属性:独占设备:考虑分配安全性,并采用独占分配策略。共享设备:可同时分给多个进程,对进程的访问次序进行合理调度。虚拟设备:可同时分给多个进程,对进程访问该设备的先后次序进行合理调度。

(2)设备的分配算法:先请求先服务:请求进程依次排入设备请求队列。优先级高者优先:请求进程按优先级排入设备请求队列。

(3)设备分配中的安全性:安全分配方式每当进程发出I/O请求后,便进入阻塞状态,直到其I/O操作完成时才被唤醒。不安全分配方式   进程在发出I/O请求后仍继续运行,需要时又发出第二个I/O请求,第三个I/O请求等。此时增加功能,对本次的设备分配是否会发生死锁进行安全性计算。

3,独占设备的分配程序

当某进程提出I/O请求后,系统的设备分配程序可按下述步骤进行设备分配。

  1. 分配设备:首先根据I/O请求中的物理设备名,查找系统设备表(SDT),从中找出该设备的DCT,再根据DCT中的设备状态字段,可知该设备是否正忙。若忙,便将请求I/O进程的PCB挂在设备队列上;否则,便按照一定的算法来计算本次设备分配的安全性。如果不会导致系统进入不安全状态便将设备分配给请求进程;否则,仍将其PCB插入设备等待队列。
  2. 分配控制器:在系统把设备分配给请求I/O的进程后,再到其DCT中找出与该设备连接的控制器的COCT,从COCT的状态字段中可知该控制器是否忙碌。若忙,便将请求I/O进程的PCB挂在该控制器的等待队列上;否则,便将该控制器分配给进程。
  3. 分配通道:在该COCT中又可找到与该控制器连接的通道的CHCT,再根据CHCT内的状态信息,可知该通道是否忙碌。若忙,便将请求I/O的进程挂在该通道的等待队列上;否则,将该通道分配给进程。只有在设备、 控制器和通道三者都分配成功时,这次的设备分配才算成功。然后,便可启动该I/O设备进行数据传送。

设备分配程序的改进:仔细研究上述基本的设备分配程序后可以发现: ① 进程是以物理设备名来提出I/O请求的;② 采用的是单通路I/O系统结构,容易产生“瓶颈”现象。为此,应从以下两方面对基本的设备分配程序加以改进,以使独占设备的分配程序具有更强的灵活性,并提高分配的成功率。

  1. 增加设备的独立性为了获得设备的独立性,进程应使用逻辑设备名请求I/O。这样,系统首先从SDT中找出第一个该类设备的DCT。若该设备忙,又查找第二个该类设备的DCT仅当所有该类设备都忙时,才把进程挂在该类设备的等待队列上;而只要有一个该类设备可用,系统便进一步计算分配该设备的安全性。
  2. 考虑多通路情况为了防止在I/O系统中出现“瓶颈”现象,通常都采用多通路的I/O系统结构。此时对控制器和通道的分配同样要经过几次反复,即若设备(控制器)所连接的第一个控制器(通道)忙时,应查看其所连接的第二个控制器(通道)仅当所有的控制器(通道)都忙时,此次的控制器(通道)分配才算失败,才把进程挂在控制器(通道)的等待队列上。而只要有一个控制器(通道)可用,系统便可将它分配给进程。

5.4,逻辑设备名到物理设备名映射的实现

为了实现与设备的无关性,当应用程序请求使用I/O设备时,应当用逻辑设备名。但系统识别只识别物理设备名,因此在系统中需要配置一张逻辑表,用于将逻辑设备名映射为物理设备名。

1,逻辑设备表LUT(Logical Unit Table)

在逻辑设备表的每个表目中包含了三项:逻辑设备名物理设备名设备驱动程序的入口地址

2,逻辑设备表的设置问题

(1)第一种方式,在整个系统中只设置一个LUT逻辑设备不允许有重名;主要应用于单用户系统;

(2)第二种方式,为每个用户设置一张LUT,并将该表放入用户进程的PCB中。其表项指向系统设备表的表目。设置系统设备表;不同进程的逻辑设备可重名;主要应用于多用户系统;

6,用户层的I/O软件

一般而言,大部分的I/O软件都放在操作系统内部,但仍有一小部分在用户层,其中包括与用户程序链接在一起的库函数,以及完全运行于内核之外的假脱机系统。

6.1,系统调用和库函数

1,系统调用

一方面,为使诸如进程能有条不紊地使用I/O设备,且能保护设备的安全性,不允许运行在用户态的应用进程直接调用运行在核心态的OS过程。但另一方面,应用进程在运行时,又必须取得OS所提供的服务,否则,应用程序几乎无法运行。为了解决此矛盾,OS在用户层中引入了一个中介过程——系统调用,应用程序可以通过它间接调用OS中的I/O过程,对I/O设备进行操作。

当应用程序需要执行某种I/O操作时,在应用程序中必须使用相应的系统调用。当OS捕获到应用程序中的该系统调用后,便将CPU的状态从用户态转到核心态,然后转向操作系统中相应的过程,由该过程完成所需的I/O操作。执行完后,系统又将CPU状态从核心态转换到用户态。

2,库函数

由OS向用户提供的所有功能,用户进程都必须通过系统调用来获取,或者说,系统调用使应用程序取得OS所有服务的唯一途径。在早期的操作中,系统调用是以汇编语言形式提供的,所以只有用汇编语言编写的程序中,才能直接使用系统调用,这对用户是非常不方便的,后来的C语言中,首先提供了与系统调用相对应的库函数。

6.2,假脱机(Spooling)系统

如果说,通过多道程序技术可将一台物理CPU虚拟为多台逻辑CPU,从而允许许多个用户共享一台主机。通过假脱机技术,则可将一台物理I/O设备虚拟为多台逻辑I/O设备,这样也就允许多个用户共享一台物理I/O设备。

1,假脱机技术

为了缓和CPU的高速性与I/O设备低速性间的矛盾,而引入了脱机输入、脱机输出技术。该技术是利用专门的外围控制集,先将低速I/O设备上的数据传送到高速硬盘上,或者相反。这样当处理机需要输入数据时,便可以直接从磁盘中读取数据,极大提高了输入速度。反之,在处理机输出数据时,也可以很快的速度把数据先输出到磁盘上,处理机便可去做自己的事情。

当系统中引入了多道程序技术后,完全可以利用其中的一道程序,来模拟脱机输入时的外围控制机功能,把低速设备上的数据传送到高速磁盘上。在利用另一道程序模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。在联机情况下实现的同时外围操作的技术称为SPOOLing 技术,或称为假脱机技术             

2,SPOOLing的组成

通过假脱机技术,可将一台物理的I/O设备虚拟为多台逻辑I/O设备

(1)输入井和输出井。这是在磁盘上开辟的两个大存储空间输入井是模拟脱机输入时的磁盘设备,用于暂存I/O设备输入的数据输出井是模拟脱机输出时的磁盘,用于暂存用户程序的输出数据

(2)输入缓冲区和输出缓冲区。为了缓和CPU和磁盘之间速度不匹配的矛盾,在内存中要开辟两个缓冲区:输入缓冲区和输出缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井输出缓冲区用于暂存从输出井送来的数据,以后再传送给输出设备

(3)入进程SPi和输出进程SPo。这里利用两个进程来模拟脱机I/O时的外围控制机。其中,进程SPi模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井,当CPU需要输入数据时,直接从输入井读入内存;进程SPo模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。

(4)井管理程序。用于控制作业与磁盘井之间信息的交换

当作业执行过程中向某台设备发出启动输入或输出操作请求时,由操作系统调用井管理程序,由其控制从输入井读取信息或将信息输出至输出井。

3,SPOOLing系统的特点

提高了I/O的速度:对数据所执行的I/O操作,已从对低速I/O设备执行的I/O操作演变为对磁盘缓冲区中数据的存取,如果脱机输入输出一样,提高了I/O速度,缓和了CPU与低速I/O设备之间的不匹配的矛盾。

将独占设备改造为共享设备:因为在假脱机打印系统中,实际上并没有为任何进程分配设备,而只是在磁盘缓冲区中为进程分配一个空闲盘块和建立一张I/O请求表。这样,便把独占设备改造为共享设备。

实现了虚拟设备功能:假脱机系统实现了将独占设备变为若干台对应的逻辑设备的功能。

4,假脱机打印机系统

打印机属于独占设备,利用假脱机技术可将它改造为一台可供多个用户共享的打印设备

假脱机打印系统包括:磁盘缓冲区。用于暂存用户程序的输出数据。打印缓冲区。设置在内存中,暂存从磁盘缓冲区送来的数据,以后在传送给打印设备进行打印。  假脱机管理程序和假脱机打印进程。由假脱机 管理进程为每个要求打印的用户数据建立一个假脱机文件,并把它放入 假脱机文件队列中,由假脱机打印进程依次对队列中的文件进行打印

每当用户进程发出打印输出请求时,由假脱机管理进程完成以下两个工作

  • 在磁盘缓冲区申请一个空闲盘块,并将打印数据送入其中。
  • 申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到假脱机文件队列中

在这两项工作完成后,虽然还没有进行任何实际的打印输出,但对于用户而言,其印请求已经得到满足,打印输出任务已经完成真正的打印输出是假脱机打印进程负责的。 

5,守护进程

对假脱机打印系统进行修改,取消假脱机管理进程,为打印机建立一个守护进程,由它执行一部分原来由假脱机管理进程实现的功能。

  • 守护进程是允许使用打印机的唯一进程。
  • 除了打印机守护进程之外,还可能有许多其它的守护进程。
  • 事实上,凡是需要将独占设备改造为可供多个进程共享的的设备时,都要为该设备配置一个守护进程和一个假脱机文件队列(目录)。

7,缓冲区管理

应用场合数据到达和离去速度不匹配的地方

缓冲管理的职责:组织好这些缓冲区,并提供获得和释放缓冲区的手段。

引入缓冲区的原因可归结为:

  • 缓和CPUI/O设备速度不匹配的矛盾。
  • 减少中断次数
  • 解决数据粒度不匹配的问题。
  • 提高CPU与外设的并行性。

7.1,单缓冲区和双缓冲区

单缓冲情况下,每当用户进程发出一I/O请求时,操作系统便在主存中为之分配一缓冲区

为了加快输入和输出速度,提高设备利用率,引入了双缓冲机制。在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。此时OS可从第一缓冲区中移出数据,并送入用户进程。接着,由CPU对数据进行计算。

在双缓冲时,系统处理一块数据的时间可以粗略地认为是Max(CT)。如果C<T可使块设备连续输入;如果C>T,则可使CPU不必等待设备输入。对于字符设备,若采用行输入方式,则采用双缓冲通常能消除用户的等待时间,即用户在输入完第一行之后,在CPU执行第一行中的命令时,用户可继续向第二缓冲区输入下一行数据。

7.2,环形缓冲区

当输入与输出的速度基本相匹配时,采用双缓冲能获得较好的效果但若两者的速度相差甚远,双缓冲的效果则不够理想。因此,又引入了多缓冲机制,并将多个缓冲区组织成环形缓冲区形式

1,环形缓冲区的组成

类缓冲区(且大小相同):用于装输入数据空缓冲区R已装满数据缓冲区G以及计算进程正在使用现行工作缓冲区C

多个指针:用于指示计算进程下一个可用缓冲区G的指针Nextg、指示输入进程下次可用的空缓冲区R的指针Nexti,以及用于指示计算进程正在使用的缓冲区C的指针Current

2,环形缓冲区的使用

Getbuf过程

  • 计算进程:要使用缓冲区中的数据时,调用Getbuf过程。该过程将由指针Nextg所指示的缓冲区提供给进程使用,相应地,须把它改为现行工作缓冲区,并Current指针指向该缓冲区的第一个单元,同时将Nextg移向下一个G缓冲区
  • 输入进程:要使用空缓冲区来装入数据时,也调用Getbuf过程,由该过程将指针Nexti所指示的缓冲区提供给输入进程使用,同时Nexti指针移向下一个R缓冲区

Releasebuf过程

  • 计算进程:把C缓冲区中的数据提取完毕时,便调用Releasebuf过程,将缓冲区C释放。此时,把该缓冲区当前(现行)工作缓冲区C改为空缓冲区R
  • 输入进程:把缓冲区装满时,也应调用Releasebuf过程,将该缓冲区释放,并改为G缓冲区

3,进程之间的同步问题

1Nexti指针追赶上Nextg指针。这意味着输入进程输入数据的速度大于计算进程处理数据的速度,已把全部可用的空缓冲区装满,无缓冲区可用。此时,输入进程应阻塞,直到计算进程把某个缓冲区中的数据全部提取完,使之成为空缓冲区R,并调用Releasebuf过程将它释放时,才将输入进程唤醒。——系统受计算限制

2Nextg指针追赶上Nexti指针。这意味着输入数据的速度低于计算进程处理数据的速度,使全部装有输入数据的缓冲区都被抽空,再无装有数据的缓冲区供计算进程提取数据。这时,计算进程只能阻塞,直至输入进程又装满某个缓冲区,并调用Releasebuf过程将它释放时,才去唤醒计算进程。——系统受I/O限制

7.3,缓冲池

为了提高缓冲区的利用率,目前广泛流行既可用于输入又可用于输出的公用缓冲池,在池中设置了多个可供若干个进程共享的缓冲区。

缓冲池与缓冲区的区别:缓冲区仅仅是一组内存块的链表;缓冲池则是包含了一个管理的数据结构即一组操作函数的管理机制,用于管理多个缓冲区。

1,缓冲池的组成

缓冲池管理着多个缓冲区,每个缓冲区由用于标识和管理的缓冲首部(一般包括缓冲区号、设备号、设备上的数据块号、同步信号量以及队列链接指针等以及用于存放数据的缓冲体两部分组成。

为了管理方便,一般将缓冲池中具有相同类型的缓冲区链接成一个队列,于是可形成下述的三个队列和四个工作区。

三 个  队 列:emq、inq、outq。

  • 空白缓冲队列emq:队首指针F,队尾指针L。
  • 输入队列inq:队首指针F, 队尾指针L。装满输入数据的buffers队列。
  • 输出队列outq:队首指针F,队尾指针L。装满输出数据的buffers队列。

四个工作区:hin、sin、hout、sout。

  • 收容输入工作区hin :用于收容输入数据的工作缓冲区。
  • 提取输入工作区sin : 用于提取输入数据的工作缓冲区。
  • 收容输出工作区hout :用于收容输入数据的工作缓冲区。
  • 提取输出工作区 sout :用于提取输 出数据的工作缓冲区。

普通队列操作:Addbuf( type , i ) : 将缓冲区i挂在type队列的尾部。Takebuf( type ) ; type类队列的队首摘下一个缓冲区。

因为缓冲池中的队列本身是临界资源,多个进程在访问一个队列时,既应互斥又须同步为此,需要对普通队列的操作进行改造,以形成对缓冲池队列操作的GetbufPutbuf过程。为使诸进程能互斥地访问缓冲池对了,可为每一种队列设置一个互斥信号量MS( type )为了保证诸进程同步地使用缓冲区,又为每种缓冲队列设置了一个资源信号量RS( type )

缓冲区可以工作在收容输入提取输入收容输出提取输出四种工作方式。

1收容输入。在输入进程需要输入数据时,便调用Getbuf(emq)过程,从空缓冲队列emq队首摘下一空缓冲区,把它作为收容输入工作缓冲区hin。然后,把数据输入其中装满后调用Putbuf(inq,hin)过程,将该缓冲区挂在输入队列inq队列上

2)提取输入。当计算进程需要输入数据时,调用Getbuf(inq)过程,从输入队列inq的队首取得一缓冲区,作为提取输入工作缓冲区(sin),计算进程从中提取数据。计算进程用完该数据后,再调用Putbuf(emq,sin)过程,将该缓冲区挂到空缓冲区队列emq

3)收容输出。当计算进程需要输出时,调用Getbuf(emq)过程,从空缓冲队列emq的队首取得一空缓冲,作为收容输出工作缓冲区hout。当其中装满输出数据后,又调用Putbuf(outq,hout)过程,将该缓冲区挂在outq末尾

4提取输出。由输出进程调用Getbuf(outq)过程,从输出队列的队首取得一装满输出数据的缓冲区,作为提取输出工作缓冲区sout。在数据提取完后,再调用Putbuf(emq,sout)过程,将该缓冲区挂在空缓冲队列末尾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕双嘤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值