操作系统—输入输出系统

输入输出系统
1 I/O系统的功能、模型和接口

I/O系统管理对象主要是I/O设备和相应的设备控制器,主要任务是完成用户提出的I/O请求,提高I/O速率,提高设备利用率

1.1 I/O系统的基本功能
  • 第一第二功能为了方便用户使用I/O设备

  • 第三第四功能是用于提高CPU和I/O设备的利用率

  • 第五第六功能是为用户在共享设备时提供方便,保证系统有条不紊进行,系统发生错误时候,能及时发现错误,甚至能自动修复错误。

① 隐藏物理设备的细节

对于不同的设备,需要有不同的命令和参数。如果要求程序员或用户编写直接面向这些设备编程是极端困难的,因此I/O系统必须对设备加以适当的抽象,以隐藏掉物理设备的实现细节。

② 与设备的无关性

在隐藏物理设备细节的基础上实现的。当用户输出打印时,TA只需要提供读or写的命令,和提供抽象的逻辑设备名。

③ 提高处理机和I/O利用率

I/O设别间是相互独立的,能够并行操作,在处理机与设备之间也能并行操作。因此需要提高处理机和I/O利用率。

④ 对I/O设备进行控制

目前有四种控制方式:

  • 采用轮询的可编程I/O方式
  • 采用中断的可编程I/O方式
  • 直接存储器访问方式
  • I/O通道方式

对磁盘、光盘等高速设备,由于传输数据的基本单位是数据块,故采用直接存储器的访问方式

⑤ 确保对设备的正确共享

根据共享属性分为两类

  • 独占设备:打印机、磁带机等。
  • 共享设备:磁盘

⑥ 错误处理

大多数的设备都包括了较多的机械和电气部分,运行时容易出现错误和故障。(临时性错误和持久性错误)

临时性错误可以通过重新操作来纠正,发生持久性错误时,才需要向上层报告

1.2 I/O系统的层次结构和模型

(1)I/O软件的层次结构

① 用户层 I/O 软件:实现与用户交互的接口,用户可直接调用该层所提供的、与 I/O 操作有关的库函数对设备进行操作

② 设备独立性软件:用于实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间

③ 设备驱动程序:与硬件直接相关,用于具体实现系统对设备发出的操作指令,驱动 I/O 设备工作的驱动程序

④ 中断处理程序:CPU 先保护被中断进程的 CPU 环境,再转入相应的的中断处理程序进行处理,处理完毕后 CPU 再恢复被中断进程的现场,返回到被中断的进程

在这里插入图片描述

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

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

① I/O系统的上、下接口

  • I/O系统接口
  • 软件/硬件(RW/HW)接口

在这里插入图片描述

② I/O系统的分层

与前面所述的I/O软件组织的层次结构相对应,I/O系统本身也可分为如下三个层次:

  • 中断处理程序
  • 设备驱动程序
  • 设备独立性软件
1.3 I/O系统接口

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

(1)块设备接口

① 块设备:是指数据的存取和传输都是以数据块位单位的设备,典型的比如磁盘,特征一是传输效率较高,通常是MB/S二是可寻址,即能指定数据的输入源地址和输出的目标地址,可随机地读/写磁盘中任一块。磁盘设备的I/O常采用DMA方式。

② 隐藏了磁盘的二维结构:块设备接口将磁盘上的所有扇区从0-n-1依次编号,二维结构改变为一种线性序列。在二维结构中,每个扇区地址需要用磁道号和扇区号来表示。

③ 将抽象命令映射为低层操作:块设备接口支持上层发来的对文件or设备的打开、读、写和关闭等抽象命令。该接口将上述命令映射为设备能识别的较低层次的具体操作。如上层发来的读磁盘命令时,它先将抽象命令中的逻辑块号转换为磁盘的盘面、磁道和扇区。

(2)流设备接口

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

① 字符设备:是指数据的存取和传输都是以字符为单位的设备。如键盘、打印机

② get和put操作:字符设备是不可寻址的,对它只能采用顺序存取方式。通常为字符设备建立一个字符缓冲区(队列),设备的I/O字符流顺序地进入字符缓冲区(读入),或从字符缓冲区顺序地送出到设备(输出)。获取get,put把字符输出到缓冲区中。

③ in-control指令:包含很多参数,每个参数表示一个与具体设备相关的特定功能。

(3)网络通信接口

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

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

I/O设备一般是由执行I/O操作的机械部分和执行控制I/O的电子部件组成。通常将这两部分分开,执行I/O操作的机械部分就是一般的I/O设备,而执行控制I/O的电子部件则称为设备控制器适配器(adapter)。在微型机和小型机中的控制器常做成印刷电路卡形式,因而也常称为控制卡、接口卡或网卡,可将它插入计算机的扩展槽中。在有的大、中型计算机系统中,还配置了I/O通道或I/O处理机.

2.1 I/O设备

(1)I/O设备的类型

块设备、字符设备、独占设备、共享设备。还可以从设备使用特性上分为存储设备、I/O设备

  • 按使用特性分类

① 存储设备(外存、辅存):存储信息,存取速度较内存慢,但容量大。

② I/O设备(输入输出设备)

  • 按传输速率分类

① 低俗设备 ② 中速设备 ③ 高速设备

(2)设备与控制器之间的接口

通常,设备并不是直接与CPU进行通信,而是与设备控制器通信,因此,在I/O设备中应含有与设备控制器间的接口,在该接口中有三种类型的信号,各对应一条信号线(计算机组成原理)

① 数据信号线 ② 控制信号线 ③ 状态信号线

在这里插入图片描述

2.2 设备控制器

(1)设备控制器的基本功能

① 接收和识别命令

② 数据交换

③ 标识和报告设备的状态

④ 地址识别

⑤ 数据缓冲区

⑥ 差错控制

(2)设备控制器的组成

由于设备控制器位于CPU与设备之间,它既要与CPU通信,又要与设备通信,还应具有按照CPU所发来的命令去控制设备工作的功能,因此,现有的大多数控制器都是由以下三部分组成:

① 设备控制器与处理机的接口

该接口有三类信号线:数据线、地址线、控制线

数据线与两类寄存器相连:

  • 数据寄存器
  • 控制/状态寄存器

② 设备控制器与设备的接口

③  I/O逻辑

在这里插入图片描述

2.3 内存映像I/O

(1)利用特定的I/O指令

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

缺点:访问内存和访问设备需要两种不同的指令

在这里插入图片描述

(2)内存映像I/O

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

优点:统一对内存和控制器的访问方法,简化I/O编程

在这里插入图片描述

2.4 I/O通道

(1)I/O通道设备的引入

虽然在CPU与I/O设备之间增加了设备控制器后,已能大大减少CPU对I/O的干预,但当主机所配置的外设很多时,CPU的负担仍然很重。为此,在CPU和设备控制器之间又增设了I/O通道(I/O Channel)。实际上是一种特殊的处理机。

  • 目的:建立独立的I/O操作
  • 与处理机的区别:① 指令类型单一,因为通道硬件比较简单,具有局限性 ② 通道没有自己的内存,与CPU共享内存。

(2)通道类型

① 字节多路通道(Byte Multiplexor Channel)—不适于连接高速设备

这是一种按字节交叉方式工作的通道。它通常都含有许多非分配型子通道,其数量可从几十到数百个,每一个子通道连接一台I/O设备,并控制该设备的I/O操作。这些子通道按时间片轮转方式共享主通道。

在这里插入图片描述

② 数组选择通道(Block Selector Channel)

字节多路通道不适于连接高速设备,这推动了按数组方式进行数据传送的数组选择通道的形成。可以连接多台高速设备,但由于它只有一个分配型子通道,在一段时间内只能执行一道通道程序,所以通道利用率低

③ 数组多路通道(Block Multiplexor Channel)

数组选择通道虽有很高的传输速率,但它却每次只允许一个设备传输数据。数组多路通道是将数组选择通道传输速率高和字节多路通道能使各子通道(设备)分时并行操作的优点相结合而形成的一种新通道。

(3)“瓶颈”问题

由于通道价格昂贵,致使机器中所设置的通道数量势必较少,这往往又使它成了I/O的瓶颈,进而造成整个系统吞吐量的下降

  • 单通路I/O系统
    在这里插入图片描述

  • 多通路I/O系统

在这里插入图片描述

3 中断机构和中断处理程序—计算机组成原理

中断在操作系统中有着特殊重要的地位,它是多道程序得以实现的基础,没有中断,就不可能实现多道程序,因为进程之间的切换是通过中断来完成的。另一方面,中断也是设备管理的基础,为了提高处理机的利用率和实现CPU与I/O设备并行执行,也必需有中断的支持。中断处理程序是I/O系统中最低的一层,它是整个I/O系统的基础。

3.1 中断简介

(1)中断

是指CPU对I/O设备发来的中断信号的一种响应。CPU暂停正在执行的程序,保留CPU环境,自动地转去执行该I/O设备的中断处理程序。执行完后再回到断点,继续执行原来的程序。中断是由外部设备引起的,又称外部中断

(2)陷入

CPU内部事件所引起的中断,例如进程在运算过程中发生了上溢或下溢,或者程序出错,如非法指令、地址越界以及电源故障。称为内中断or陷入。

3.2 中断向量表和中断优先级

(1)中断向量表

中断向量(Interrupt vector)是中断服务程序的入口地址,或中断向量表(它是一个中断处理程序地址的数组)的表项

系统程序必须维护一份中断向量表,每一个表项纪录一个中断处理程序(ISR,Interrupt Service Routine)的地址当外部事件或异常产生时,由硬件负责产生一个中断标记,CPU根据中断标记获得相应中断的中断向量号,然后由CPU根据中断向量表的地址和中断向量号去查找中断向量表获得相应中断号的中断程序地址,进一步执行对应的中断处理程序。

(2)中断优先级

经常会有多个中断信号源,每个中断对服务要求的紧急程度并不相同。为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。

(3)对多中断源的处理方式

① 屏蔽中断(禁止)

当处理机正在处理一个中断时,将屏蔽所有的中断,即处理机对任何新到的中断请求,都暂时不与理睬,而让它们等待。

在这里插入图片描述

② 嵌套中断

规则:

  • 当同时有多个不同优先级的中断请求时,CPU优先响应最高优先级的中断请求。
  • 高优先级的中断请求可以抢占正在运行的低优先级中断的处理机。

在这里插入图片描述

3.3 中断处理程序

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

中断处理程序的处理过程可以分为以下几个步骤:

① 测定是否有未响应的中断信号

② 保护被中断进程的CPU环境

③ 转入相应的设备处理程序

④ 中断处理

⑤ 恢复CPU的现场并退出中断

此刻是否回返回得到被中断的进程,取决于两个因素:

  • 本中断是否采用了屏蔽中断的方式,若是就会返回被中断的进程
  • 嵌套中断。如果没有优先级更高的中断请求I/O,在中断完成后,仍会返回被中断的进程,反之系统处理更高的中断请求

在这里插入图片描述

4 设备驱动程序

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

4.1 设备驱动程序概述

(1)设备驱动程序的功能

① 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列

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

③ 发出I/O命令,若设备空闲,立即启动I/O设备,完成指定的I/O操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待

④ 及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理

(2)设备驱动程序的特点

设备驱动程序属于低级的系统例程,它与一般的应用程序及系统程序之间有下述明显差异:

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

② 驱动程序与设备控制器以及I/O设备的硬件特性紧密相关,对于不同类型的设备,应配置不同的驱动程序。但可以为相同的多个终端设置一个终端驱动程序

③ 驱动程序与I/O设备所采用的I/O控制方式紧密相关,常用的I/O控制方式是中断驱动和DMA方式

④ 由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言书写。目前有很多驱动程序的基本部分已经固化在ROM中

⑤ 驱动程序应允许可重入。一个正在运行的驱动程序常会在一次调用完成前被再次调用

(3)设备处理方式

在不同的操作系统中,所采用的设备处理方式并不完全相同,设备处理方式分成以下三类:

① 为每一类设备设置一个进程,专门用于执行这类设备的I/O操作

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

③ 不设置专门的设备进程,而只为各类设备相应的设备驱动程序,供用户或系统进程调用。

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

设备驱动程序的主要任务是启动指定设备,完成上层指定的I/O工作。但在启动之前,应先完成必要的准备工作,如检测设备状态是否为“忙”等。在完成所有的准备工作后,才向设备控制器发送一条启动命令。

处理过程:

① 将抽象要求转换为具体要求

② 对服务请求进行校验

③ 检查设备状态

④ 传送必要的参数

⑤ 启动I/O设备

在这里插入图片描述

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

对设备的控制,早期是使用轮询的可编程I/O方式,后来发展为使用中断的可编程I/O方式

(1)使用轮询的可编程I/O方式

在处理机向控制器发出一条I/O指令,启动输入设备输入数据时,要同时把状态寄存器中的忙/闲标志busy置为1,然后便不断地循环测试busy(称为轮询)。当busy=1时,表示输入机尚未输完一个字(符),处理机应继续对该标志进行测试,直至busy=0,表明输入机已将输入数据送入控制器的数据寄存器中。于是处理机将数据寄存器中的数据取出,送入内存指定单元中,这样便完成了一个字(符)的I/O。接着再去启动读下一个数据,并置busy=1。

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

当前,对I/O设备的控制,广泛采用中断的可编程I/O方式,即当某进程要启动某个I/O设备工作时,便由CPU向相应的设备控制器发出一条I/O命令,然后立即返回继续执行原来的任务。设备控制器于是按照该命令的要求去控制指定I/O设备。此时,CPU与I/O设备并行操作。

(3)直接存储器访问方式

① 接存储器访问方式的引入

虽然中断驱动I/O比程序I/O方式更有效,但它仍是以字(节)为单位进行I/O的。每当完成一个字(节)的I/O时,控制器便要向CPU请求一次中断。

该方式的特点是:

  • 数据传输的基本单位是数据块,即在CPU与I/O设备之间,每次传送至少一个数据块
  • 所传送的数据是从设备直接送入内存的,或者相反
  • 仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在控制器的控制下完成的。可见,DMA方式较之中断驱动方式又进一步提高了CPU与I/O设备的并行操作程度

② DMA控制器的组成

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

在这里插入图片描述

③ DMA工作过程

当CPU要从磁盘读入一数据块时,便向磁盘控制器发送一条读命令。该命令被送入命令寄存器CR中。同时,需要将本次要读入数据在内存的起始目标地址送入内存地址寄存器MAR中。
在这里插入图片描述

4.4 I/O通道控制方式

(1)I/O通道控制方式的引入

DMA方式比起中断方式已经显著减少CPU的干预。即已由以字(节)为单位的干预减少到以数据块为单位的干预,但CPU每发出一条I/O指令,也只能去读(或写)一个连续的数据块。而当我们需要一次去读多个数据块且将它们分别传送到不同的内存区域,或者相反时,则须由CPU分别发出多条I/O指令及进行多次中断处理才能完成。

I/O通道方式是DMA方式的发展,它可以进一步减少CPU的干预,即把对一个数据块的读(或写)为单位的干预,减少为一组数据块的读(写)及有关的控制和管理。

(2)通道程序

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

每条指令都包含以下信息:

① 操作码:它规定了指令所执行的操作,如读、写控制等操作

② 内存地址:标明字符送入内存(读操作)和从内存取出(写操作)的时的内存首地址

③ 计数:表示本条指令所要读(或写)数据的字节数

④ 通道程序结束位P:用于表示通道程序是否结束。P=1表示本指令是通道程序的最后一条指令

⑤ 记录结束标志R:R=0表示本通道与下一条指令所处理的数据是同属于一个记录:R=1表示这是处理某记录的最后一条指令
在这里插入图片描述

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

为了方便用户提高OS的可适应性与可扩展性,在现代OS的I/O系统中,都无一例外地增加了与设备无关的I/O软件,以实现设备独立性,也称为设备无关性。其基本含义是:应用程序中所用的设备,不局限于使用某个具体的物理设备。为每个设备所配置的设备驱动程序是与硬件紧密相关的软件

5.1 与设备无关(Device Independce)软件的基本概念

(1)以物理设备名使用设备

在早期OS中,应用程序在使用I/O设备时,都使用设备的物理名称,这使应用程序与系统中的物理设备直接相关

(2)引入了逻辑设备名

为了实现与设备的无关性而引入了逻辑设备和物理设备两个概念。逻辑设备是抽象的设备名

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

在应用程序中,用逻辑设备名称使用设备虽然方便了用户,但系统却只识别物理设备名称,因此在实际执行时,还必须使用物理名称。为此,在系统中,必须具有将逻辑设备名称转换为某物理设备名称的功能

5.2 与设备无关的软件

(1)设备驱动程序的统一接口

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

(2)缓冲管理

无论是字符设备还是块设备,它们的运行速度都远低于CPU的速度。为了缓和CPU和I/O设备之间的矛盾、提高CPU的利用率,在现代OS中都无一例外地分别为字符设备和块设备配置了相应的缓冲区。缓冲区有着多种形式,如单缓冲区双缓冲区循环缓冲区公用缓冲池等,以满足不同情况的需要

(3)差错控制

由于设备中有着许多的机械和电气部分,因此,它们比主机更容易出现故障,这就导致I/O操作中的绝大多数错误都与设备有关。错误可分为如下两类:① 暂时性错误 ② 持久性错误

(4)对独立设备的分配与回收

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

(5)独立于设备的逻辑数据块

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

与设备无关软件的功能层次

在这里插入图片描述

5.3 设备分配

系统为实现对独占设备的分配,必须在系统中配置相应的数据结构

(1)设备分配中的数据结构

在用于设备分配的数据结构中,记录了对设备或控制器进行控制所需的信息。在进行设备分配时需要如下的数据结构

① 设备控制表DCT

系统为每一个设备都配置了一张设备控制表,用于记录设备的情况

在这里插入图片描述

设备控制表中,除了有用于指示设备类型的字段type和设备标识字段deviceid外,还应该含有下列字段

  • 设备队列首指针
  • 忙闲标志
  • 与设备连接的控制器表指针
  • 重复执行次数

② 控制器控制表、通道控制表和系统设备表

  • 控制器控制表(COCT)。系统为每一个控制器都设置了用于记录控制器情况的控制器控制表

在这里插入图片描述

  • 通道控制表(CHCT)。每个通道都有一张通道控制表
    在这里插入图片描述

  • 系统设备表(SDT)。这是系统范围的数据结构,记录了系统中全部设备的情况,每个设备占一个表目,其中包括有设备类型、设备标识符、设备控制表及设备驱动程序的入口等项

在这里插入图片描述

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

① 设备的固有属性—分成三种,对它们采取不同的分配策略

  • 独占设备的分配策略
  • 共享设备的分配策略
  • 虚拟设备的分配策略

② 设备分配算法

  • 先来先服务
  • 优先级高者优先

③ 设备分配中的安全性

  • 安全分配方式
  • 不安全分配方式

(3)独占设备的分配程序

① 基本的设备分配程序

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

  • 分配设备
  • 分配控制器
  • 分配通道

② 设备分配程序的改进

进程是以物理设备名提出I/O请求的。如果所指定的设备已分配给其它进程,则分配失败。或者说上面的设备分配程序不具有与设备无关性。为获得设备的独立性,进程应使用逻辑设备名请求I/O。

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

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

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

在这里插入图片描述

在这里插入图片描述

(2)逻辑设备表的设置问题

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

① 在整个系统中只设置一张LUT

② 为每个用户设置一张LUT

6 用户层的I/O软件
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.2 假脱机(Spooling)系统

通过假脱机技术,可将一台物理I/O设备虚拟为多台逻辑I/O设备,这样就允许多个用户共享一台物理I/O设备

(1)假脱机技术

为了缓和CPU的高速性与I/O设备低速性间的矛盾,而引入了脱机输入、脱机输出技术。

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

(2)SPOOLing的组成

SPOOLing技术是对脱机输入/输出系统的模拟

在这里插入图片描述

SPOOLing系统建立在通道技术多道程序技术的基础上,以高速随机外存(通常为磁盘)为后援存储器

在这里插入图片描述

SPOOLing系统主要由以下四部分构成:

① 输入井和输出井

这是在磁盘上开辟出来的两个存储区域。输入/输出井中的数据一般以文件的形式组织管理,这些文件叫井文件

② 输入缓冲区和输出缓冲区

这是在内存中开辟的两个缓冲区,用于缓和CPU和磁盘之间的矛盾。

③ 输入进程和输出进程

④ 井管理程序

(3)SPOOLing系统的特点

① 提高了I/O的速度

② 将独占设备改造为共享设备

③ 实现了虚拟设备功能

(4)假脱机打印机系统

打印机是经常用到的输出设备,属于独占设备。利用假脱机技术可将它改造为一台可供多个用户共享的打印设备,从而提高设备的利用率,也方便了用户。共享打印机技术已被广泛地用于多用户系统和局域网络中。假脱机打印系统主要有以下三部分:

① 磁盘缓冲区

② 打印缓冲区

③ 假脱机管理进程和假脱机打印进程

(5)守护进程(daemon)

利用假脱机系统来实现打印机共享的一种方案,人们对该方案进行了某些修改,如取消该方案中的假脱机管理进程,为打印机建立一个守护进程,由它执行一部分原来由假脱机管理进程实现的功能,如为用户在磁盘缓冲区中申请一个空闲盘块,并将要打印的数据送入其中,将该盘块的首址返回给请求进程。另一部分由请求进程自己完成,每个要求打印的进程首先生成一份要求打印的文件,其中包含对打印的要求和指向装有打印输出数据盘块的指针等信息,然后将用户请求打印文件放入假脱机文件队列(目录)中。

7 缓冲区管理
7.1 缓冲的引入

① 缓和CPU与I/O设备间速度不匹配的矛盾

② 减少对CPU的中断频率,放宽对CPU中断响应时间的限制

③ 解决数据粒度不匹配的问题

④ 提高CPU和I/O设备之间的并行性

在这里插入图片描述

7.2 单缓冲区和双缓冲区

(1)单缓冲区(Single Buffer)

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

单缓冲工作示意图:

在这里插入图片描述

(2)双缓冲区(Double Buffer)

缓冲区是共享资源,生产者与消费者在使用缓冲区时必须互斥。如果消费者尚未取走缓冲区中的数据,即使生产者又生产出新的数据,也无法将它送入缓冲区,生产者等待。如果为生产者与消费者设置了两个缓冲区,便能解决这一问题。
在这里插入图片描述

在这里插入图片描述

如果在实现两台机器之间的通信时仅为它们配置了单缓冲,那么,它们之间在任一时刻都只能实现单方向的数据传输。例如,只允许把数据从A传送到B,或者从B传送到A,而绝不允许双方同时向对方发送数据。

在这里插入图片描述

了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收缓冲区

在这里插入图片描述

7.3 环形缓冲区

(1)环形缓冲区的组成

① 多个缓冲区:每个缓冲区的大小相同

作为输入的多缓冲区可分为三种类型:

  • 用于装输入数据的空缓冲区R
  • 已装满数据的缓冲区G
  • 计算进程正在使用的现行工作缓冲区C

在这里插入图片描述

② 多个指针:作为输入的缓冲区可设置三个指针

  • 指示计算进程下一个可用缓冲区G的指针Nextg
  • 指示输入进程下次可用的空缓冲区R的指针Nexti
  • 指示计算进程正在使用的缓冲区C的指针Current

(2)环形缓冲区的使用

计算进程和输入进程可利用两个过程来使用环形缓冲区:

① Getbuf过程 ② Releasebuf过程

(3)进程之间的同步问题

使用输入循环缓冲,可使输入过程和计算过程并行执行。Nexti指针和指针Nextg将不断地沿着顺时针方向移动,可能出现两种情况:

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

② Nextg指针追赶上Nexti指针。这意味着输入进程输入数据的速度低于计算进程处理数据的速度,使全部装有输入数据的缓冲区都抽空。此时,计算进程应阻塞,直到输入进程又装满某个缓冲区,并调用Releasebuf过程将它释放时,才将计算进程唤醒。这种情况称为系统受I/O受限。

7.4 缓冲池

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

(1)缓冲池的组成

  • 具有相同类型的缓冲区连接成一个队列,三个队列:

① 空白缓冲队列emq

② 输入队列inq

③ 输出队列outq

  • 四个工作缓冲区:

① 用于收容输入数据的工作缓冲区

② 用于提取输入数据的工作缓冲区

③ 用于收容输出数据的工作缓冲区

④ 用于提取输出数据的工作缓冲区

(2)Getbuf过程和Putbuf过程

  • Getbuf过程—从缓冲队列取出一个缓冲区的过程
Void Get_buf(type) {
			Wait(RS(type));				//type是指缓冲队列的类型,RS是用来线程同步信号量,初始值是缓冲区的大小。
			Wait(MS(type));				//MS是用来互斥的信号量,保证缓冲队列的同一缓冲区只能被一个线程操作。
			B(number)=Take_buf(type);	//number是指缓冲队列对应的位置,这里是得到缓冲队列的缓冲区。得到之后可以用来读写数据,
			Signal(MS(type));			//发送互斥信号,对缓冲队列中的空间操作完成。
		}
  • Putbuf过程—从缓冲区插入对应缓冲队列的过程
Void Put_buf(type,work_buf) {
			Wait(MS(type));				//MS是用来互斥的信号量,保证缓冲队列的同一缓冲区只能被一个线程操作。
			Add_buf(type,work_buf);		//type是指缓冲队列的类型,work_buf代表工作缓冲区的类型。
			Signal(MS(type));			//发送互斥信号,对缓冲队列中的空间操作完成。
			Signal(RS(type));			//给对应类型的缓冲区发信号,代表返回缓冲队列的空间
		}

(3)缓冲区的工作方式

① 收容输入:把设备输入的数据放在缓冲区中

  • 首先从空缓队列取出一个缓冲区当作hin工作缓冲区,hin=Get_buf(emq)。把数据装入到hin中
  • 把得到的hin缓冲区放在inq缓冲队列。inq=Put_buf(inq,hin)。供给用户程序利用

② 提取输入:把缓冲区的数据交给用户程序处理

  • 把inq缓冲队列中的数据提取到sin工作缓冲区中,sin=Get_buf(inq)。供给用户提取数据
  • 提取完数据之后,把sin的工作缓冲区放回到emq空缓冲队列中。emq=Put_buf(emq,sin)

③ 收容输出:把用户程序处理完的数据放在缓冲区中

  • 先用工作缓冲区hout向空缓冲队列emq申请缓冲区,得到用户处理的数据,hout=Get_buf(emq)
  • hout的数据读取完毕之后,放在outq缓冲区中。Put_buf(outq,hout)供给外设读取

④ 提取输出

  • 先把要输出到设备的缓冲区中的数据放在sout工作缓冲区中。sout=Get_buf(outq)
  • 提取完sout的数据之后,把sout缓冲区放到空缓冲队列而emq中。emq=Put_buf(emq,sout)
8 磁盘存储器的性能和调度算法
8.1 磁盘性能简述

(1)数据的组织和格式

(2)磁盘的类型

常见:硬盘和软盘;单片盘和多片盘;固定头磁盘和活动头磁盘

(3)磁盘访问时间

有三部分组成:

① 寻找时间Ts :指的是把读写磁头移动到要求的磁道位置所需要的时间。这个时间除跨越n条磁道的时间外,还包括启动磁臂的时间s,即:Ts = m * n + s。m是与磁盘驱动器速度有关的常数,约为0.2ms,磁臂的启动时间约为2ms。

② 旋转延迟Tr :指的是在磁头到达所要求的磁道位置后,等待所要求的扇面旋转到磁头下方的平均时间。若平均来讲,所需要的扇面距磁头半圈远的距离,旋转延迟通常为旋转时间的一半。当前磁盘驱动器旋转速度所处的范围为每分钟3500转到10000转,因此旋转延迟的范围在3ms ~ 8.7ms内。 (以1w转为例,1w转耗时6wms, 1转耗时3ms, 其旋转延迟为3ms)

③ 传输时间Tt :从磁盘读出或向磁盘写入数据所经历的时间,这个时间取决于每次所读/写的字节数b和磁盘的旋转速度:Tt = b / (r * N)。式中,r为磁盘每秒钟的转数;N为一个磁道上的字节数。

8.2 早期的磁盘调度算法

(1)先来先服务FCFS

一种自然公平的调度策略。先来先到,无特权用户。FCFS算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法。

(2)最短寻道时间优先SSTF

要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但是不能保证平均寻道时间最短。

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

(1)扫描SCAN算法

距离最近,但又在同一边的磁道先访问完之后再访问另一个磁道

SSTF修改后可以防止低优先级进程出现饥饿现象

(2)循环扫描算法CSCAN

能获得较好的寻道性能,又能防止饥饿现象。

(3)NStepSCAN算法

(4)FSCAN算法

动头磁盘

(3)磁盘访问时间

有三部分组成:

① 寻找时间Ts :指的是把读写磁头移动到要求的磁道位置所需要的时间。这个时间除跨越n条磁道的时间外,还包括启动磁臂的时间s,即:Ts = m * n + s。m是与磁盘驱动器速度有关的常数,约为0.2ms,磁臂的启动时间约为2ms。

② 旋转延迟Tr :指的是在磁头到达所要求的磁道位置后,等待所要求的扇面旋转到磁头下方的平均时间。若平均来讲,所需要的扇面距磁头半圈远的距离,旋转延迟通常为旋转时间的一半。当前磁盘驱动器旋转速度所处的范围为每分钟3500转到10000转,因此旋转延迟的范围在3ms ~ 8.7ms内。 (以1w转为例,1w转耗时6wms, 1转耗时3ms, 其旋转延迟为3ms)

③ 传输时间Tt :从磁盘读出或向磁盘写入数据所经历的时间,这个时间取决于每次所读/写的字节数b和磁盘的旋转速度:Tt = b / (r * N)。式中,r为磁盘每秒钟的转数;N为一个磁道上的字节数。

8.2 早期的磁盘调度算法

(1)先来先服务FCFS

一种自然公平的调度策略。先来先到,无特权用户。FCFS算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法。

(2)最短寻道时间优先SSTF

要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但是不能保证平均寻道时间最短。

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

(1)扫描SCAN算法

距离最近,但又在同一边的磁道先访问完之后再访问另一个磁道

SSTF修改后可以防止低优先级进程出现饥饿现象

(2)循环扫描算法CSCAN

能获得较好的寻道性能,又能防止饥饿现象。

(3)NStepSCAN算法

(4)FSCAN算法

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

傲娇味的草莓

佛系少女只是想记录学习痕迹

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

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

打赏作者

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

抵扣说明:

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

余额充值