I/O系统是计算机系统的重要组成部分,是OS中最复杂且与硬件密切相关的部分
I/O系统的基本任务是完成用户提出的I/O请求,提高I/O速率以及改善I/O设备的利用率,方便高层进程对IO设备的使用
I/O系统包括用于实现信息输入、输出和存储功能的设备和相应的控制器(打印机扫描仪等IO设备、存储设备)
输入输出系统的主要功能有设备分配、设备处理、设备控制、虚拟设备、如何实现设备独立性、缓冲区管理。
7.1 I/O系统的功能、模型和接口
7.1.1 I/O系统的基本功能
隐藏物理设备的细节:对设备加以适当抽象,隐藏物理实现细节,仅向上层进程提供少量的抽象的读写命令
与设备的无关性:抽象的逻辑设备名来使用设备,而不用指明是哪一台设备,提高可移植性和适应性
提高处理机和I/O设备的利用率:让处理机和IO设备并行操作,CPU快速响应并且减少对IO请求的干预时间
对I/O设备进行控制:利用驱动程序对IO设备进行控制确保对设备的正确共享:独占设备和共享设备
错误处理:临时性错误和持久性错误
7.1.2 I/O系统的层次结构和模型
用户层软件:实现与用户交互的接口。用户可直接调用在I/O操作有关的库函数,对设备进行操
作。
设备独立性软件:实现与设备驱动器的统一接口、设备命名、设备的保护以及分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
设备驱动程序: 与硬件直接相关,负责实现系统对设备发出的操作指令,驱动I/O设备工作。
中断处理程序:保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完后再恢复被中断进程的现场后返回到被中断进程。
I/O系统中各种模块之间的层次视图
I/O系统的分层
①中断处理程序
处于I/O系统的底层,直接与硬件进行交互
②设备驱动程序
高层进程与设备控制器之间的通信程序,次底层。
功能:接收用户的I/O请求命令和参数,并将命令中的抽象要求转换为具体要求。
③设备独立性软件
IO软件独立于具体使用的物理设备,使得增加替换设备时,无需对IO软件进行修改,方便系统的更新扩展。
7.1.3 I/O接口
1.块设备接口
数据的存取和传输都是以数据块为单位的设备。基本特征是传输速率高、可寻址。磁盘设备的I/O常采用DMA方式。
块设备:速率高、可寻址
隐藏磁盘的二维结构:将抽象命令映射为低层操作。
虚拟存储器
2.流设备接口
字符设备:数据的存取和传输都是以字符为单位的设备。
基本特征是传输速率低、不可寻址,常采用中断驱动方式。大多数流设备属于独占设备,所以只能互斥共享。
get和put操作
常采用顺序存取方式,(用户程序)获取或输出字符的方法是采用get和put操作。
in-control指令
字符设备种类繁多,会提供一种通用的in-control指令其中包含了许多参数,每个参数表示一个与具体设备相关的特定功能。
3.网络通信接口
现代OS都提供了面向网络的功能,还需要通过某种方式把计算机连接到网络上。OS提供相应的网络软件和网络通信接口,使计算机能够通过网络与网络上的其他计算机通信或上网浏览。
7.2 I/O设备和设备控制器
7.2.1 I/O设备
1.I/O设备的类型
按操作特性
存储设备:存储信息,如磁盘等,存取速度慢、容量大、价格便宜。
I/O设备:输入、输出、交互式设备;用来向CPU传送信息或输出加工处理后的信息。
按传输速率分类
低速设备:每秒几个字节至数百字节
键盘、鼠标、语音输入输出设备等
中速设备:每秒数千至数万字节
行式打印机、激光打印机等
高速设备:每秒数百K至数十M字节
磁盘机、磁带机、光盘机等
3.按信息交换的单位分类
块设备(Block Device)
信息的存取总是以数据块为单位
可寻址(如,磁盘,盘块的大小为512 B~4 KB)
字符设备(Character Device)
基本单位是字符,不可寻址
如,交互式终端、打印机
4.按资源分配角度分类(共享属性)
独占设备
多数低速设备属独占设备,如打印机
共享设备
可供多个进程同时访问,如磁盘
虚拟设备
通过虚拟技术将一台独占设备变换为若干个逻辑设备,供若干个进程同时使用
5.按从属关系分类
系统设备
用户设备
7.2.2 设备控制器
CPU与I/O设备之间的接口
接收CPU发来的命令,控制一个或多个I/O设备工作,以实现I/O设备和计算机之间的数据交换,减轻CPU的负担,使处理机从繁杂的设备控制事务中解脱出来。
设备控制器是一个可编址的设备:一个或多个地址
设备控制器分类
控制字符设备的控制器
控制块设备的控制器
基本功能
接收和识别命令
控制寄存器能接收并识别处理机发来的多种命令通过相应的控制寄存器存放接收的命令和参数,并对其译码
数据交换
实现CPU与控制器、控制器与设备之间的数据交换,需设置数据寄存器
标识和报告设备的状态:需设置状态寄存器,记录设备的状态
地址识别
系统中的每一个设备都有一个地址,为了识别所控制的设备,需设置地址译码器
数据缓冲:暂存数据,解决I/O设备速率低的问题
差错控制:对I/O设备发送的数据进行差错检测,设置差错检测码
7.2.3 内存映像I/O
驱动程序将抽象的IO命令转换出的一系列具体命令、参数等数据装入设备控制器的相应寄存器,有控制器来执行这些命令,具体实施对IO设备的控制。
两种完成方法:
特定IO指令
内存映像IO:编址上不区分内存单元地址和设备控制器中的寄存器地址,通过范围来区分。可以统一对内存和对控制器的访问方法。
7.2.4 I/O通道
I/O通道(I/O Channel)设备:一种特殊处理机,具有执行IO指令的能力,并通过执行IO通道程序来控制IO操作。
有自己简单的指令系统:只有数据传送指令和设备控制指令
主要目的是为了建立独立的I/O操作,使有关对I/O操作的组织、管理及其结束处理也独立于CPU
CPU向I/O通道发送I/O命令,由通道执行程序,仅当通道完成规定的IO任务以后,才向CPU发出中断信号。
通道与一般处理机的区别:
指令单一
没有独立的内存
1.字节多路通道(Byte Multiplexor Channel)
以字节交换方式工作,分时并行操作,多个非分配型子通道,每个子通道连接一台IO设备主要用来连接多个中低速设备
2.数组选择通道(Block Selector Channel)
按数组方式进行数据传送工作,能高速传输数据可以连接多台高速设备,但是,仅含有一个分配型子通道,在一段时间内只能执行一个通道程序,控制一台I/O设备。由于设备独占使用,利用率较低。
3.数组多路通道(Block Multiplexor Channel)
将数组选择通道传输速率高和字节多路通道分时并行操作的优点相结合而形成的一种新通道。它含有多个非分配型子通道, 数据传送按数组方式进行因而这种通道既具有很高的数据传输速率,又能获得令人满意的通道利用率。
“瓶颈”问题
价格昂贵,所设置的通道数量较少;往往使它成了I/O的瓶颈,进而造成整个系统吞吐量的下降。
解决方法
增加设备到主机间的通路而不增加通道。即,把一个设备连接到多个控制器上,而一个控制器又连接到多个通道上。
7.2.5 I/O设备的控制方式
1.使用轮询的可编程I/O方式
CPU通过I/O测试指令测试设备接口中的状态位busy:
“忙”,则一直测试;
“闲”,进行数据传送,每次传送一个字符
是一种忙等方式。
适用场合:适用于没有中断机构的微机系统
存在的问题:CPU的绝大部分时间都处于等待I/O设备完成数据I/O的循环测试中。外设不能合理使用,也无法支持多道程序。
2.使用中断的可编程I/O方式
中断驱动(Interrupt Driven)方式,即当某进程要启动某个I/O设备工作时,便由CPU向相应的设备控制器发出一条I/O命令,然后立即返回继续执行原来的任务。
设备控制器按命令要求去控制指定的I/O设备,完成后,通过中断向CPU发送一中断信号。在I/O设备输入输出数据的过程中,无须CPU干预,每次传送一个字符。
CPU与IO设备可以并行操作
适用场合:适用于低速设备I/O,并可配合DMA和通道方式实现I/O。
存在的问题:在每个数据传送完后中断CPU
3.直接存储器访问方式(DMA)
①特点:
数据传输的基本单位是数据块
所传送的数据是从设备直接送入内存的,或者相反仅在传送一个或多个数据块的开始和结束时才需CPU干预
除了具有中断机构外,还增加了DMA控制器
数据传送方向、存放数据的内存地址及传送数据长度需CPU控制
每个设备需配置一个DMA控制器
②DMA控制器由三个部分组成:
主机与DMA控制器的接口
DMA控制器与块设备的接口
IO控制逻辑
DR:暂存从设备到内存/内存到设备的数据
MAR:
输入:数据存放到内存的起始目标地址
输出:存放数据由内存到设备的内存源地址
DC:存放本次CPU要读或写的字(节)数
CR:
接收CPU发送的I/O命令
有关控制信息
设备状态
③DMA工作过程:
向磁盘控制器发送一条命令,送入命令寄存器CR,将本次要读入数据在内存中的其实目标地址送入MAR内存地址寄存器,还要把数据字节数送入DC数据计数器中,同时将磁盘中的源地址直接送入DMA控制器的IO控制逻辑。
然后,启动DMA控制器进行数据传送,CPU便转去处理其他事务。整个数据传送过程由DMA控制器进行控制。
读入一个字节的数据后送入数据寄存器DR,将他送入MAR地址寄存器所指示的存储单元,MAR加1,DC减1,进行判断看数据是否传送完毕。
适用场合:适用于高速外设I/O,一次可以在外设与内存之间传输一个或多个数据快,传输完毕后才需CPU干预。
存在的问题:传送方向、始址、长度等由CPU控制,一个设备一个DMA,成本高。
DMA与中断方式的主要区别:
中断方式在每个数据传送完后中断CPU,DMA方式则是在所要求传送的一批数据全部传送完时中断CPU,进一步减少了CPU对IO设备的干预。
中断方式的数据传送时在中断处理时由CPU控制完成的,而DMA则是在DMA控制器的控制下完成的。
4. I/O通道控制方式
I/O通道控制方式的引入进一步减少了CPU的干预,把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。一个通道控制多台设备,CPU仅在I/O操作的开始和结束时花费少量时间处理与I/O有关的工作。可实现CPU、通道和I/O设备三者的并行操作,从而更有效地提高整个系统的资源利用率
通道程序(了解)
指令格式:操作码,P,R,计数,内存地址
操作码:规定指令所执行的操作,如读、写、控制等
内存地址:标明字符送入内存或从内存取出的内存首址
计数:本条指令所要读/写的字节数
通道程序结束位:标识通道程序是否结束,P=1表示结束
记录结束标志
R=0,表示本指令与下一指令处理同一个记录
R=1,表示处理某记录的最后一条指令
适用场合:
系统预先要将I/O的过程实现为一段通道程序,置于内存的特定位置,而后启动通道。
由通道负责执行通道程序对外设进行I/O控制,CPU转其他程序运行。
存在的问题:
需要通道硬件,成本高。
7.3 中断机构和中断处理程序
中断是多道程序得以实现的基础,是设备管理的基础,是实现CPU与IO设备并行的基础。
中断处理是IO系统中的最低层,是整个IO系统的基础。
7.3.1 中断简介
1.中断和陷入
中断:(外中断)CPU硬件有一条中断请求线(interrupt-request line, IRL),由I/O设备触发。设备控制器通过中断请求线发送信号而引起中断,CPU捕获中断并派遣到中断处理程序,中断处理程序通过处理设备来清除中断。
陷入:(内中断)CPU内部事件所引起的中断。若系统发现有陷入事件,CPU也将暂停正在执行的程序,转去执行该事件的处理程序。
区别:信号的来源。
2.中断向量表和中断优先级
中断向量表:为了处理上的方便,为每种设备配以相应的处理程序,并把该程序的入口放置在一个二维表(中断号,入口地址)中。
中断优先级:
每个中断源对服务要求的紧急程度并不相同。
能够使CPU延迟处理低优先级中断而不屏蔽所有中断,这也可以让高优先级中断抢占低优先级中断处理。
对中断源的处理方式:
屏蔽中断。中断分为非屏蔽中断和可屏蔽中断。
嵌套中断。
7.3.2 中断处理程序
1.I/O中断处理程序的基本工作:
保留现行进程的执行现场;
通知等待该I/O操作完成的进程;
最终转入进程调度程序进行重新调度。
2.工作步骤
唤醒被阻塞的驱动(程序)进程
保护被中断进程的CPU环境
转入相应的设备处理程序
中断处理
恢复被中断进程的现场
7.4 设备驱动程序
7.4.1 设备驱动概述
设备处理程序又称为设备驱动程序,是I/O进程与设备控制器之间的通信程序:接收上层软件发来的抽象IO要求,再把它转换为具体要求后发给设备控制器,启动设备去执行,反之,也将由设备控制器发来的信号传给上层软件。
每一类设备应配置一种驱动程序
设备驱动程序的功能:
接收用户的I/O请求命令和参数,并将命令中的抽象要求转换为具体要求。
检查用户I/O请求的合法性,了解I/O设备的状态,传递有关参数,设置设备的工作方式。
发出I/O命令并检查设备状态,空闲则启动I/O完成指定的操作,忙碌则将请求者的请求块挂到相应设备的I/O请求队列。
及时响应由控制器或通道发来的中断请求并处理。
若计算机系统设置有通道,则驱动程序根据用户的I/O请求,自动地构成通道程序。
设备驱动程序的特点:
驱动程序主要是指在请求I/O的进程与设备控制器之间的一个通信和转换程序:将抽象的IO请求转换为具体的IO操作后传给控制器。
驱动程序与设备控制器和I/O设备的硬件特性紧密相关: 因而对不同类型的设备应配置不同的驱动程序。
驱动程序与I/O设备所采用的I/O控制方式紧密相关:中断驱动和DMA方式。
由于驱动程序与硬件紧密相关:其中的一部分必须用汇编语言书写,很多驱动已经部分固化在ROM中驱动程序应允许可重入。一个正在运行的驱动程序常会在一次调用完成前被再次调用。
设备处理方式:
为每一类设备设置一个进程,专门用于负责该类设备的驱动工作(I/O操作)。为每台设备建立一个设备驱动进程,它们分别负责专门设备的驱动工作。同类设备的各驱动进程共享该类设备的设备驱动程序。
在整个系统中设置一个I/O进程,统一负责所有设备的驱动工作。专门用于执行系统中所有各类设备的I/O操作。不设置专门的设备处理进程,而只为各类设备设置相应的设备处理程序(模块), 供用户进程或系统进程调用。
7.4.2 设备驱动程序的处理过程
将抽象要求转换为具体要求。设置控制器中的寄存器。
检查I/O请求的合法性。若请求的设备不支持本次的I/O请求,认为是非法操作。
读出和检查设备的状态 。检查设备是否空闲或就绪。
传送必要的参数 。如数据量、起始地址等
设置工作方式。对于有多种工作方式的设备进行设置启动I/O设备。
多道程序系统中,驱动程序一旦发出IO命令,启动IO操作以后,驱动程序就把控制返回给IO系统,将自己阻塞起来,直到中断到来时将其唤醒,具体的IO操作在设备控制器的控制下进行,实现IO设备与CPU的并行操作。
7.4.3 设备驱动程序的框架
1.设备驱动程序与外界的接口
设备驱动程序与OS内核接口、
设备驱动程序与系统引导的接口、
设备驱动程序与设备的接口
2.设备驱动程序的组成
设备驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断与轮询
7.5 与设备无关的I/O软件
7.5.1 与设备无关软件的基本概念
用物理设备名使用设备
进程以物理设备名提出I/O请求
采用单通路I/O系统结构,容易产生瓶颈
进程直接与物理设备相关非常不灵活
引入逻辑设备名
逻辑设备是抽象的设备名。
通过逻辑设备和物理设备来共同使用设备。
在应用程序中,用逻辑设备名称来请求使用某类设备;而系统在实际执行时,使用物理设备名称。
逻辑设备名到物理设备名映射
应用程序中使用的是逻辑地址,在系统分配使用内存的时候使用物理地址
采用逻辑设备表。
7.5.2 与设备无关的软件共有操作
设备驱动程序的统一接口:无论何种设备,它们向用户所提供的接口应该是相同的。
缓冲管理:即对字符设备和块设备的缓冲区进行有效的管理,以提高I/O的效率;
差错控制:只处理那些设备驱动程序无法处理的错误;
对独立设备的分配与回收:独占设备和共享设备
独立于设备的逻辑块:数据块大小不一致、数据交换单位不同、数据传输速率不同等差异性
可以通过设备独立性软件隐藏这些差异,向高层软件提供大小统一的逻辑数据块
7.5.3 设备分配与回收
1.设备分配中的数据结构:
每个设备一张,记录本设备的情况。
一个控制器一张、一个通道一张。
整个系统一张,记录已被连接到系统中的所有物理设备的情况。
2.设备分配时应考虑的因素
①设备的固有属性
独占性
一段时间内,只允许一个进程独占,大多数低度速I/O设备都属于独享设备。
共享性
允许多个进程同时共享,如磁盘、磁鼓之类的外存储器,既具有很能大的存储容量,其定位操作的时间又短。
可虚拟性
独占设备经某种技术处理,改造成虚拟设备,把一台输入机虚拟为几台“虚拟”的输入机。例如:为了提高设备利用率引入了脱机输入输出或采用SPOOLing技术,变一台为“多台设备”。
②设备分配算法
先来先服务
优先级高者优先
③设备分配中的安全性
安全分配方式
每当进程发出I/O请求后,便进入阻塞状态,I/O操作完成后唤醒
优点:摒弃了 “请求和保持”条件,不会产生死锁
不安全分配方式
进程发出I/O请求后仍继续运行,继续申请I/O设备
优点:可操作多个设备,推进迅速
1.独占设备的分配程序
①基本的设备分配程序
分配设备、分配控制器、分配通道
只有在设备、控制器和通道三者都分配成功时,设备分配才算成功
基本分配程序的问题:
进程以物理设备名提出I/O请求
采用单通路I/O系统结构,容易产生瓶颈
改进:
增加设备独立性:通过逻辑设备名请求IO
7.5.4 逻辑设备名到物理设备名映射的实现
1.逻辑设备表(LUT,Logical Unit Table)
将应用程序中所使用的逻辑设备名映射为物理设备名。每个表目中包含:逻辑设备名、物理设备名和设备驱动程序的入口地址。
2.逻辑设备的设置问题
整个系统中只设置一张LUT。所有用户都使用不相同的逻辑设备名。在多用户环境下这通常是难以做到的,这种方式主要用于单用户系统中。
每个用户设置一张LUT。用户登录时,便为该用户建立一个进程,同时也为之建立一张LUT,并将该表放入进程的PCB中。在多用户系统中,通常都配置系统设备表。
7.6 用户层的I/O软件
7.6.1 系统调用和库函数
1.系统调用
提供了进程与操作系统之间的接口
通常以汇编语言指令的形式提供;
有些语言(如C, C++)已经取代了汇编语言而直接用于系统编程。
应用程序可以通过它间接调用OS中的IO过程,对设备进行操作;
系统调用是应用程序取得OS所有服务的唯一途径;
系统调用的实现对调用者是透明的。
2.库函数
在许多现代操作系统中,系统调用本身已经采用C语言编写,并以函数形式提供,所以在使用C语言编写的用户程序中,可以直接使用这些系统调用。
内核提供了OS的基本功能,库函数扩展了OS内核,使用户能方便取得操作系统的服务。
7.6.2 假脱机(SPOOLing)系统
1.SPOOLing技术
早期,为了缓和CPU的高速性与I/O设备低速性间的矛盾而引入了脱机输入、脱机输出技术。
在多道程序环境下,其中的一道程序模拟脱机输入输出时的外围控制机功能。
在主机的直接控制下,实现脱机输入、 输出功能,此时的外围操作与CPU对数据的处理同时进行。
在联机情况下实现的同时外围操作称为SPOOLing(Simultaneaus Periphernal Operating On-Line),或称为假脱机操作。(是对脱机输入输出的模拟)
建立在通道技术和多道程序技术的基础之上。
2.SPOOLing系统的组成
输入井和输出井:在磁盘上的两个存储空间
输入井模拟脱机输入,暂存输入数据
输出井模拟脱机输出,暂存输出数据
输入缓冲区和输出缓冲区:内存中开辟的缓冲区:用来缓和CPU与磁盘之间的速度的矛盾
输入进程SPi和输出进程SPo:模拟脱机I/O时的外围控制机
井管理程序:控制作业与磁盘井之间信息的交换。
3.SPOOLing 系统工作原理
作业执行前预先将程序和数据输入到输入井中;
作业运行后,使用数据时,从输入井中取出;
作业执行不必直接启动外设输出数据,只需将这些数据写入输出井中;
作业全部运行完毕,再由外设输出全部数据和信息。
4. SPOOLing系统的特点
(1)提高了I/O的速度。从对低速I/O设备进行的I/O操作,演变为对输入井或输出井中数据的存取,提高了I/O速度,缓和了CPU与低速I/O设备之间速度不匹配的矛盾。
(2)将独占设备改造为共享设备。在假脱机打印系统中,实际上并没为任何进程分配设备,而只是在输入井或输出井中为进程分配一个存储区和建立一张I/O请求表。
(3)实现了虚拟设备功能。宏观上,虽然是多个进程在同时使用一台独占设备,而对于每一个进程而言,他们都会认为自己是独占了一个设备。当然,该设备只是逻辑上的设备。
5.假脱机打印机系统
打印机为独占设备,利用SPOOLing技术,可将之改造为共享设备
用户请求打印时,SPOOLing系统处理如下:
由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中。输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中, 再将该表挂到请求打印队列上。
主要有以下三部分:(1) 磁盘缓冲区。(2) 打印缓冲区。(3) 假脱机管理进程和假脱机打印进程。
6.SPOOLing技术、守护进程
网络文件传送
先把文件送到网络SPOOLing目录,然后网络值班进程把它取出并传递到目标地址
Internet电子邮件系统
为了寄邮,调用电子邮件程序
待发信存在SPOOLing中供以后传输
将独占设备改造为共享设备时,需要为这个设备配置一个守护进程和一个假脱机文件队列。守护进程是允许使用该独占设备的唯一进程。
7.7 缓冲区管理
缓冲区是一个存储区域,可以由专门的硬件寄存器组成,成本高,容量小。一般情况下更多的是利用内存作为缓冲区,缓冲区的管理就是组织管理好这些缓冲区。
7.7.1 缓冲的引入
数据到达速率与其离去速率不同,缓和CPU与I/O设备间速度不匹配的矛盾。
减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
解决数据粒度不匹配问题,提高CPU和I/O设备之间的并行性,提高系统的吞吐量和设备的利用率。
7.7.2 单缓冲区和双缓冲区
单缓冲区(Single Buffer)
双缓冲区(Double Buffer)
为了加快输入和输出速度,提高设备利用率,引入双缓冲区(缓冲对换)。
两台机器间通信:
7.7.3 环形缓冲区
1.环形缓冲区的引入
当输入与输出速度基本匹配时,双缓冲能获得较好效果;当速度相差较大时,可引入多个(大小相等)缓冲,组织成循环缓冲的形式
2.环形缓冲区的组成
多个缓冲区
用于装输入数据的空缓冲区R
已装满数据的满缓冲区G
计算进程正在使用的现行工作缓冲区C
多个指针
指示计算进程下一可用缓冲区Nextg
指示输入进程下一可用空缓冲区Nexti
指示计算进程正在使用的缓冲区Current
3.环形缓冲区的使用
Getbuf过程
为计算进程和输入进程提供缓冲区,并移动指针
Releasebuf过程
当计算进程或输入使用完缓冲区后,调用过程将缓冲区释放
4.进程同步——输入、计算进程并行
Nexti指针追赶上Nextg指针
输入进程速度大于计算进程,全部空缓冲区已满,无可用缓冲区,输入进程阻塞(系统受计算限制)
Nextg指针追赶上Nexti指针
计算进程速度大于输入进程,全部缓冲区空,无可用数据,计算
进程阻塞(系统受I/O限制)
7.7.4 缓冲池(Buffer Pool)
1.缓冲池的组成
专用缓冲的利用率不高,与环形缓冲不同的是缓冲池中的缓冲区是系统的公用资源,可供多个进程共享,既能用于输入,也能用于输出;缓冲区仅仅是一组内存块的链表;缓冲池则包含了一个管理的数据结构及一组操作函数的管理机制,用于管理多个缓冲区。
2.缓冲区类型
空(闲)缓冲区
装满输入数据的缓冲区
装满输出数据的缓冲区
3.缓冲队列:按其使用情况
空缓冲队列emq
输入队列inq
输出队列outq
4.缓冲池的组成
四种工作缓冲区
用于收容输入数据的工作缓冲区(hin)
用于提取输入数据的工作缓冲区(sin)
用于收容输出数据的工作缓冲区(hout)
用于提取输出数据的工作缓冲区(sout)
5.缓冲区操作过程
队列是临界资源
互斥信号量MS,每个队列一个MS(type),使进程能互斥地访问缓冲池队列
资源信号量RS ,每个队列一个RS(type)
Getbuf(type),type:队列类型
Putbuf(type,number),number:缓冲区编号
Procedure Getbuf(type)
begin
Wait(RS(type));
Wait(MS(type));
B(number):=Takebuf(type); //从队首摘下一个缓冲区
Signal(MS(type));
end
Procedure Putbuf(type, number)
begin
Wait(MS(type));
Addbuf(type, number); //将指定缓冲区挂在type队列上
Signal(MS(type));
Signal(RS(type));
end
7.8 磁盘存储器的性能和调度
7.8.1 磁盘性能简述
1. 数据的组织和格式
磁盘存储器是计算机系统中最重要的存储设备,在里面放了大量的文件。
磁盘设备可包括一或多个物理盘片,每个磁盘片分一个或两个存储面。
每个磁盘面被组织成若干个同心环,这种环称为磁道(Track)),磁道之间留有必要的间隙(Gap) 。
为使处理简单起见,在每条磁道上可存储相同数目的二进制位。显然内层磁道的密度较外层磁道的密度高。磁盘密度即每英寸中所存储的位数。每条磁道又被逻辑上划分成若干个扇区(Sectors),各扇区之间保留一定的间隙。
一个物理记录存储在一个扇区上,磁盘上存储的物理记录块数目是由扇区数、磁道数以及磁盘面数所决定的。
例如,一个10 GB容量的磁盘,有8个双面可存储盘片,共16个存储面,每面有16383个磁道,63个扇区。
2.磁盘访问时间
寻道时间:磁头移动到指定磁道上所花的时间旋转延迟时间:指定扇区移动到磁头下面所花的时间
传输时间:把数据从磁盘中读出或者向磁盘写入数据所花的时间
寻道时间和旋转延迟时间与所读写的数据无关,并且占了访问时间中的大部分。
7.8.2 早期的磁盘调度算法
当多个进程都要求访问磁盘时,应采取一种调度算法,使它们对磁盘的平均访问时间最小。由于访问磁盘时间中,主要是寻道,因此磁盘调度的目标是使磁盘的平均寻道时间最少。
1.先来先服务(FCFS,First Come First Served)
最简单的磁盘调度算法。根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。
仅适用于请求磁盘I/O的进程数目较少的场合。
2.最短寻道时间优先(SSTF,Shortest Seek Time First)
该算法选择这样的进程:其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。但是这种算法不能保证平均寻道时间最短。
SSTF算法的平均每次磁头移动距离明显低于FCFS的距离,因而SSTF较之FCFS有更好的寻道性能,曾一度被广泛采用。
7.8.3 基于扫描的磁盘调度算法
1. 扫描(SCAN)算法
SSTF算法的实质是基于优先级的调度算法,在对SSTF算法略加修改后所形成的SCAN算法,则可防止低优先级进程出现“饥饿”现象。
该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。这时,同样也是每次选择这样的进程来调度,即要访问的磁道在当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问。由于在这种算法中磁头移动的规律颇似电梯的运行,因而又常称之为电梯调度算法。
2. 循环扫描(CSCAN)算法
SCAN也存在问题:当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。
为了减少这种延迟,CSCAN算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问的磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。
SSTF、SCAN、CSCAN调度算法都可能会出现“磁臂粘着”现象,即一个或几个进程反复请求对某一磁道的I/O操作,从而垄断了整个磁盘设备。在高密度磁盘上容易出现此情况。
N步SCAN算法是将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS算法依次处理这些子队列。而每处理一个队列时又是按SCAN算法,对一个队列处理完后,再处理其他队列。当正在处理某子队列时,又出现新的磁盘I/O请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。
3.FSCAN算法
实质上是N步SCAN算法的简化。
FSCAN只将磁盘请求队列分成两个子队列。一个是由当前所有请求磁盘I/O的进程形成的队列,由磁盘调度按SCAN算法进行处理。
在扫描期间,将新出现的所有请求磁盘I/O的进程,放入另一个等待处理的请求队列。这样,所有的新请求都将被推迟到下一次扫描时处理。