输入输出系统程序员
I/O系统管理的主要对象是I/O设备和相应的设备控制器。其最主要的任务是,完成用户提出的I/O请求,提升I/O速率,以及提升设备的利用率,并能为更高层的进程方便地使用这些设备提供手段。算法
1. 隐藏物理设备的细节编程
I/O设备的类型很是多,且彼此间在多方面都有差别,诸如它们接收和产生数据的速度,传输方向、粒度、数据的表示形式及可靠性等方面。数组
2. 与设备的无关性安全
隐藏物理设备的细节,在早期的OS中就已实现,它可方便用户对设备的使用。与设备的无关性是在较晚时才实现的,这是在隐藏物理设备细节的基础上实现的。网络
3. 提升处理机和I/O设备的利用率数据结构
在通常的系统中,许多I/O设备间是相互独立的,可以并行操做,在处理机与设备之间也能并行操做。所以,I/O系统的第三个功能是要尽量地让处理机和I/O设备并行操做,以提升它们的利用率。为此,一方面要求处理机能快速响应用户的I/O请求,使I/O设备尽快地运行起来;另外一方面也应尽可能减小在每一个I/O设备运行时处理机的干预时间。函数
4. 对I/O设备进行控制布局
对I/O设备进行控制是驱动程序的功能。目前对I/O设备有四种控制方式:① 采用轮询的可编程I/O方式;② 采用中断的可编程I/O方式;③ 直接存储器访问方式;④ I/O通道方式。post
5. 确保对设备的正确共享
从设备的共享属性上,可将系统中的设备分为以下两类:
(1) 独占设备,进程应互斥地访问这类设备,即系统一旦把这类设备分配给了某进程后,便由该进程独占,直至用完释放。典型的独占设备有打印机、磁带机等。系统在对独占设备进行分配时,还应考虑到分配的安全性。
(2) 共享设备,是指在一段时间内容许多个进程同时访问的设备。典型的共享设备是磁盘,当有多个进程需对磁盘执行读、写操做时,能够交叉进行,不会影响到读、写的正确性。
6. 错误处理
大多数的设备都包括了较多的机械和电气部分,运行时容易出现错误和故障。从处理的角度,可将错误分为临时性错误和持久性错误。对于临时性错误,可经过重试操做来纠正,只有在发生了持久性错误时,才须要向上层报告。
1. I/O软件的层次结构
一般把I/O 软件组织成四个层次,如图6-1所示。
图6-1 I/O系统的层次结构
2. I/O系统中各类模块之间的层次视图
为了能更清晰地描述I/O系统中主要模块之间的关系,咱们进一步介绍I/O系统中各类I/O模块之间的层次视图。见图6-2所示。
1) /O系统的上、下接口
(1) /O系统接口。
(2) 软件/硬件(RW/HW)接口。
图6-2 I/O系统中各类模块之间的层次视图
2) /O系统的分层
与前面所述的I/O软件组织的层次结构相对应,I/O系统自己也可分为以下三个层次:
(1) 中断处理程序。
(2) 设备驱动程序。
(3) 设备独立性软件。
在I/O系统与高层之间的接口中,根据设备类型的不一样,又进一步分为若干个接口。在图6-2中示出了块设备接口、流设备接口和网络接口。
1. 块设备接口
(1) 块设备。
(2) 隐藏了磁盘的二维结构。
(3) 将抽象命令映射为低层操做。
2. 流设备接口
流设备接口是流设备管理程序与高层之间的接口。该接口又称为字符设备接口,它反映了大部分字符设备的本质特征,用于控制字符设备的输入或输出。
(1) 字符设备。
(2) get和put操做。
(3) in-control指令。
3. 网络通讯接口
在现代OS中,都提供了面向网络的功能。但首先还须要经过某种方式把计算机链接到网络上。同时操做系统也必须提供相应的网络软件和网络通讯接口,使计算机能经过网络与网络上的其它计算机进行通讯或上网浏览。
I/O设备通常是由执行I/O操做的机械部分和执行控制I/O的电子部件组成。一般将这两部分分开,执行I/O操做的机械部分就是通常的I/O设备,而执行控制I/O的电子部件则称为设备控制器或适配器(adapter)。在微型机和小型机中的控制器常作成印刷电路卡形式,于是也常称为控制卡、接口卡或网卡,可将它插入计算机的扩展槽中。在有的大、中型计算机系统中,还配置了I/O通道或I/O处理机。
1. I/O设备的类型
1) 按使用特性分类
2) 按传输速率分类
2. 设备与控制器之间的接口
一般,设备并非直接与CPU进行通讯,而是与设备控制器通讯,所以,在I/O设备中应含有与设备控制器间的接口,在该接口中有三种类型的信号(见图6-3所示),各对应一条信号线。
(1) 数据信号线。
(2) 控制信号线。
(3) 状态信号线。
图6-3 设备与控制器间的接口
1. 设备控制器的基本功能
(1) 接收和识别命令。
(2) 数据交换。
(3) 标识和报告设备的状态。
(4) 地址识别。
(5) 数据缓冲区。
(6) 差错控制。
2. 设备控制器的组成
因为设备控制器位于CPU与设备之间,它既要与CPU通讯,又要与设备通讯,还应具备按照CPU所发来的命令去控制设备工做的功能,所以,现有的大多数控制器都是由如下三部分组成:
(1) 设备控制器与处理机的接口。
(2) 设备控制器与设备的接口。
(3) /O逻辑。
图6-4 设备控制器的组成
1. 利用特定的I/O指令
在早期的计算机中,包括大型计算机,为实现CPU和设备控制器之间的通讯,为每一个控制寄存器分配一个I/O端口,这是一个8位或16位的整数,如图6-5(a)所示。另外还设置了一些特定的I/O指令。
2. 内存映像I/O
在这种方式中,在编址上再也不区份内存单元地址和设备控制器中的寄存器地址,都采用k。当k值处于0~n-1范围时,被认为是内存地址,若k大于等于n时,被认为是某个控制器的寄存器地址。
图6-5 设备寻址形式
1. I/O通道设备的引入
虽然在CPU与I/O设备之间增长了设备控制器后,已能大大减小CPU对I/O的干预,但当主机所配置的外设不少时,CPU的负担仍然很重。为此,在CPU和设备控制器之间又增设了I/O通道(I/O Channel)。
2. 通道类型
1) 字节多路通道(Byte Multiplexor Channel)
这是一种按字节交叉方式工做的通道。它一般都含有许多非分配型子通道,其数量可从几十到数百个,每个子通道链接一台I/O设备,并控制该设备的I/O操做。这些子通道按时间片轮转方式共享主通道。
图6-6 字节多路通道的工做原理
2) 数组选择通道(Block Selector Channel)
字节多路通道不适于链接高速设备,这推进了按数组方式进行数据传送的数组选择通道的造成。
3) 数组多路通道(Block Multiplexor Channel)
数组选择通道虽有很高的传输速率,但它却每次只容许一个设备传输数据。数组多路通道是将数组选择通道传输速率高和字节多路通道能使各子通道(设备)分时并行操做的优势相结合而造成的一种新通道。
3. “瓶颈”问题
因为通道价格昂贵,导致机器中所设置的通道数量势必较少,这每每又使它成了I/O的瓶颈,进而形成整个系统吞吐量的降低。
图6-7 单通路I/O系统
图6-8 多通路I/O系统
对于操做系统中的I/O系统,本章采起从低层向高层的介绍方法,从本节开始首先介绍中断处理程序。中断在操做系统中有着特殊重要的地位,它是多道程序得以实现的基础,没有中断,就不可能实现多道程序,由于进程之间的切换是经过中断来完成的。另外一方面,中断也是设备管理的基础,为了提升处理机的利用率和实现CPU与I/O设备并行执行,也必需有中断的支持。中断处理程序是I/O系统中最低的一层,它是整个I/O系统的基础。
1. 中断和陷入
1) 中断
2) 陷入
2. 中断向量表和中断优先级
1) 中断向量表
2) 中断优先级
3. 对多中断源的处理方式
1) 屏蔽(禁止)中断
2) 嵌套中断
图6-9 对多中断的处理方式
当一个进程请求I/O 操做时,该进程将被挂起,直到I/O设备完成I/O操做后,设备控制器便向CPU发送一个中断请求,CPU响应后便转向中断处理程序,中断处理程序执行相应的处理,处理完后解除相应进程的阻塞状态。
图6-10 中断现场保护示意图
图6-11 中断处理流程
设备处理程序一般又称为设备驱动程序,它是I/O系统的高层与设备控制器之间的通讯程序,其主要任务是接收上层软件发来的抽象I/O要求,如read或write命令,再把它转换为具体要求后,发送给设备控制器,启动设备去执行;反之,它也将由设备控制器发来的信号传送给上层软件。因为驱动程序与硬件密切相关,故一般应为每一类设备配置一种驱动程序。例如,打印机和显示器须要不一样的驱动程序。
1. 设备驱动程序的功能
(1) 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操做序列。
(2) 检查用户I/O请求的合法性,了解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) 因为驱动程序与硬件紧密相关,于是其中的一部分必须用汇编语言书写。目前有不少驱动程序的基本部分已经固化在ROM中。
(5) 驱动程序应容许可重入。一个正在运行的驱动程序常会在一次调用完成前被再次调用。
3. 设备处理方式
在不一样的操做系统中,所采用的设备处理方式并不彻底相同。
设备驱动程序的主要任务是启动指定设备,完成上层指定的I/O工做。但在启动以前,应先完成必要的准备工做,如检测设备状态是否为“忙”等。在完成全部的准备工做后,才向设备控制器发送一条启动命令。
图6-12 状态寄存器中的格式
对设备的控制,早期是使用轮询的可编程I/O方式,后来发展为使用中断的可编程I/O方式。
1. 使用轮询的可编程I/O方式
处理机对I/O设备的控制采起轮询的可编程I/O方式,即在处理机向控制器发出一条I/O指令,启动输入设备输入数据时,要同时把状态寄存器中的忙/闲标志busy置为1,而后便不断地循环测试busy(称为轮询)。当busy=1时,表示输入机还没有输完一个字(符),处理机应继续对该标志进行测试,直至busy=0,代表输入机已将输入数据送入控制器的数据寄存器中。因而处理机将数据寄存器中的数据取出,送入内存指定单元中,这样便完成了一个字(符)的I/O。接着再去启动读下一个数据,并置busy=1。
图6-13 程序I/O和中断驱动方式的流程
2. 使用中断的可编程I/O方式
当前,对I/O设备的控制,普遍采用中断的可编程I/O方式,即当某进程要启动某个I/O设备工做时,便由CPU向相应的设备控制器发出一条I/O命令,而后当即返回继续执行原来的任务。设备控制器因而按照该命令的要求去控制指定I/O设备。此时,CPU与I/O设备并行操做。
3. 直接存储器访问方式
1) 接存储器访问方式的引入
虽然中断驱动I/O比程序I/O方式更有效,但它还是以字(节)为单位进行I/O的。每当完成一个字(节)的I/O时,控制器便要向CPU请求一次中断。
该方式的特色是:
(1) 数据传输的基本单位是数据块,即在CPU与I/O设备之间,每次传送至少一个数据块。
(2) 所传送的数据是从设备直接送入内存的,或者相反。
(3) 仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在控制器的控制下完成的。可见,DMA方式较之中断驱动方式又进一步提升了CPU与I/O设备的并行操做程度。
2) MA控制器的组成
DMA控制器由三部分组成:主机与DMA控制器的接口;DMA控制器与块设备的接口;I/O控制逻辑。图6-14示出了DMA控制器的组成。这里主要介绍主机与控制器之间的接口。
图6-14 DMA控制器的组成
3) MA工做过程
当CPU要从磁盘读入一数据块时,便向磁盘控制器发送一条读命令。该命令被送入命令寄存器CR中。同时,须要将本次要读入数据在内存的起始目标地址送入内存地址寄存器MAR中。
图6-15 DMA方式的工做流程图
4. I/O通道控制方式
1) /O通道控制方式的引入
虽然DMA方式比起中断方式来已经显著地减小了CPU的干预,即已由以字(节)为单位的干预减小到以数据块为单位的干预,但CPU每发出一条I/O指令,也只能去读(或写)一个连续的数据块。而当咱们须要一次去读多个数据块且将它们分别传送到不一样的内存区域,或者相反时,则须由CPU分别发出多条I/O指令及进行屡次中断处理才能完成。
2) 通道程序
通道是经过执行通道程序并与设备控制器共同实现对I/O设备的控制的。通道程序是由一系列通道指令(或称为通道命令)所构成的。
下面示出了一个由六条通道指令所构成的简单的通道程序。该程序的功能是将内存中不一样地址的数据写成多个记录。
为了方便用户和提升OS的可适应性与可扩展性,在现代OS的I/O系统中,都无一例外地增长了与设备无关的I/O软件,以实现设备独立性,也称为设备无关性。其基本含义是:应用程序中所用的设备,不局限于使用某个具体的物理设备。为每一个设备所配置的设备驱动程序是与硬件紧密相关的软件。
1. 以物理设备名使用设备
在早期OS中,应用程序在使用I/O设备时,都使用设备的物理名称,这使应用程序与系统中的物理设备直接相关。
2. 引入了逻辑设备名
为了实现与设备的无关性而引入了逻辑设备和物理设备两个概念。逻辑设备是抽象的设备名。
3. 逻辑设备名称到物理设备名称的转换
在应用程序中,用逻辑设备名称使用设备虽然方便了用户,但系统却只识别物理设备名称,所以在实际执行时,还必须使用物理名称。为此,在系统中,必须具备将逻辑设备名称转换为某物理设备名称的功能。
1. 设备驱动程序的统一接口
为了使全部的设备驱动程序有着统一的接口,一方面,要求每一个设备驱动程序与OS之间都有着相同的接口,或者相近的接口,这样会使添加一个新的设备驱动程序变得很容易,同时在很大程度上方便了开发人员对设备驱动程序的编制。另外一方面,要将抽象的设备名映射到适当的驱动程序上,或者说,将抽象的设备名转换为具体的物理设备名,并进一步能够找到相应物理设备的驱动程序入口。此外,还应对设备进行保护,禁止用户直接访问设备,以防止无权访问的用户使用。
2. 缓冲管理
不管是字符设备仍是块设备,它们的运行速度都远低于CPU的速度。为了缓和CPU和I/O设备之间的矛盾、提升CPU的利用率,在现代OS中都无一例外地分别为字符设备和块设备配置了相应的缓冲区。缓冲区有着多种形式,如单缓冲区、双缓冲区、循环缓冲区、公用缓冲池等,以知足不一样状况的须要。
3. 差错控制
因为设备中有着许多的机械和电气部分,所以,它们比主机更容易出现故障,这就致使I/O操做中的绝大多数错误都与设备有关。错误可分为以下两类:
(1) 暂时性错误。
(2) 持久性错误。
4. 对独立设备的分配与回收
在系统中有两类设备:独占设备和共享设备。对于独占设备,为了不诸进程对独占设备的争夺,必须由系统来统一分配,不容许进程自行使用。每当进程须要使用某(独占)设备时,必须先提出申请。OS接到对设备的请求后,先对进程所请求的独占设备进行检查,看该设备是否空闲。若空闲,才把该设备分配给请求进程。不然,进程将被阻塞,放入该设备的请求队列中等待。等到其它进程释放该设备时,再将队列中的第一个进程唤醒,该进程获得设备后继续运行。
5. 独立于设备的逻辑数据块
不一样类型的设备,其数据交换单位是不一样的,读取和传输速率也各不相同,如字符型设备以单个字符(字)为单位,块设备是以一个数据块为单位。即便同一类型的设备,其数据交换单位的大小也是有差别的,如不一样磁盘因为扇区大小的不一样,可能形成数据块大小的不一致。设备独立性软件应可以隐藏这些差别而被逻辑设备使用,并向高层软件提供大小统一的逻辑数据块。与设备无关软件的功能如图6-16所示。
图6-16 与设备无关软件的功能层次
系统为实现对独占设备的分配,必须在系统中配置相应的数据结构。
1. 设备分配中的数据结构
在用于设备分配的数据结构中,记录了对设备或控制器进行控制所需的信息。在进行设备分配时须要以下的数据结构。
1) 设备控制表DCT
系统为每个设备都配置了一张设备控制表,用于记录设备的状况,如图6-17所示。
图6-17 设备控制表
2) 控制器控制表、通道控制表和系统设备表
(1) 控制器控制表(COCT)。系统为每个控制器都设置了用于记录控制器状况的控制器控制表,如图6-18(a)所示。 (2) 通道控制表(CHCT)。每一个通道都有一张通道控制表,如图6-18(b)所示。
(3) 系统设备表(SDT)。这是系统范围的数据结构,记录了系统中所有设备的状况,每一个设备占一个表目,其中包括有设备类型、设备标识符、设备控制表及设备驱动程序的入口等项,如图6-18(c)所示。
图6-18 COCT、CHCT和SDT表
2. 设备分配时应考虑的因素
系统在分配设备时,应考虑以下几个因素:
1) 设备的固有属性
设备的固有属性可分红三种,对它们应采起不一样的分配策略:
(1) 独占设备的分配策略。
(2) 共享设备的分配策略。
(3) 虚拟设备的分配策略,虚拟设备属于可共享的设备,能够将它同时分配给多个进程使用。
2) 设备分配算法
对设备分配的算法,一般只采用如下两种分配算法:
(1) 先来先服务。
(2) 优先级高者优先。
3) 设备分配中的安全性
从进程运行的安全性上考虑,设备分配有如下两种方式:
(1) 安全分配方式。
(2) 不安全分配方式。
3. 独占设备的分配程序
1) 基本的设备分配程序
咱们经过一个例子来介绍设备分配过程。当某进程提出I/O请求后,系统的设备分配程序可按下述步骤进行设备分配:
(1) 分配设备。
(2) 分配控制器。
(3) 分配通道。
2) 设备分配程序的改进
在上面的例子中,进程是以物理设备名提出I/O请求的。若是所指定的设备已分配给其它进程,则分配失败。或者说上面的设备分配程序不具备与设备无关性。为得到设备的独立性,进程应使用逻辑设备名请求I/O。
1. 逻辑设备表LUT(Logical Unit Table)
在逻辑设备表的每一个表目中包含了三项:逻辑设备名、物理设备名和设备驱动程序的入口地址,如图6-19(a)所示。
图6-19 逻辑设备表
2. 逻辑设备表的设置问题
在系统中可采起两种方式设置逻辑设备表:
第一种方式,是在整个系统中只设置一张LUT。
第二种方式,是为每一个用户设置一张LUT。
1. 系统调用
一方面,为使诸进程能有条不紊地使用I/O设备,且能保护设备的安全性,不容许运行在用户态的应用进程去直接调用运行在核心态(系统态)的OS过程。但另外一方面,应用进程在运行时,又必须取得OS所提供的服务,不然,应用程序几乎没法运行。为了解决此矛盾,OS在用户层中引入了一个中介过程——系统调用,应用程序能够经过它间接调用OS中的I/O过程,对I/O设备进行操做。
图6-20 系统调用的执行过程
2. 库函数
在C语言以及UNIX系统中,系统调用(如read)与各系统调用所使用的库函数(如read)之间几乎是一一对应的。而微软定义了一套过程,称为Win32 API的应用程序接口(Application Program Interface),程序员利用它们取得OS服务,该接口与实际的系统调用并不一一对应。用户程序经过调用对应的库函数使用系统调用,这些库函数与调用程序链接在一块儿,被嵌入在运行时装入内存的二进制程序中。
1. 假脱机技术
在20世纪50年代,为了缓和CPU的高速性与I/O设备低速性间的矛盾,而引入了脱机输入、脱机输出技术。该技术是利用专门的外围控制机,先将低速I/O设备上的数据传送到高速磁盘上,或者相反。这样当处理机须要输入数据时,即可以直接从磁盘中读取数据,极大地提升了输入速度。反之,在处理机须要输出数据时,也能够很快的速度把数据先输出到磁盘上,处理机即可去作本身的事情。
2. SPOOLing的组成
如前所述,SPOOLing技术是对脱机输入/输出系统的模拟,相应地,如图6-21(a)所示,SPOOLing系统创建在通道技术和多道程序技术的基础上,以高速随机外存(一般为磁盘)为后援存储器。SPOOLing的工做原理如图6-21(b)所示。
图6-21 SPOOLing系统组成及工做原理
SPOOLing系统主要由如下四部分构成:
(1) 输入井和输出井。
(2) 输入缓冲区和输出缓冲区。
(3) 输入进程和输出进程。
(4) 井管理程序。
3. SPOOLing系统的特色
(1) 提升了I/O的速度。
(2) 将独占设备改造为共享设备。
(3) 实现了虚拟设备功能。
4. 假脱机打印机系统
打印机是常常用到的输出设备,属于独占设备。利用假脱机技术可将它改造为一台可供多个用户共享的打印设备,从而提升设备的利用率,也方便了用户。共享打印机技术已被普遍地用于多用户系统和局域网络中。假脱机打印系统主要有如下三部分:
(1) 磁盘缓冲区。
(2) 打印缓冲区。
(3) 假脱机管理进程和假脱机打印进程。
5. 守护进程(daemon)
前面是利用假脱机系统来实现打印机共享的一种方案,人们对该方案进行了某些修改,如取消该方案中的假脱机管理进程,为打印机创建一个守护进程,由它执行一部分原来由假脱机管理进程实现的功能,如为用户在磁盘缓冲区中申请一个空闲盘块,并将要打印的数据送入其中,将该盘块的首址返回给请求进程。另外一部分由请求进程本身完成,每一个要求打印的进程首先生成一份要求打印的文件,其中包含对打印的要求和指向装有打印输出数据盘块的指针等信息,而后将用户请求打印文件放入假脱机文件队列(目录)中。
在现代操做系统中,几乎全部的I/O设备在与处理机交换数据时都用了缓冲区。缓冲区是一个存储区域,它能够由专门的硬件寄存器组成,但因为硬件的成本较高,容量也较小,通常仅用在对速度要求很是高的场合,如存储器管理中所用的联想存储器;设备控制器中用的数据缓冲区等。
引入缓冲区的缘由有不少,可归结为如下几点:
(1) 缓和CPU与I/O设备间速度不匹配的矛盾。
(2) 减小对CPU的中断频率,放宽对CPU中断响应时间的限制。
(3) 解决数据粒度不匹配的问题。
(4) 提升CPU和I/O设备之间的并行性。
图6-22 利用缓冲寄存器实现缓冲
1. 单缓冲区(Single Buffer)
在单缓冲状况下,每当用户进程发出一I/O请求时,操做系统便在主存中为之分配一缓冲区,如图6-23所示。
图6-23 单缓冲工做示意图
2. 双缓冲区(Double Buffer)
因为缓冲区是共享资源,生产者与消费者在使用缓冲区时必须互斥。若是消费者还没有取走缓冲区中的数据,即便生产者又生产出新的数据,也没法将它送入缓冲区,生产者等待。若是为生产者与消费者设置了两个缓冲区,便能解决这一问题。
图6-24 双缓冲工做示意图
若是在实现两台机器之间的通讯时仅为它们配置了单缓冲,如图6-25(a)所示,那么,它们之间在任一时刻都只能实现单方向的数据传输。例如,只容许把数据从A传送到B,或者从B传送到A,而毫不容许双方同时向对方发送数据。为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用做发送缓冲区,另外一个用做接收缓冲区,如图6-25(b)所示。
图6-25 双机通讯时缓冲区的设置
1. 环形缓冲区的组成
(1) 多个缓冲区。在环形缓冲中包括多个缓冲区,其每一个缓冲区的大小相同。做为输入的多缓冲区可分为三种类型:用于装输入数据的空缓冲区R、已装满数据的缓冲区G以及计算进程正在使用的现行工做缓冲区C,如图6-26所示。
图6-26 环形缓冲区
2. 环形缓冲区的使用
计算进程和输入进程可利用下述两个过程来使用形环缓冲区。
(1) Getbuf过程。
(2) Releasebuf过程。
3. 进程之间的同步问题
使用输入循环缓冲,可以使输入进程和计算进程并行执行。相应地,指针Nexti和指针Nextg将不断地沿着顺时针方向移动,这样就可能出现下述两种状况:
(1) Nexti指针追遇上Nextg指针。
(2) Nextg指针追遇上Nexti指针。
1. 缓冲池的组成
缓冲池管理着多个缓冲区,每一个缓冲区由用于标识和管理的缓冲首部以及用于存放数据的缓冲体两部分组成。缓冲首部通常包括缓冲区号、设备号、设备上的数据块号、同步信号量以及队列连接指针等。为了管理上的方便,通常将缓冲池中具备相同类型的缓冲区连接成一个队列,因而可造成如下三个队列:
(1) 空白缓冲队列emq。
(2) 输入队列inq。
(3) 输出队列outq。
2. Getbuf过程和Putbuf过程
在数据结构课程中,曾介绍过队列和对队列进行操做的两个过程,第一个是 Addbuf(type,number)过程。该过程用于将由参数number所指示的缓冲区B挂在type队列上。第二个是Takebuf(type)过程。它用于从type所指示的队列的队首摘下一个缓冲区。
3. 缓冲区的工做方式
缓冲区能够工做在以下四种工做方式,如图6-27所示。
图6-27 缓冲区的工做方式
磁盘设备是一种至关复杂的机电设备,在此仅对磁盘的某些性能,如数据的组织、磁盘的类型和访问时间等方面作扼要的阐述。
1. 数据的组织和格式
磁盘设备可包括一个或多个物理盘片,每一个磁盘片分一个或两个存储面(Surface)(见图6-28(a)),每一个盘面上有若干个磁道(Track),磁道之间留有必要的间隙(Gap)。为使处理简单起见,在每条磁道上可存储相同数目的二进制位。
图6-28 磁盘的结构和布局
图6-29 磁盘的格式化
2. 磁盘的类型
对于磁盘,能够从不一样的角度进行分类。最多见的有:将磁盘分红硬盘和软盘、单片盘和多片盘、固定头磁盘和活动头(移动头)磁盘等。下面仅对固定头磁盘和移动头磁盘作些介绍。
(1) 固定头磁盘。
(2) 移动头磁盘。
3. 磁盘访问时间
磁盘设备在工做时以恒定速率旋转。为了读或写,磁头必须能移动到所指定的磁道上,并等待所指定的扇区的开始位置旋转到磁头下,而后再开始读或写数据。
1. 先来先服务(FCFS)
这是最简单的磁盘调度算法。它根据进程请求访问磁盘的前后次序进行调度。
2. 最短寻道时间优先(SSTF)
该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种算法不能保证平均寻道时间最短。
图6-30 FCFS调度算法
图6-31 SSTF调度算法
1. 扫描(SCAN)算法
SSTF算法的实质是基于优先级的调度算法,所以就可能致使优先级低的进程发生“饥饿”(Starvation)现象。由于只要不断有新进程的请求到达,且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的I/O请求必然优先知足。在对SSTF算法略加修改后,则可防止低优先级进程出现“饥饿”现象。
2. 循环扫描(CSCAN)算法
SCAN算法既能得到较好的寻道性能,又能防止“饥饿”现象,故被普遍用于大、中、小型机器和网络中的磁盘调度。但也存在这样的问题:当磁头刚从里向外移动而越过了某一磁道时,刚好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,而后再从外向里扫描完处于外面的全部要访问的磁道后,才处理该进程的请求,导致该进程的请求被大大地推迟。
图6-32 SCAN调度算法示例
图6-33 CSCAN调度算法示例
3. NStepSCAN和FSCAN调度算法
1) StepSCAN算法
在SSTF、SCAN及CSCAN几种调度算法中,均可能出现磁臂停留在某处不动的状况,例如,有一个或几个进程对某一磁道有较高的访问频率,即这个(些)进程反复请求对某一磁道的I/O操做,从而垄断了整个磁盘设备。咱们把这一现象称为“磁臂粘着”(Armstickiness)。在高密度磁盘上容易出现此状况。
2) SCAN算法
FSCAN算法实质上是N步SCAN算法的简化,即FSCAN只将磁盘请求队列分红两个子队列。一个是由当前全部请求磁盘I/O的进程造成的队列,由磁盘调度按SCAN算法进行处理。另外一个是在扫描期间,将新出现的全部请求磁盘I/O的进程放入等待处理的请求队列。这样,全部的新请求都将被推迟到下一次扫描时处理。
习 题 8:
1. 试说明I/O系统的基本功能。
2. 简要说明I/O软件的四个层次的基本功能。
3. /O系统接口与软件/硬件(RW/HW)接口分别是什么接口?
4. 与设备无关性的基本含义是什么? 为何要设置该层?
5. 试说明设备控制器的组成。
6. 为了实现CPU与设备控制器间的通讯,设备控制器应具有哪些功能?
7. 什么是内存映像I/O? 它是如何实现的?
8. 为何说中断是OS赖以生存的基础?
9. 对多中断源的两种处理方式分别用于何种场合?
10. 设备中断处理程序一般需完成哪些工做?
11. 简要说明中断处理程序对中断进行处理的几个步骤。
12. 试说明设备驱动程序具备哪些特色。
13. 设备驱动程序一般要完成哪些工做?
14. 简要说明设备驱动程序的处理过程可分为哪几步。
15. 试说明推进I/O控制发展的主要因素是什么。
16. 有哪几种I/O控制方式? 各适用于何种场合?
17. 试说明DMA的工做流程。
18. 为什么要引入与设备的无关性? 如何实现设备的独立性?
19. 与设备的无关的软件中,包括了哪些公有操做的软件?
20. 在考虑到设备的独立性时,应如何分配独占设备?
21. 何谓设备虚拟? 实现设备虚拟时所依赖的关键技术是什么?
22. 在实现后台打印时,SPOOLing系统应为请求I/O的进程提供哪些服务?
23. 假脱机系统向用户提供共享打印机的基本思想是什么?
24. 引入缓冲的主要缘由是什么?
25. 在单缓冲状况下,为何系统对一块数据的处理时间为max(C, T) ?
26. 为何在双缓冲状况下,系统对一块数据的处理时间为max(T, C)?
27. 试绘图说明把多缓冲用于输出时的状况。
28. 试说明收容输入工做缓冲区和提取输出工做缓冲区的工做状况。
29. 何谓安全分配方式和不安全分配方式?
30. 磁盘访问时间由哪几部分组成? 每部分时间应如何计算?
31. 目前经常使用的磁盘调度算法有哪几种? 每种算法优先考虑的问题是什么?