输入输出系统
I/O子系统概述:
I/O设备种类繁多,功能和传输速率差异巨大,需要多种方法来进行设备控制。这些方法共同组成了操作系统内核的I/O子系统,它讲内核的其他方面从繁重的I/O设备管理中解放出来。I/O核心子系统提供的服务主要有I/O调度(完成用户提出的I/O请求,提高I/O速率,改善I/O设备的利用率)(基本任务)、(缓冲与高速缓存、设备分配与回收、假脱机、设备保护)(设备管理的主要功能:还有保证设备的独立性等)和差错处理等。
CPU和主存通过总线与适配器/接口部件连接,然后连接输入设备控制器、输出设备控制器、外存设备控制器、通信控制器(数据通信设备)、过程控制器(过程控制I/O设备)等多种控制器部件。
如图:
设备处理:通过相应的设备处理程序实现CPU和设备控制器之间的通信。
主要功能:
(1)监视设备状态,记录所有设备、控制器状态,便于有效地管理和调度分配。
(2)进行设备分配,按照设备类型和分配算法实施分配(大中型计算机还要分配控制器和通道)
(3)完成I/O操作(由设备驱动程序完成)
(4)缓冲管理和地址转换。对缓冲区进行管理,减少CPU中断次数,将用户程序中的逻辑设备转换成物理设备的地址。
I/O系统的功能、模型和接口
- I/O系统的基本功能
- I/O系统的层次结构和模型
I/O系统的层次结构:
用户层软件:产生I/O请求、格式化I/O、Spooling,用户可直接调用在用户层提供的、与I/O操作有关的库函数对设备进行操作。
设备独立性软件:映射、保护、分块、缓冲、分配,用于实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
设备驱动程序:设置设备寄存器;检查状态。与硬件直接相关,用于具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。
中断处理程序:用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完后再恢复被中断进程的现场后,返回到被中断进程。
硬件:执行I/O操作(设备驱动程序不需要经过中断处理程序,直接到达I/O)
- I/O系统接口:
1.块设备接口:是块设备管理程序与高层之间的接口。
⑴块设备:数据的存取和传输都是以数据块为单位的设备。基本特征是传输速率较高、可寻址。磁盘设备的I/O常采用DMA方式。
⑵隐藏了磁盘的二维结构:块设备接口隐藏了磁盘地址是二维结构的情况:每个扇区的地址需要用磁道号和扇区号来表示。
⑶将抽象命令映射为低层操作:块设备接口将上层发来的抽象命令,映射为设备能识别的较低层具体操作。
2.流设备接口:是流设备管理程序与高层之间的接口,又称字符设备接口。
⑴字符设备:数据的存取和传输是以字符为单位的设备。如键盘、打印机等。基本特征是传输速率较低、不可寻址,常采用中断驱动方式。
⑵get和put操作:由于字符设备是不可寻址的,因而对它只能采取顺序存取方式。(用户程序)获取或输出字符的方法是采用get和put操作。
⑶in-control指令:因字符设备的类型非常多,且差异甚大,系统以统一的方式提供了一种通用的in-control指令来处理它们。
I/O设备和设备管理器
硬件设备:I/O设备通常包括一个机械部件和一个电子部件。为了达到设计的模块性和通用性,一般将其分开:电子部件称为设备控制器(或适配器),在个人计算机中,通常是一块插入主板扩充槽的印刷电路板;机械部件则是设备本身。
设备控制器的组成:
设备控制器通过寄存器与CPU通信,在某些计算机上,这些寄存器占用内存地址的一部分,称为内存映像I/O;另一些计算机则釆用I/O专用地址,寄存器独立编址。操作系统通过向控制器寄存器写命令字来执行I/O功能。控制器收到一条命令后,CPU可以转向进行其他工作,而让设备控制器自行完成具体的I/O操作。当命令执行完毕后,控制器发出一个中断信号,操作系统重新获得CPU的控制权并检查执行结果,此时,CPU仍旧是从控制器寄存器中读取信息来获得执行结果和设备的状态信息。
补充:
IO端口:
每个连接到I/O总线上的设备都有自己的I/O地址集,即所谓的I/O端口(I/O port)。在IBM PC体系结构中,I/O地址空间一共提供了65,536个8位的I/O端口。可以把两个连续的8位端口看成一个16位端口,但是这必须是从偶数地址开始。同理,也可以把两个连续的16位端口看成一个32位端口,但是这必须是从4的整数倍地址开始。有四条专用的汇编语言指令可以允许CPU对I/O端口进行读写:它们分别是in、ins、out和outs。在执行其中的一条指令时,CPU使用地址总线选择所请求的I/O端口,使用数据总线在CPU寄存器和端口之间传送数据。
I/O端口还可以被映射到物理地址空间:因此,处理器和I/O设备之间的通信就可以直接使用对内存进行操作的汇编语言指令(例如,mov、and、or等等)。现代的硬件设备更倾向于映射I/O,因为这样处理的速度较快,并可以和DMA结合起来使用。也就解释了为什么32位系统名义上支持4G内存,实际上你装上4G内存条在机器上是不行了。因为访问不到4G,还需要为显卡,声卡等设备提供物理地址的映射。
系统设计者的主要目的是提供对I/O编程的统一方法,但又不牺牲性能。为了达到这个目的,每个设备的I/O 端口都被组织成一组专用寄存器。CPU把要发给设备的命令写入控制寄存器(control register),并从状态寄存器(status register)中读出表示设备内部状态的值。CPU还可以通过读取输入寄存器(input register)的内容从设备取得数据,也可以通过向输出寄存器(output register)中写入字节而把数据输出到设备。
在采用中断I/O 方式控制打印输出的情况下,CPU 和打印控制接口中的I/O 端口之间交换的信息不可能是(B )
A.打印字符 B.主存地址
C.设备状态 D.控制命令
I/O端口编址方式:
独立编址:利用特定的I/O指令访问I/O端口;
统一编址:内存映像I/O,对内存和控制器统一访问方法,简化了I/O的编程。
状态端口和控制端口可以合用同一个寄存器 (T)
I/O接口中CPU可访问的寄存器称为I/O端口(T)
I/O端口地址是指设备接口寄存器的地址(T)
I/O通道:
字节多路通道,数组选择通道,数组多路通道:
中断机构和中断处理程序
为什么采用中断处理:
重要事件的及时处理;
异常事件的及时处理;
实现CPU与低速外部设备的速度匹配与并行工作。
按中断源的不同,中断分为内中断(软中断)和外中断(硬中断)。
硬中断(外中断)指来自CPU执行指令以外的事件的发生;
软中断(内中断、异常、陷入)指源自CPU执行指令内部的事件。
中断优先级是由硬件规定的,若要调整中断响应次序可通过中断屏蔽实现。
①中断:中断是来自处理器外部的请求事件。
②异常:异常是指令执行过程中在处理器内部发生的特殊事件。
③陷入:由处理器内部事件所引起的特殊中断(trap)。
中断和异常、陷入的主要区别:是信号的来源不同。
中断(外中断),异常与陷入(内中断)
(内部异常(内中断)可分为故障(fault)、陷阱(trap)和终止(abort)三类。)
中断向量表:为每种设备配以相应的中断处理程序,并把该程序的入口地址,放在中断向量表的一个表项中,并为每一个设备的中断请求,规定一个中断号,它直接对应于中断向量表的一个表项中。
①屏蔽(禁止)中断:所有中断都将按顺序依次处理。当处理机正在处理一个中断时,将屏蔽掉所有新到的中断,让它们等待,直到处理机已完成本次中断的处理后,处理机再去检查并处理。优点是简单,但不能用于对实时性要求较高的中断请求。
②嵌套中断:在设置了中断优先级的系统中,通常按这样的规则来进行优先级控制:
当同时有多个不同优先级的中断请求时,CPU优先响应最高优先级的中断请求;
高优先级的中断请求,可以抢占正在运行低优先级中断的处理机,该方式类似于基于优先级的抢占式进程调度。
中断与程序并发之间的关系是什么?
答:
中断是程序并发的前提条件。
如果没有中断,操作系统不能获得系统控制权,无法按调度算法对处理机进行重新分配,一个程序将一直运行到结束而不会被打断。
中断处理和子程序调用都需要压栈以保护现场,中断处理一定会保存而子程序调用不需要保存其内容的是(B) 。
A.程序计数器 B.程序状态字寄存器
C.通用数据寄存器 D.通用地址寄存器
程序状态字寄存器PSW处于核心态,用户态是不能访问的。
程序状态字主要用于标明处理机的工作状态,而子程序调用无需改变状态,因此无需保存。
设备驱动程序
对I/O设备控制方式的转变:
- 轮询方式
- 中断控制
- DMA直接访存
- 通道控制方式:通道是通过执行通道程序,并与设备控制器共同实现对I/O设备的控制的。CPU只需给出通道程序首址和要访问I/O设备即可。
中断控制方式与DMA直接访存方式对比:
DMA方式较之中断驱动方式,又进一步提高了CPU与I/O设备的并行操作程度。
为了实现在主机与控制器之间,成块数据的直接交换,必须在DMA控制器中,设置如下四类寄存器:
①命令/状态寄存器CR;
②内存地址寄存器MAR;
③数据寄存器DR;
④数据计数器DC。
系统将数据从磁盘读到内存的过程包括以下操作:
①DMA控制器发出中断请求
②初始化DMA控制器并启动磁盘
③从磁盘传输一块数据到内存缓冲区
④执行”DMA结束”中断服务程序
正确的执行顺序是:(B)
A.③à①à②à④ B. ②à③à①à④
C.②à①à③à④ D. ①à②à④à③
对比上图,DMA控制器共发出过一次中断请求即在数据传送完毕,字计数寄存器=0的时候,然后执行DMA结束中断该服务程序(该服务程序执行完毕)
DMA方式:对需多个离散块的读取仍需要多次中断。
通道地址字 CAW:记录通道程序在内存中的地址
通道命令字 CCW:保存正在执行的通道指令
通道状态字 CSW:存放通道执行后的返回结果
通道数据字 CDW:存放传输数据
通道和CPU共用内存,通过周期窃取方式取得
通常把通道程序的执行情况记录在(D )中
A. PSW B. PCB
C. CAW D. CSW
与设备无关的I/O软件
设备独立性是指用户程序独立于具体使用的物理设备的一种特性。
用户程序发出磁盘 I/O 请求后,系统的处理流程是:用户程序→系统调用处理程序→设备驱动程序→中断处理程序。其中,计算数据所在磁盘的柱面号、磁头号、扇区号的程序是(C)。
A. 用户程序 B. 系统调用处理程序
C. 设备驱动程序 D. 中断处理程序
为磁盘读操作计算磁道、扇区和磁头应该在驱动程序中完成
向设备寄存器写命令应该在设备驱动程序中完成
检查用户是否可以使用设备应该在无关软件层完成(检查用户是否可以使用设备属于设备保护,因此在设备独立性软件中完成,设备驱动程序只检查I/O请求的合法性,而设备独立性软件禁止用户直接访问设备,用户只能通过驱动程序访问设备。)
将二进制整数转换为可打印的ASCII字符应该由用户层I/O完成
设备分配:
系统设备表SDT:系统范围的数据结构,记录系统中全部设备的情况,每个设备占一个表目。
设备控制表DCT:为每一个设备配置一张,记录设备的情况。
控制器控制表COCT:为每一个控制器都设置一张,记录控制器的使用情况。
通道控制表CHCT:为每一个通道都设置一张,记录通道的使用情况。
设备的固有属性:独占设备、共享设备、虚拟设备的分配策略。
设备分配算法:先来先服务、优先级高者优先。
设备分配中的安全性:安全、不安全分配方式。
设备分配:
1)基本的设备分配程序:
当某进程提出I/O请求后,系统的设备分配程序,可按下述步骤进行设备分配:
⑴分配设备:首先根据I/O请求中的物理设备名,查找系统设备表SDT,从中找出该设备的DCT,再根据DCT中的设备状态字段,可知该设备是否正忙。若忙,便将请求I/O的进程的PCB,挂在设备队列上。否则,便按照一定的算法,计算本次设备分配的安全性。如果不会导致系统进入不安全状态,便将设备分配给请求进程。否则,仍将其PCB插入设备等待队列。
⑵分配控制器:在系统把设备分配给请求I/O的进程后,再到其DCT中找出与该设备连接的控制器的COCT,从COCT的状态字段中可知该控制器是否忙碌。若忙,便将请求I/O进程的PCB,挂在该控制器的等待队列上。否则,便将该控制器分配给进程。
2)设备分配程序的改进:
上述分配过程,进程是以物理设备名提出I/O请求的。
如果所指定的设备已分配给其它进程,则分配失败,不具有与设备无关性。
为此,进程应使用逻辑设备名请求I/O。
首先从SDT中,找出第一个该类设备的DCT。若该设备忙,又查找第二个该类设备的DCT,仅当所有该类设备都忙时,才把进程挂在该类设备的等待队列上。而只要有一个该类设备可用,系统便进一步计算分配该设备的安全性。如安全,便可把设备分配给它
逻辑设备表(LUT)(Logical Unit Table):
1.逻辑设备表LUT(Logical Unit Table)
为了实现与设备的无关性,当应用程序请求使用I/O设备时,应当用逻辑设备名。
但系统只识别物理设备名,因此在系统中需要配置一张逻辑设备表,用于将逻辑设备名映射为物理设备名。
2.逻辑设备表的设置问题
⑴在整个系统中只设置一张LUT,这种方式主要用于单用户系统中。
⑵为每个用户设置一张LUT:每当用户登录时,系统便为该用户建立一个进程,同时也为之建立一张LUT,并将该表放入进程的PCB中。由于通常在多用户系统中,都配置了系统设备表,图 (b)中所示。
用户层的I/O软件:
实现与用户交互的接口,用户可直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行操作。
系统调用与库函数:
系统调用是操作系统为了扩充机器功能、增强系统能力、方便用户使用而在内核中建立的系统程序(过程),通常运行在系统态。用户程序或其他系统程序通过系统调用就可以访问系统资源,调用操作系统功能,它是用户程序或其他系统程序获得操作系统服务的唯一途径。
库函数是程序设计语言中,把常用的功能编写成函数。放在函数库中供用户编程时使用。库函数仍属用户程序而非系统程序,运行时仍在用户态而非系统态。
许多库函数都使用系统调用来实现功能;
没有使用系统调用的库函数,执行效率通常比使用的高,因为使用系统调用时,需要上下文的切换及处理机状态的转换。
SPOOLing技术(假脱机技术):
当系统中引入了多道程序技术后,完全可以利用其中的一道程序,来模拟脱机输入时的外围控制机功能,把低速I/O设备上的数据传送到高速磁盘上。
再用另一道程序,模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。
这样,便可在主机的直接控制下,实现以前的脱机输入、输出功能。
此时的外围操作与CPU对数据的处理同时进行,我们把这种在联机情况下实现的同时外围操作的技术,称为假脱机技术。
(1)提高了I/O的速度。
(2)将独占设备改造为共享设备。
(3)实现了虚拟设备功能。
共享性:
打印机属于独占设备。利用假脱机技术,可将它改造为一台可供多个用户共享的打印设备,从而提高设备的利用率,也方便了用户。
假脱机打印系统的构成:
(1)磁盘缓冲区:在磁盘上开辟的一个存储空间,用于暂存用户程序的输出数据;
(2)打印缓冲区:为了缓和CPU和磁盘之间速度不匹配的矛盾,在内存中要有一个打印输出缓冲区,用于暂存从磁盘缓冲区送来的数据;
(3)假脱机管理进程和假脱机打印进程:由假脱机管理进程为每个要求打印的用户数据,建立一个假脱机文件,并把它放入假脱机文件队列中,由假脱机打印进程,依次对队列中的文件进行打印。
(在上述的设备分配程序中(改进后):进程使用逻辑设备名请求I/O,从SDT中,找出第一个该类设备的DCT。若该设备忙,又查找第二个该类设备的DCT,仅当所有该类设备都忙时,才把进程挂在该类设备的等待队列上。而只要有一个该类设备可用,系统便进一步计算分配该设备的安全性。如安全,便可把设备分配给它。我们可以看出若所有设备均忙(单打印机且在工作就会把进程挂在该类设备的等待队列上),而假脱机技术则将打印机这个独占设备改造成共享设备,建立打印缓存区并由假脱机管理进程建立假脱机文件队列使进程等待进行打印。)
SPOOLing技术解决了独占设备利用率低的问题(√)
SPOOLing技术需要利用磁盘空间作为缓冲(√)
SPOOLing技术可用于打印机的管理(√)
虚设备技术是指在一类设备上模拟另一类设备的技术(√)
SPOOLing技术是一类典型的虚设备技术(√)
虚拟设备是把一个物理设备变换成多个对应的逻辑设备。(√)
虚拟设备是指允许用户以标准化方式来使用物理设备。(×)
SPOOLing技术需要外存的支持,需要多道程序设计的支持,可以让多个作业共享一台独占设备。(√)(当系统中引入了多道程序技术后,完全可以利用其中的一道程序,来模拟脱机输入时的外围控制机功能,把低速I/O设备上的数据传送到高速磁盘上。再用另一道程序,模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。)
缓冲区管理:
缓冲的引入:
1.缓和CPU与I/O设备间速度不匹配的矛盾
2.减少对CPU的中断频率,放宽对CPU中断响应时间的限制
3.解决数据粒度不匹配的问题
4.提高CPU和I/O设备之间的并行性
缓冲池的引入:
上述的缓冲区是专门为特定的生产者和消费者设置的,它们属于专用缓冲。当系统较大时,应该有许多这样的循环缓冲,这不仅要消耗大量的内存空间,而且其利用率不高。
为了提高缓冲区的利用率,目前广泛流行既可用于输入又可用于输出的公用缓冲池,在池中设置了多个可供若干个进程共享的缓冲区。
缓冲池的组成:
空缓冲队列emq、输入队列inq、输出队列outq
用于收容输入数据的工作缓冲区:hin
用于提取输入数据的工作缓冲区:sin
用于收容输出数据的工作缓冲区:hout
用于提取输出数据的工作缓冲区:sout
缓冲区可以工作在下列四种方式下:
收容输入:输入进程需要输入时,取得空缓冲区,装满后放入输入队列。
提取输入:计算进程需要输入时,在输入队列取缓冲区,提取数据后挂在空缓冲区队列上。
收容输出:计算进程需要输出时,取空缓冲区,装满数据后挂在输出缓冲队列上。
提取输出:输出进程从输出队列取缓冲区,提取完数据后挂在空缓冲区上。
磁盘存储器的性能和调度:
普通机械硬盘(HDD):
磁盘数据的组织和格式:
磁盘设备可包括一个或多个物理盘片;
每个磁盘片有一个或两个存储面;
每个盘面上有若干个磁道;
每条磁道又被从逻辑上划分成若干个扇区(sectors);
一个(或多个)扇区称为一个物理块(块block、簇cluster);
磁盘以块为单位统一编号;
块是信息存储、传输、分配的基本单位;
磁盘总块数由扇区数、磁道数以及柱面数决定。
使用旋转托盘上的表面磁颗粒来存储数据
可移动的读/写头来访问磁盘
当对磁盘上的一物理块进行访问时,要经过哪些操作?
【解析】
磁盘上一块的位置是由三个参数确定的,即:柱面号、磁头号、扇区号。存取信息时首先根据柱面号控制移动臂作机械的横向运动,带动读/写磁头到达指定柱面(移臂操作);再按磁头号确定信息所在的盘面,然后等待访问的扇区旋转到读写头下(旋转延迟);由指定的磁头进行存取(数据传输)。对一物理块访问的三部分时间中,移臂操作所占时间最长,为了减少移动臂移动花费的时间,存放信息时是按柱面存放,同一柱面上的磁道放满后,再放到下一个柱面上。
根据上述步骤我们可以获得磁盘访问时间:
其中(1)中s为磁臂(磁头)启动时间(约为2ms),m为常数,与磁盘驱动器的速度有关,对于一般磁盘m=0.2,对于高速磁盘,m=0.1,n为磁头移动的磁道数。(大体上寻道时间Ts在5~30ms)
- 中旋转延迟时间即等待访问的扇区旋转到读写头下,按平均延迟计算。(对于旋转速度为15000r/min的硬盘,平均旋转延迟时间为T=2ms,对于软盘,其旋转速度为300r/min或600r/min,平均旋转时间T=50-100ms)
计算:15000(r/min) -> 15000/60(r/s) -> 1000(1s=1000ms)/[2*(15000/60)] (ms) ->2ms
(3)传输时间Tt与每次所读写字节数b和旋转速度有关:Tt=b/(r*N),其中r为磁盘每秒钟的转数,N为一条磁道上的字节数,当一次读/写的字节数相当于半条磁道上的字节数时Tt=传输时间T
总时间Ta=Ts+1/2r+b/(r*N)
磁盘的格式化:
★磁盘分区
在磁盘低级格式化完成后,一般要对磁盘进行分区。
在逻辑上,每个分区就是一个独立的逻辑磁盘。
每个分区的起始扇区和大小都记录在磁盘0扇区的主引导记录分区表所包含的分区表中。
分区表中必须有一个分区被标记成活动的,以保证能够从硬盘引导系统。
★磁盘高级格式化
在真正可以使用磁盘前,还需要对磁盘进行一次高级格式化;
设置一个引导块、空闲存储管理、根目录和一个空文件系统;
同时在分区表中标记该分区所使用的文件系统。
【2017考研真题】
下列选项中,磁盘逻辑格式化程序所做的工作是:(B)
Ⅰ.对磁盘进行分区
Ⅱ.建立文件系统的根目录
Ⅲ.确定磁盘扇区校验码所占位数
Ⅳ.对保存空闲磁盘块信息的数据结构进行初始化
A.仅 Ⅱ B.仅 Ⅱ、Ⅳ
C.仅 Ⅲ、Ⅳ D.仅 Ⅰ、Ⅱ 、Ⅳ
磁盘调度:
当有多个访盘请求等待时,采用一定的策略,对这些请求的服务顺序调整安排
降低平均磁盘服务时间,达到公平、高效。
公平:一个I/O请求在有限时间内满足。
高效:减少设备机械运动带来的时间开销。
减少寻找时间是提高磁盘传输效率的关键。因为“寻找时间”在几十毫秒时间量级。
驱动调度 作为操作系统的辅助存储器,用来存放文件的磁盘一类高速大容量旋转型存储设备,在繁重的输入输出负载之下,同时会有若干个输入输出请求来到并等待处理。系统必须采用一种调度策略,使能按最佳次序执行要求访问的诸请求,这就叫驱动调度,使用的算法叫驱动调度算法。驱动调度能减少为若干个输入输出请求服务所需的总时间,从而,提高系统效率。
磁盘移臂调度的目的是尽可能地减少输入输出操作中的寻道时间。
常用的移臂调度算法有:
早期的磁盘调度算法:
① 先来先服务算法FCFS(first come first served)
② 最短寻找时间优先算法(SSTF)
基于扫描的磁盘调度算法:
③ 电梯调度算法(扫描算法)(SCAN算法)
④ 单向扫描算法(循环扫描算法)(CSCAN)
例:
磁盘调度算法(续):
NStepSCAN算法(该算法的目标是改进前几种算法可能在多磁头系统中出现磁头静止在一个磁道上,导致其它进程无法及时进行磁盘I/O。) :
N步SCAN算法是将磁盘请求队列分成若干个长度为N的子队列;
磁盘调度将按FCFS算法依次处理这些子队列;
而每处理一个队列时又是按SCAN算法,对一个队列处理完后,再处理其他队列;
当正在处理某子队列时,如果又出现新的磁盘I/O请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。
FSCAN算法:
FSCAN算法实质上是N步SCAN算法的简化,即FSCAN只将磁盘请求队列分成两个子队列;
一个是由当前所有请求磁盘I/O的进程形成的队列,由磁盘调度按SCAN算法进行处理;
在扫描期间,将新出现的所有请求磁盘I/O的进程,放入另一个等待处理的请求队列;
这样,所有的新请求都将被推迟到下一次扫描时处理。
小结:
文件管理
文件和文件系统
文件的逻辑结构
文件目录
文件共享
文件保护
磁盘存储器管理
外存的组织方式
文件存储空间的管理
提高磁盘I/O速度的途径
提高磁盘可靠性的技术
数据一致性的控制