第六章 输入输出系统 ( IO系统 )

这章的重点内容是外设管理
这章比较简单,重点是思想与原理


文章目录


在这里插入图片描述


6.1 I/O系统的功能、模型和接口

I/O系统管理的主要对象是I/O设备和相应的设备控制器。其最主要的任务是,完成用户提出的I/O请求,提高I/O速率,以及提高设备的利用率,并能为更高层的进程方便地使用这些设备提供手段。

设备驱动程序帮助计算机管理外设
设备驱动程序大部分已经集成到操作系统中

# 6.1.1 I/O系统的基本功能

# 1. 隐藏物理设备的细节
I/O设备的类型非常多,且彼此间在多方面都有差异,
诸如它们接收和产生数据的速度,传输方向、粒度、数据的表示	形式及可靠性等方面。
# 2. 与设备的无关性
用户不仅可使用抽象的I/O命令使用设备,还可以使用逻辑设备名使用。
# 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通道方式。
# 5. 确保对设备的正确共享

从设备的共享属性上,可将系统中的设备分为如下两类:

(1) 独占设备

进程应互斥地访问这类设备,
即系统一旦把这类设备分配给了某进程后,便由该进程独占,直至用完释放。
典型的独占设备有打印机、磁带机等。
系统在对独占设备进行分配时,还应考虑到分配的安全性。

(2) 共享设备

是指在一段时间内允许多个进程同时访问的设备。
典型的共享设备是磁盘,当有多个进程需对磁盘执行读、写操作时,
可以交叉进行,不会影响到读、写的正确性。
# 6. 错误处理
大多数的设备都包括了较多的机械和电气部分,运行时容易出现错误和故障。
从处理的角度,可将错误分为临时性错误和持久性错误。
	对于临时性错误,可通过重试操作来纠正,
	只有在发生了持久性错误时,才需要向上层报告。

# 6.1.2 I/O系统的层次结构模型

# 1. I/O软件的层次结构 ( 通常四个层次 )

在这里插入图片描述

# 2. I/O系统中各种模块之间的层次视图

在这里插入图片描述

为了能更清晰地描述I/O系统中主要模块之间的关系,我们进一步介绍I/O系统中各种I/O模块之间的层次视图。

(1)  I/O系统的上、下接口
(2)  I/O系统接口。
(3)  软件/硬件(RW/HW)接口。个层次

# 6.1.3 I/O系统的接口

在I/O系统与高层之间的接口中,根据设备类型的不同,又进一步分为若干个接口:块设备接口、流设备接口和网络接口。

# 1. 块设备接口 ( 输入输出单位是一块 )
(1) 块设备。
(2) 隐藏了磁盘的二维结构。
(3) 将抽象命令映射为低层操作
# 2. 流设备接口 ( 输入输出单位是字节 )

流设备接口是流设备管理程序与高层之间的接口。该接口又称为字符设备接口,它反映了大部分字符设备的本质特征,用于控制字符设备的输入或输出。

(1) 字符设备。
(2) get和put操作。
(3) in-control指令。  管理控制指令
# 3. 网络通信接口

在现代OS中,都提供了面向网络的功能。但首先还需要通过某种方式把计算机连接到网络上。同时操作系统也必须提供相应的网络软件和网络通信接口,使计算机能通过网络与网络上的其它计算机进行通信或上网浏览。




6.2 I/O设备和设备控制器

# 6.2.1 I/O设备

# 6.2.1.1 I/O设备的类型

I/O设备的类型繁多,从OS观点看,其重要的性能指标有:数据传输速率、数据的传输单位、设备共享属性等。因而从以下不同角度进行分类。

# 按传输速率分类
➢ 低速设备:传输速率仅为每秒钟几个字节至数百个字节的一类设备。
		如键盘、鼠标、语音输入和输出设备等。
		
➢ 中速设备:传输速率为每秒钟数千个字节至数万个字节的一类设备。
		如行式打印机、激光打印机等。
		
➢ 高速设备:传输速率为每秒钟数百千个字节至数十兆字节的一类设备。
		如磁带机、磁盘机、光盘机等。
# 按信息交换的单位分类
➢ 块设备:
	用于存储信息。对于信息的存取总是以数据块为单位。
		典型例子是磁盘。
		该类设备基本特征是传速率较高,另一特征是可寻址。
	工作方式常采用DMA方式。

➢ 字符设备:
	用于数据的输入和输出。基本单位是字符。
		如交互式终端、打印机等。其基本特征是传输速率较,
		另一特征是不可寻址。
	工作方式常采用中断方式
# 按设备的共享属性分类
➢ 独占设备:指在一段时间内只允许一个用户(进程访问的设备,
	即临界资源。应互斥的访问之。
	
➢ 共享设备:指在一段时间内允许多个进程同时访问的设备。
	对每一时刻而言仍然是一个进程访问。如磁盘。

➢ 虚拟设备:指通过虚拟技术将一台独占设备变换为若干台逻辑设备,
	供若干个用户(进程)同时使用。
# 6.2.1.2 设备与控制器之间的接口

通常设备并不是直接与CPU进行通信,而是与设备控制器通信,因此,在设备与设备控制器之间有一接口,在该接口中有三种类型的信号,各对应一条信号线。

◼ 数据信号线
◼ 控制信号线
◼ 状态信号线

在这里插入图片描述

# 6.2.2 设备控制器

◼ 设备控制器是计算机中的一个实体,其主要职责是控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换。他是CPU与I/O设备之间的接口,他接收从CPU发来的命令,并去控制I/O设备工作,以使处理机脱离繁杂的设备控制事务。

◼ 设备控制器是一个可编址的设备,可控制多个设备并为它们编址。设备控制器可分为控制块设备的控制器和控制字符设备的控制器两类。
在这里插入图片描述

# 6.2.3 内存映像I/O

# 1. 利用特定的I/O指令

在早期的计算机中,包括大型计算机,为实现CPU和设备控制器之间的通信,为每个控制寄存器分配一个I/O端口,是一个8位或16位的整数。另外还设置了一些特定的I/O指令。

在这里插入图片描述

# 2. 内存映像I/O

在这种方式中,在编址上不再区分内存单元地址和设备控制器中的寄存器地址,都采用k。当k值处于0~n-1范围时,被认为是内存地址,若k大于等于n时,被认为是某个控制器的寄存器地址。

# 6.2.4 通道

# ◼ I/O通道设备的引入

尽管有了设备控制器,已能大大减少CPU对I/O的干预,但当主机的外设很多时,CPU的负担仍然很重。为此又在CPU和设备控制器之间增设了通道。其主要目的是为了建立独立的I/O操作,去解放CPU。
在设置通道后,CPU只需向通道发送一条I/O指令。通道完成任务后向CPU发中断信号。指令由通道去解释执行

I/O通道是一种特殊的处理机。与一般处理机不同于两方面:

	专用处理机,只用于输入输出。
	
➢ 指令类型单一,只用于I/O操作;
➢ 通道没有内存,它与CPU共享内存。
# ◼ 通道类型

由于外围设备的种类较多,且其传输速率相差很大,所以通道也具有多种类型。根据信息交换方式,通道分为三种类型:

➢ 字节多路通道
➢ 数组选择通道
➢ 数组多路通道

在这里插入图片描述
在这里插入图片描述

选择多路通道是独占设备
其余两个都是分时设备
# ➢ 字节多路通道(Byte Multiplexor Channel)

在这种通道中,通常都含有较多个(8,16,32)非分配型子通道,每一个子通道连接一台I/O设备。这些子通道按时间片轮转方式共享主通道。一个子通道完成一个字节的传送后,立即让出字节多路通道(主通道),给另一个子通道使用。它适用于连接低速或中速设备,如打印机、终端等。

# ➢ 数组选择通道(Block Selector Channel)

这种通道虽然可以连接多台I/O设备,但是它只有一个分配型子通道,在一段时间内只能执行一道通道程序、控制一台设备进行数据传送,其数据传送是按数组方式进行。即当某台设备一旦占用了该通道,就被它独占,直至该设备传送完毕释放该通道为止。可见,它适于连接高速设备(如磁盘机、磁带
机),但是这种通道的利用率较低。

# ➢ 数组多路通道(Block Multiplexor Channel)

数组选择通道虽然有很高的传输速率,但它每次只允许一个设备传输数据。数组多路通道是将数组选择通道的传输速率高和字节多路通道的分时并行操作的优点结合起来,形成的一种新的通道。它含有多个非分配型子通道,可以连接多台高、中速的外围设备,其数据传送却是按数组方式进行。所以这种通道既具有很高的数据传输速率,又能获得令人满意的通道利用率。

# “瓶颈”问题

由于通道价格昂贵,致使数量较少,使它成为I/O系统的瓶颈,进而造成系统吞吐量的下降。如下例所示:
在这里插入图片描述
解决“瓶颈”问题最有效的办法便是增加设备到主机间的通路而不增加通道,如下图所示。
在这里插入图片描述




6.3 中断机构和中断处理程序

# 6.3.1 中断简介

# 1. 中断和陷入

◼ 中断:

CPU对CPU 外部 发来的中断信号的一种响应。
如I/O设备发来的中断。

◼ 陷入:

CPU 内部 事件引起的中断。
如运算中的溢出、地址越界。
# 2. 中断向量表和中断优先级

cpu接到指令后立即响应中断,由地址执行不同的功能(服务程序)。

在这里插入图片描述

# 6.3.2 中断处理程序

# 1. 中断处理程序

当一个进程请求I/O 操作时,该进程将被挂起(阻塞)。当I/O设备完成I/O操作后,设备控制器便向CPU发送一个中断请求。CPU响应中断请求,转向中断处理程序。中断处理程序执行相应的处理,处理完后解除相应进程的挂起(阻塞)。

挂起  发请求  处理中断  解除挂起
# 2. 中断处理流程

在这里插入图片描述

在设备控制器控制下,I/O设备完成了I/O操作后,控制器(或通道)便向CPU发出一中断请求,CPU响应后便转向中断处理程序,中断处理程序大致包含以下几步:

1. ◼ 在设置I/O进程时,当中断处理程序开始执行时,都必须去唤醒阻塞的驱动(程序)进程。在采用信号量机制时,可通过执行V操作,将处于阻塞状态的驱动(程序)进程唤醒。
2. ◼ 保护被中断进程的CPU现场。
3. ◼ 分析中断原因,转入相应的设备中断处理程序。
4. ◼ 进程中断处理,判别此次I/O完成是正常结束中断还是异常结束中断,分别作相应处理。
5. ◼ 恢复被中断进程或由调度程序选中的进程的CPU的现场
6. ◼ 返回被中断的进程,或进入新选中的进程继续运行。



6.4 设备驱动程序

在这里插入图片描述

# 6.4.1 设备驱动程序概述

# 1. 设备驱动程序的功能
◼ 接收上层软件发来的抽象要求(如read命令等),再把它转换成具体要求。
◼ 检查用户I/O请求的合法性,了解I/O设备的状态,设置工作方式。
◼ 由驱动程序向设备控制器发出I/O命令,启动分配到的I/O设备,完成指定的I/O操作。
◼ 及时响应由控制器或通道发来的中断请求,并根据其中断调用相应的中断处理程序进行处理。
◼ 对于设置有通道的计算机系统,驱动程序还应能够根据用户的I/O请求,自动地构成通道程序。
# 2. 设备驱动程序的特点
与一般的应用程序及系统程序有明显的差异:

◼ 是一个请求I/O进程与设备控制器之间的一个通信程序
◼ 驱动程序与I/O设备的特性紧密相关
◼ 驱动程序与I/O控制方式紧密相关
◼ 驱动程序与硬件紧密相关
◼ 驱动程序应允许重入
# 3. 设备处理方式 ( 三种都有用 )

根据在设备处理时是否设置进程,以及设置什么样的进程,设备处理方式可分为以下三类:

1. ◼ 为每一类设备设置一个I/O进程
它专门执行这类设备的I/O操作。比如为所有的交互终端设置一个交互式终端进程。
( 块设备/字符设备 )

2. ◼ 整个系统中设置一个I/O进程
全面负责系统的数据传送工作,I/O请求处理模块,设备分配模块以及缓冲器管理模块和中断原因分析、中断处理模块和后述的设备驱动模块都是I/O进程的一部分。由于现代计算机系统设备十分复杂,I/O负担很重,因此,又可把I/O进程分为输入进程和输出进程。

3. ◼ 不设置专门的设备处理进程
只为各类设备设置相应的设备处理程序,供用户进程和系统进程调用。

# 6.4.2 设备驱动程序的处理过程

 ◼ 将抽象要求转换成为具体要求
	将用户和上层软件对设备控制的抽象要求转换成对设备的具体要求,如对抽象要求的盘块号转换为磁盘的盘面、磁道及扇区。
	
 ◼ 对服务请求进行校验。
 
 ◼ 读出和检查设备的状态,确保设备处于就绪态。
 
 ◼ 传送必要的参数,如传送的字节数,数据在主存的首址等。
 
 ◼ 启动I/O设备,并检查启动是否成功。
	如成功则将控制返回给I/O控制系统。在I/O设备忙于传送数据时,该用户进程把自己阻塞,直至中断到来才将它唤醒,而CPU可干别的事。

# 6.4.3 对I/O设备的控制方式

### 四种方式越来越快 ###
# 1 使用轮询的可编程I/O方式 ( 忙等 )

由于无中断机构,处理机对I/O设备的控制采取程序I/O方式,或称为忙—等待方式。即在处理机向控制器发送一条I/O指令启动输入设备输入数据时,要同时把状态寄存器中的忙/闲标志置为1。然后便不断测试标志。当为1时,表示输入机尚未输完一个字,处理机应继续对该标志测试,直到它为0,表明数据已输入到控制器的数据寄存器中。于是处理机将数据取出送入内存单元,便完成了一个字的I/O 。

在程序I/O方式中,由于CPU高速而I/O设备低速致使CPU极大浪费。
轮询I/O方式也称作程序查询方式或程序I/O方式。

在这里插入图片描述

# 2 使用中断的可编程I/O方式 ( 中断 )

◼ 当某进程要启动某个I/O设备时,便由CPU向相应的设备控制器发出一条I/O命令,然后立即返回继续执行原来的任务。设备控制器按照命令的要求去控制指定I/O设备。这时CPU与I/O设备并行操作。

在输入时,当设备控制器收到 CPU发来的读命令后,便准备接收从相应输入设备送来的数据。一旦数据进入数据寄存器,控制器便通过控制线向CPU发送一中断信号,由CPU检查输入过程中是否出错,若无错,便向控制器发取走数据的信号,然后便通过控制器将数据写入指定内存单元。

所以,中断驱动方式在I/O设备输入数据的过程中,无需CPU干预,可以使CPU与I/O设备并行工作。仅当输完一个数据时,才需 CPU花费极短的时间去进行中断处理。从而大大地提高了整个系统的资源利用率及吞吐量,特别是CPU的利用率

在这里插入图片描述

# 3 直接存储器访问方式

◼ DMA(Direct Memory Access)控制方式的引入

虽然中断方式比程序I/O方式更有效,但它仍是以字(节)为单位进行I/O的,
每当完成一个字(节)的I/O时,控制器便要请求一次中断。
显然是极其低效的。由此便引入了直接存储器访问方式。

◼ 特点

数据传输的基本单位是数据块;所传送的数据是从设备直接送入内存的,或者相反;
仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在控制器的控制下完成的。
DMA方式成百倍的减少了CPU对I/O的干预,进一步提高了CPU与I/O设备的并行操作程度。

在这里插入图片描述

# 4 I/O通道控制方式 ( 直接给通道 )

◼ I/O通道控制方式是DMA方式的发展,它可进一步减少CPU的干预,即把对一个数据块的读(写)为单位的干预,减少为对一组数据块的读(写)及有关的控制和管理为单位的干预。同时又可实现CPU、通道和I/O设备三者的并行操作,从而更有效的提高整个系统的资源利用率。

◼ 通道程序

通道是通过执行通道程序,并与设备控制器共同实现对I/O设备的控制的。
通道程序由一系列通道指令所构成的。

◼ 通道指令一般包含下列信息:

➢ 操作码。       				规定指令所执行的操作。
➢ 内存地址。
➢ 计数。           				表示本指令所要操作的字节数。
➢ 通道程序结束位P。				P=1:通道程序结束,0表示未结束
➢ 记录结束标志R。
	R=0:本通道指令与下一条通道指令处理的数据属于同一条记录;
	R=1:为处理某记录的最后一条指令

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
◼ 通道类型

➢ 字节多路通道(Byte Multiplexor Channel)
➢ 数组选择通道(Block Selector Channel)
➢ 数组多路通道(Block Multiplexor Channel)

数组选择通道虽然有很高的传输速率,但它每次只允许一个设备传输数据。

数组多路通道是将数组选择通道的传输速率高和字节多路通道的分时并行操作的优点结合起来,形成的一种新的通道。它含有多个非分配型子通道,可以连接多台高、中速的外围设备,其数据传送却是按数组方式进行。所以这种通道既具有很高的数据传输速率,又能获得令人满意的通道利用率。




6.5 与设备无关的I/O软件

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

基本含义:

应用程序中所用的设备,不局限于使用某个具体的物理设备。
为每个设备所配置的设备驱动程序是与硬件紧密相关的软件。

# 6.5.1 与设备无关软件的基本概念

# 1. 以物理设备名使用设备
在早期OS中,应用程序在使用I/O设备时,都使用设备的物理名称,这使应用程序与系统中的物理设备直接相关。
# 2. 引入了逻辑设备名
为了实现与设备的无关性而引入了逻辑设备和物理设备两个概念。
逻辑设备是抽象的设备名。
# 3. 逻辑设备名到物理设备名的转换 ( 查表 )
在应用程序中,用逻辑设备名使用设备虽然方便了用户,但系统却只识别物理设备名。
因此在实际执行时,必须使用物理名称。
为此,在系统中,必须具有将逻辑设备名称转换为某物理设备名称的功能。

# 6.5.2 与设备无关的软件

# 1. 设备驱动程序的统一接口

为了使所有的设备驱动程序有着统一的接口,要求每个设备驱动程序与OS之间都有着相同的接口,或者相近的接口,这样会使添加一个新的设备驱动程序变得很容易,同时在很大程度上方便了开发人员对设备驱动程序的编制。

# 统一接口的功能:
◼ 将抽象的设备名映射到适当的驱动程序上。
		即将抽象的设备名转换为具体的物理设备名,并进一步可以找到相应物理设备的驱动程序入口。

◼ 对设备进行保护。
		禁止用户直接访问设备,以防止无权访问的用户使用。
# 2. 缓冲管理
无论是字符设备还是块设备,它们的运行速度都远低于CPU的速度。为了缓和CPU和I/O设备之间的矛盾、提高CPU的利用率,在现代OS中都无一例外地分别为字符设备和块设备配置了相应的缓冲区。缓冲区有多种,如单缓冲区、双缓冲区、循环缓冲区、公用缓冲池等,以满足不同情况的需要。
# 3. 差错控制
由于设备中有着许多的机械和电气部分,因此,它们比主机更容易出现故障,这就导致I/O操作中的绝大多数错误都与设备有关。

错误可分为如下两类:

(1) 暂时性错误。
(2) 持久性错误。
# 4. 对独占设备的分配与回收
在系统中有两类设备:独占设备;共享设备。
对于独占设备,为了避免诸进程对独占设备的争夺,必须由系统来统一分配,不允许进程自行使用。

◼ 每当进程需要使用某(独占)设备时,必须先提出申请。

◼ OS接到对设备的请求后,先对进程所请求的独占设备进行检查,看该设备是否空闲。若空闲,才把该设备分配给请求进程。否则,进程将被阻塞,放入该设备的请求队列中等待。等到其它进程释放该设备时,再将队列中的第一个进程唤醒,该进程得到设备后继续运行。

# 5. 独立于设备的逻辑数据块

不同类型的设备,其数据交换单位是不同的,读取和传输速率也各不相同,如字符型设备以单个字符(字)为单位,块设备是以一个数据块为单位。

即使同一类型的设备,其数据交换单位的大小也是有差异的,如不同磁盘由于扇区大小的不同,可能造成数据块大小的不一致。

设备独立性软件应能够隐藏这些差异而被逻辑设备使用,并向高层软件提供大小统一的逻辑数据块。与设备无关软件的功能层次

在这里插入图片描述

# 6.5.3 设备分配

# 1 设备分配中的数据结构

在进行设备分配时,通常都要借助一些表格的帮助。在表格中记录了相应设备或控制器的状态及对设备或控制器进行控制所需的信息。

对于配备通道的计算机中,在进行设备分配时所需的数据结构有:

1. 系统设备表         系统上所有设备的表
2. 设备控制表
3. 控制器控制表
4. 通道控制表等

在这里插入图片描述

SDT		就是设备
COCT	就是控制器
CHCT	就是通道
# 2 设备分配时应考虑的因素
# ◼ 设备的固有属性
➢ 在分配设备时,首先应考虑与设备分配有关的设备属性。
设备的固有属性可分为三种:    独占性、共享性和虚拟性设备。

	独占设备在一段时间内只能由一个进程使用。
	共享设备允许多个进程共享。
	虚拟设备是经过某种处理由独占设备变为虚拟设备。
# ◼ 设备分配算法
➢ 先来先服务:
		根据请求的先后次序排成一个队列,设备总是分配给队首进程。
➢ 优先级高者优先:
		利用该算法形成队列时,将优先权高的进程安排在设备队列前面,优先级相同的先来先服务。
# ◼ 设备分配中的安全性

从进程运行的安全性上考虑,设备分配有以下两种方式。

➢ 安全分配方式:
		每当进程发出I/O请求后便阻塞,直到I/O完成后被唤醒。虽安全但缓慢。
➢ 不安全分配方式:
		不断发出I/O请求,直到所请求的设备已经被另一进程占用才阻塞。虽迅速但不安全。
# 3 独占设备的分配程序
# 1) 分配设备:
根据物理设备名在SDT中找出该设备的DCT,
若设备忙,便将请求I/O的进程PCB挂在设备队列上;
否则,便按照一定的算法来计算本次设备分配的安全性,
若不会导致系统进入不安全状态,便将设备分配给请求进程;
否则,仍将其PCB插入设备队列。
# 2) 分配控制器:
分配设备给进程后,再到其DCT中找出与该设备连接的控制器的COCT。
若控制器忙,便将请求I/O进程的PCB挂在该控制器的等待队列上;
否则,将该控制器分配给进程。
# 3) 分配通道:
分配控制器后,再在COCT中找到与该控制器连接的CHCT。
若通道忙,便将请求I/O的进程挂在该通道的等待队列上;
否则,将该通道分配给进程。

只有在设备、控制器和通道三者都分配成功时,这次的设备分配才算成功; 之后便可启动该I/O设备进行数据传送。

# 设备分配程序的改进
上述基本的设备分配程序中,有以下特点:
① 进程以物理设备名提出I/O请求的;
② 采用的是单通路的I/O系统结构,容易产生“瓶颈”现象。

为使独占设备的分配程序具有更大的灵活性和提高分配的成功率,应从两方面对基本的设备分配程序加以改进:

# ◼ 增加设备的独立性:
为获得设备独立性,进程应用逻辑设备名请求I/O。
系统先从SDT中找出第一个该类设备的DCT。如该设备忙,再找第二个,
若所有该类设备部忙则把进程挂在该类设备的等待队列上;
而只要有一个该类设备可用,系统就可进一步计算分配该设备的安全性。
# ◼ 考虑多通路情况:
分配控制器和通道时,若设备(控制器)所连接的第一个控制器(通道)忙时,应查看其所连接的第二个控制器(通道),
仅当所有的控制器(通道)都忙时,此次的控制器(通道)分配才算失败,才把进程挂在控制器(通道)的等待队列上;
而只要有一个控制器(通道)可用,系统便可将它分配给进程。

# 6.5.4 逻辑设备名到物理设备名的映射的实现

# 1. 逻辑设备表LUT(Logical Unit Table)
在逻辑设备表的每个表目中包含三项:
逻辑设备名、物理设备名和设备驱动程序的入口地址。

在这里插入图片描述

# 2. 逻辑设备表的设置问题

系统中可采取两种方式设置逻辑设备表:

◼ 整个系统中只设置一张LUT:
		由于每个用户不允许逻辑设备名重,只能于	单用户系统
◼ 为每个用户设置一张LUT:
		可用表二的形式。将每个用户的LUT放入PCB中

6.6 用户层的I/O软件

6.6.1 系统调用与库函数

1. 系统调用

为使诸进程能有条不紊地使用I/O设备,且能保护设备的安全性,不允许运行在用户态的应用进程去直接调用运行在核心态(系统态)的OS过程。

但应用进程在运行时,又必须取得OS所提供的服务,否则,应用程序几乎无法运行。
为了解决此矛盾,OS在用户层中引入了一个中介过程-系统调用,
应用程序可以通过它间接调用OS中的I/O过程,对I/O设备进行操作。 

在这里插入图片描述

2. 库函数
在C语言以及UNIX系统中,系统调用(如read)与各系统调用所使用的库函数(如read)之间几乎是一一对应的。

而微软定义了一套过程,称为Win32 API的应用程序接口(Application Program Interface),
程序员利用它们取得OS服务,该接口与实际的系统调用并不一一对应。

用户程序通过调用对应的库函数使用系统调用,这些库函数与调用程序连接在一起,
被嵌入在运行时装入内存的二进制程序中。

6.6.2 假脱机系统(Spooling)( 重点 )

虚拟性是OS的四大特征之一。
如果说通过多道程序技术将一台物理CPU虚拟为多台逻辑CPU,从而允许多个用户共享一台主机,
那么,通过Spooling技术便可将一台物理I/O设备虚拟为多台逻辑I/O设备,
同样允许多个用户共享一台物理I/O设备。

输入输出是脱离主机的,所以叫脱机方式。

在这里插入图片描述

两边是外设,慢    	中间是主机,快
用慢的外设专门处理输入与输出,放入磁带,
磁带用的时候取下安装到主机上,
1. 假脱机技术
用两个进程代替上面的两个处理机。

在这里插入图片描述

为缓和CPU的高速性与I/O设备低速性间的矛盾而引入了脱机输入、脱机输出技术。该技术是利用专门的外围控制机,将低速设备上的数据传送到高速磁盘上;或者相反。这样就可以在主机的直接控制下实现脱机输入输出。此时外围操作与CPU对数据的处理同时进行。

在多道程序环境下,可用1道程序模拟脱机输入时的外围处理机,把外设输入的数据放到高速磁盘上;用1道程序模拟脱机输出时的外围处理机,把数据从高速磁盘传送到输出设备上。我们把这种在联机情况下实现的同时外围操作称为Spooling(Simultaneaus Periphernal perating On Line),或称为假脱机操作。

在这里插入图片描述
输入#就是缓冲区
在这里插入图片描述

2. SPOOLing系统的组成

主要有四大部分:

1. ◼ 输入井和输出井。
是磁盘上开辟的两个大存储空间。
输入井模拟脱机输入的磁盘设备,
输出井模拟脱机输出时的磁盘。

2. ◼ 输入缓冲区和输出缓冲区。
在内存中开辟两个缓冲区,
输入缓冲区暂存由输入设备送来的数据,后送输入井;
输出缓冲区暂存从输出井送来的数据,后送输出设备。

3. ◼ 输入进程和输出进程。
利用两个进程模拟脱机I/O时的外围处理机。

4. ◼ 井管理程序。
用于控制作业与磁盘井之间信息的交换。
3. SPOOLing系统的特点
◼ 提高了I/O的速度。利用输入输出井模拟成脱机输入输出,缓和了CPU和I/O设备速度不匹配的矛盾。

◼ 将独占设备改造为共享设备。(代替设备功能,实现共享)
并没有为进程分配设备,而是为进程分配一存储区和建立一张I/O请求表。

◼ 实现了虚拟设备功能。多个进程同时使用一台独占设备,虚拟成了多台设备
4. 假脱机打印系统

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

当用户进程请求打印时,SPOOLing系统同意为他打印,但并不真正把打印机分配给它,而是由输出进程在输出井中为之申请一空闲盘块区,将要打印的数据送入其中;再为用户进程申请一张空白的用户请求打印表,将用户的打印要求填入其中,再将该表挂到请求打印队列上。

如果还有进程要求打印输出,系统仍可接受该请求。如果打印机空闲,输出进程将从请求打印队列的队首取出一张请求打印表,根据表中的要求将要打印的数据从输出井传送到内存缓冲区,再由打印机进行打印。同样处理下一张请求打印表,直至请求队列为空,输出进程才将自己阻塞起来、直到下次再有打印请求被唤醒。

5. 守护进程(daemon)
前面是利用假脱机系统来实现打印机共享的一种方案。

人们对该方案进行了某些修改,如取消该方案中的假脱机管理进程,为打印机建立一个守护进程,由它执行一部分原来由假脱机管理进程实现的功能,如为用户在磁盘缓冲区中申请一个空闲盘块,并将要打印的数据送入其中,将该盘块的首址返回给请求进程。另一部分由请求进程自己完成。

每个要求打印的进程首先生成一份要求打印的文件,其中包含对打印的要求和指向装有打印输出数据盘块的指针等信息,然后将用户请求打印文件放入假脱机文件队列(目录)中。

守护进程是允许使用打印机的唯一进程。所有需要使用打印机进行打印的进程都需将一份要求打印的文件放在假脱机文件队列中。若守护进程正在睡眠,则将其唤醒。打印完成后,再去睡眠。可有许多其他的守护进程。如,网络守护进程、服务器守护进程等。

6.7 缓冲区管理

为了缓和CPU和I/O设备速度不匹配的矛盾,提高CPU和I/O设备的并行性,
在现代OS中,几乎所有的I/O设备与处理机交换数据时,都用了缓冲区。

6.7.1 缓冲的引入

引入缓冲区的主要原因归结为以下几点:
⚫ 缓和CPU与I/O设备间速度不匹配的矛盾。
⚫ 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
⚫ 提高CPU和I/O设备之间的并行性。

6.7.2 单缓冲区与双缓冲区

◼ 单缓冲区(Single Buffer)
在单缓冲情况下,每当用户进程发出一I/O请求时,OS便在主存中为之分配一缓冲区。

在字符设备输入时,缓冲区用于暂存用户输入的一行数据,
在输入期间,用户进程被挂起以等待数据输入完毕;
在输出时,用户进程将一行数据输入到缓冲区后,继续执行处理。
当用户进程已有第二行数据输出时,如果第一行数据尚未被提取完毕,则此时用户进程应阻塞。
◼ 双缓冲区(Double Buffer)
为了加快输入和输出速度,提高设备利用率,人们又引入了双缓冲区机制,也称为缓冲对换(Buffer Swapping)。

在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。
此时OS可以从第一缓冲区中移出数据,并送入用户进程。接着由CPU对数据进行计算。
双机通讯时缓冲区的设置

若我们在实现两台机器之间的通信时,仅为它们配置了单缓冲,那么它们之间任意时刻都只能实现单方向的数据传输,而绝不允许双方同时向对方发送数据。为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接受缓冲区。

在这里插入图片描述

6.7.3 环形缓冲区

当输入与输出或生产者与消费者的速度基本相匹配时,采用双缓冲能获得较好的效果,可使生产者和消费者基本上能并行操作。但若两者的速度相差甚远,双缓冲的效果不够理想,但随着缓冲区数量的增加,情况有所改善。因此,又引入了多缓冲机制。可以将缓冲区组织成循环缓冲形式

◼ 环形缓冲区的组成
➢ 多个缓冲区。循环缓冲有多个大小相同的缓冲区,作为输入的缓冲区有三种类型:
		用于装输入数据的空缓冲区R、
		已装满数据的缓冲区G
		以及计算进程正在使用的现行工作缓冲区C。

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

在这里插入图片描述

6.7.4 缓冲池(Buffer Pool)

上述的缓冲区仅适用于某特定的I/O进程和计算进程,因而它们属于专用缓冲。当系统较大时,将会有许多这样的循环缓冲,这不仅消耗大量内存空间,而且利用率不高。为提高缓冲区的利用率,目前广泛流行缓冲池,在池中设置了多个可供若干个进程共享的缓冲区。

用的时候分配块缓冲区,用完了再还回去。
缓冲池的组成
◼ 对于既可输入又可输出的公用缓冲池,至少应含有下列三种类型的缓冲区:
	➢ 空缓冲区;
	➢ 装满输入数据的缓冲区;
	➢ 装满输出数据的缓冲区;

◼ 为管理方便,将类型相同的缓冲区连成一个队列,
		即空缓冲区队列、输入队列和输出队列。
另还设置了四种工作缓冲区:
		收容输入数据的;收容输出数据的;用于提取输入的和用于提取输出的工作缓冲区
◼ 缓冲区的工作方式
缓冲区可以工作在下列四种方式下:
➢ 收容输入。输入进程需要输入时,取得空缓冲区,装满后放入输入队列。
➢ 提取输入。计算进程需要输入时,在输入队列取缓冲区,提取数据后挂在空缓冲区队列上。
➢ 收容输出。计算进程需要输出时,取空缓冲区,装满数据后挂在输出缓冲队列上。
➢ 提取输出。输出进程从输出队列取缓冲区,提取完数据后挂在空缓冲区上。

在这里插入图片描述

6.8 磁盘存储器的性能和调度

在这里插入图片描述

在这里插入图片描述

扇区是最小的存贮单位

6.8.1 磁盘性能简述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.8.2 早期的磁盘调度算法

当有多个进程都请求访问磁盘时,应使各进程对磁盘的平均访问时间(主要是寻道) 最小。
因此,磁盘调度的目标应是使磁盘的平均寻道时间最少。目前常用的磁盘调度算法有:
先来先服务
根据进程请求访问磁盘的先后次序进行调度。

优点:公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。

缺点:未对寻道进行优化,致使平均寻道时间可能较长。仅适用于请求磁盘I/O的进程数目较少的场合。
最短寻道时间优先
算法选择要求访问的磁道与当前磁头所在的磁道距离最近的进程,以使每次的寻道时问最短。

存在的问题:可能导致某些进程发生“饥饿”。
因为只要不断有所要访问的磁道与磁头当前所在磁道的距离较近的新进程到达,就会出现“老进程饥饿”现象。

这种调度算法不能保证平均寻道时间最短。

在这里插入图片描述

6.8.3 基于扫描的磁盘调度算法

扫描(SCAN)算法 (电梯调度算法)

SCAN算法不仅考虑欲访问的磁道与当前磁道的距离,更优先考虑磁头的当前移动方向。在磁头正在自里向外移动时,所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向,自外向里移动。这时,每次选择要访问的磁道,在当前磁道之内且距离最近者这样的进程来调度。

SCAN算法中磁头移动的规律似电梯的运行,又称为电梯调度算法。算法既能获得较好的寻道性能,又能防止进程饥饿,被广泛用于大、中、小型机和网络中的磁盘调度。

存在的问题:当磁头刚从里向外移动过某一磁道时,恰有一进程请求访问此磁道,这时该进程必须等待,待磁头从里向外,然后再从外向里扫描完所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被严重地推迟。
在这里插入图片描述

循环扫描CSCAN

为了减少请求进程的延迟,CSCAN算法规定磁头单向移动。若规定只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
采用循环扫描方式后,上述请求进程的请求延迟,将从原来的2T减为T+Smax,其中,T为由里向外(或相反)扫描完所有要访问的磁道所需的寻道时间,而Smax是将磁头从最外面被访问的磁道直接移到最里边欲访问的磁道所需的寻道时间。

在这里插入图片描述

磁盘调度算法之例(全体)

在这里插入图片描述
在这里插入图片描述

N-Step-SCAN和FSCAN调度算法
◼ N-Step-SCAN算法:

SSTF、SCAN、CSCAN几种调度算法都可能出现磁臂停留在某处不动的情况,称为磁臂粘着。在高密度盘上更容易出现此情况。N-Step-SCAN算法将磁盘请求队列分成若干个长度为N的子队列。磁盘调度将按FCFS算法依次处理这些子队列,而每处理一个队列时,又是按SCAN算法。这样就可避免出现粘着现象。N值取得很大时,其性能接近SCAN算法;N=1时,则退化为FCFS算法。

◼ FSCAN算法:

本算法是N-Step-SCAN算法的简化。它只将磁盘请求访问队列分成两个子队列。 一是当前所有请求磁盘I/O的进程形成的队列,由磁盘调度按SCAN算法进行处理;另一个则是在扫描期间,新出现的所有请求磁盘I/O进程组成的等待处理的请求队列。从而使所有的新请求都将被推迟到下一次扫时处理。

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/106054508