操作系统的目标就是要为设备的使用提供简单方便的统一接口,支持连接的可扩充性,并且优化I/O操作,实现最大的并发性。为了实现这一目标,操作系统需要在计算机进行输入输出时,管理和控制I/O设备,并提供适当的I/O操作支持,如驱动程序接口等。操作系统的这部分代码称为设备管理子系统。
6.1设备管理概述
设备分类:
1)按设备的信息组织方式分类
根据设备的控制复杂性及每次的数据传输单位等特性,将设备分为三大类:字符设备、块设备和网络设备。
优点:将控制不同I/O设备的驱动程序与操作系统的其他部分隔离开,为系统中增加和撤销设备提供便利。
a块设备
以块为单位进行数据传输的设备,块设备中的数据也是以块为单位进行组织和管理的。块的大小通常是2^n个字节。为了匹配CPU与块设备之间的传输速度的差异,块设备在进行I/O时,通常都需要利用缓冲技术。
常用的外部存储设备基本上是块设备,如硬盘、软盘、CD-ROM等。此外,也可将RAM模拟为RAM盘,作为块设备来使用。
b字符设备
字符设备以字符为单位(目前通常为8位,即一个字节)进行数据传输的设备,其速度较慢,主要用于与用户打交道。通常,字符设备的数据传输只能顺序进行,而不能进行随机定位,另外,在I/O过程中,一般不采用缓冲技术。
常见的字符终端、打印机、扫描仪、传感器和鼠标等都属于字符设备。
c网络设备
从传输速度上看,它通常快于字符设备而慢于块设备。传输单位上,以字节为单位。
但是,并非所有的设备都适用这种分类方法,例如,时钟和显示器,既不符合块身背,也不符合字符设备的特性。
2)按设备的共享性分类
从资源分配角度可以分为独占设备、共享设备和虚拟设备。
a独占设备
同一时刻只能被一个作业或进程使用的设备,多数低速设备,如打印机、绘图仪等,都属于独占设备。
b共享设备
共享设备允许若干个作业分时(并发)共享使用的设备,如磁盘等大多数直接存取设备等都属于共享设备。对于这些设备,几个进程或作业可分时(交替)地从其中读写信息。显然,当一个作业不能充分、连续地使用设备是,共享可提高设备的利用率。
c虚拟设备
为了提高设备的利用率,操作系统利用虚拟(spooling)技术,把物理上独占的设备转变成逻辑上共享的设备,即虚拟设备。在采用虚拟设备的情况下,作业都是通过虚拟设备使用物理上独占的设备。表面是并发的,但实际的物理设备还是由虚拟设备以独占方式使用。
3)按设备的使用特性
存储设备、I/O设备、终端设备及脱机设备等。
6.1.2设备控制器
I/O设备通常包含一个机械部件和一个电子部件。机械部件就是设备本身,电子部件称为设备控制器或适配器。它可以管理端口、总线或设备,实现设备与主机之间的数据传输。典型的设备控制器就是各种PCI或PCI EXPRESS卡,IDE接口一般就是一种PCI设备。
控制器卡上一般都有两个方向的接口,一个用于连接主机的总线,另一个用于连接设备。
设备控制器与设备之间的接口中包含三类信号:数据信号、控制信号和状态信号。设备控制器根据CPU提供的设备地址去选择一个设备接口。
每个控制器都有一些用来与CPU通信的寄存器(称为I/O端口),用于数据、控制命令和状态等信息的存储。为了寻址这些I/O端口,需要提供相应的寻址机制。在某些计算机上,这些寄存器占用内存地址空间的一部分,这种方案称作内存映像I/O。而在其他计算机上,I/O端口则使用专用的I/O地址(独立于内存单独编址)。PC混合采用了以上两种方案:显存采用了内存映像I/O,而其他I/O端口则是独立于内存编址。现代计算机设备更多的采用内存映像I/O。
设备控制器通常应具有如下功能:
a接收主机的控制命令。发出控制命令后,CPU转去执行其他操作。而控制器在收到控制命令后,独立控制设备完成相应的动作。当命令完成后,控制器发出一个中断,使CPU执行相应的中断处理程序。
b地址识别。能够根据CPU发来的地址信息,识别出其对应的设备。
c实现数据的缓冲。设备的种类不同,缓冲区的大小差别也很大。
d实现主机和控制器、控制器和设备之间数据交换和格式转换。
e提供设备和控制器当前的各种状态信息。
6.1.3设备管理的目标和功能
1设备管理的目标
a使设备独立于用户程序
b向用户提供设备的统一方便的使用接口
c尽量提高设备的使用效率
2设备管理的功能
a监视设备状态
b进行设备分配
c实现设备和CPU等之间的并行操作
d进行缓冲区管理
6.1.4 I/O设备的控制方式
设备管理的主要任务之一是控制设备与内存或CPU之间的数据传送。
指设备与内存或CPU之间的数据传送方式。主要由4中控制方式:
程序直接控制方式(轮询方式)、中断控制方式、DMA方式、通道方式。
前两种方式仅适用于外设数量很少,且传输数量较小的系统;而后两种方式则支持外设与内存之间的直接数据传输,因此可以大大减轻CPU的负担。
通道方式:独立于CPU的专用I/O控制的处理机(硬件),它控制设备与内存直接进行数据交换。它有自己的通道指令,这些通道指令由CPU启动,并在操作结束时向CPU发中断信号。按照信息交换方式不同,通道可以分为三种类型:字节多路通道、数组多路通道和选择通道。
与DMA方式类似,通道控制方式也是一种以内存为中心,实现设备和内存直接交换数据的控制方式。与DMA不同的是:在DMA方式中,数据的传输方向、存放数据的内存始址及传送的数据长度等,都由CPU控制;而通道方式中,这些都由通道来进行控制。另外,与DMA方式时每台设备至少一个DMA控制器相比,通道控制方式可以做到一个通道控制多台设备与内存进行数据交换,从而进一步减轻了CPU的工作负担,并提高了系统的并行工作程度。
6.2I/O软件
6.2.1 I/O软件的分层结构
目标:设备独立性,提高系统整体效率。
一般将通用的I/O软件自底向上分成以下四个层次:
与硬件相关的终端处理程序(硬件与软件接口);
设备驱动程序或叫设备I/O层;
设备无关软件,是指与设备硬件操作无关的I/O管理软件,也叫逻辑I/O层;
用户空间的I/O软件。
除了用户空间的I/O软件在运行时位于进程的用户空间外,其他三层均位于内核空间。用户空间的I/O软件以系统调用的方式使用下层相关功能。
6.2.2中断处理程序
中断处理需要花费相当多的CPU指令,特别是寄存器、MMU、TLB和页表等的保存和恢复。
为了加快中断处理的速度,在Linux系统中,中断处理程序会借用中断发生时正在运行的进程的页表、MMU和内核栈等上下文。限制是中断处理程序在执行的过程中,不能被阻塞,否则就是阻塞被借用的进程。解决办法是:如果一个中断处理程序需要被阻塞,则通过内核提供的函数将其提升为内核线程,使其具备被调度(阻塞)的条件,从而将当前被借用的进程解放出来。
6.2.3设备驱动程序
在I/O软件模型中,所有与设备相关的代码都放在驱动程序或中断处理程序中。由于驱动程序与设备硬件密切相关,所以通常每种硬件设备需要一种驱动程序。设备驱动程序通常必须是内核的一部分,也就是运行在内核态,因此要求其安全可靠。设备驱动程序是当系统运行时根据对设备的具体需求,动态加载其相应的驱动程序,以减少不必要的内存开销。
1设备驱动程序的功能
a设备驱动程序时控制设备动作(如打开、关闭、读和写)的核心模块,用来控制设备的运行及其与计算机之间的数据传输。具有以下几项功能:
b接受来自上层的逻辑I/O层的抽象读写请求,将其转换为具体读写请求并将该请求排在请求队列的队尾,同时还要检查I/O请求的合法性。
c取出请求队列中队首请求,将相应的设备分配给它。
d检查设备的工作状态,向设备控制器发送命令和设置参数,启动设备工作,完成指定I/O操作。
e执行确定的缓冲区策略。
f及时响应控制器或通道发来的中断请求,并调用响应的中断处理程序进行处理。
LINUX设备管理的特点是将物理设备看成文件(即设备文件),采用文件系统(VFS)的接口和系统调用来管理和控制设备。从设备向内存输入数据相当于读文件,而把内存中的数据写向设备则看成是写文件。
对于LINUX系统中的用户程序来说,使用设备实际上就是使用设备文件。LINUX的设备文件名一般由两部分组成:第一部分2~3字符,表示设备的种类,如串口设备是cu,并口设备是lp、IDE普通硬盘是hd(IDE指接口也叫ATA接口)、软盘是fp等;第二部分通常是字母或数字,用于区分同种设备中的单个设备,如hda、hdb和hdc分别表示第一块、第二块和第三块IDE硬盘。而hda1、hda2则表示第一块硬盘中的第一、第二个磁盘分区。设备文件通常直接存放在/dev目录中,如/dev/hda2、/dev/lp0等。
LINUX使用虚拟文件系统VFS作为统一的操作接口来处理文件和设备。与普通的目录和文件一样,每个设备也使用一个VFS inode来描述,其中包含设备类型(块设备或字符设备)的主、次设备号。
对设备的操作也是通过对文件操作的file_operation结构体来调用驱动程序的设备服务子程序。
设备文件只对应字符设备和块设备,而网络设备并不与设备文件相对应。例如,系统中的第一块网卡只有逻辑设备名eth0,因此,不能使用Linux文件系统接口来管理和控制网卡设备,而是使用套接口(socket)以文件I/O形式来对网络进行访问。
6.3缓冲技术
操作系统引入缓冲的主要原因是:
1)改善CPU与I/O设备间速度不匹配的矛盾。
2)降低对CPU中断频率,放宽对中断响应时间的限制。
3)提高CPU和I/O设备之间的并行性。缓冲的引入可以显著提高CPU和设备的并行操作速度,避免CPU与I/O设备间频繁的“互相等待”,提高系统的吞吐量和设备的利用率。
根据I/O控制方式,缓冲的实现方法有两种,一种是采用专用硬件缓冲区,例如I/O控制器中的数据缓冲寄存器。另一种方法是在内存中划出一个具有N个单元的专用缓冲区,以便存放输入输出的数据。内存缓冲区又称软件缓冲。
6.2.3缓冲的种类
根据系统设置的缓冲区的个数,可把缓冲技术分为单缓冲、双缓冲和循环缓冲以及缓冲池几种。
1单缓冲
是OS提供的一种最简单的缓冲。其缓冲区是临界资源,即不允许多个进程同时对一个缓冲区操作,因此,设备和设备之间不能通过单缓冲达到并行操作。
2双缓冲
解决两台外设、打印机和终端之间并行的操作问题的办法是设置双缓冲。当二者速度相差太大时,则速度较快的一方将需要等待,而实际计算机系统中,外设间的速度通常相差甚远。所以,现代计算机系统一般使用循环缓冲或缓冲池结构。
3循环缓冲
把多个缓冲区连接起来组成两部分,一部分专门用于输入,另一部分专门用于输出的缓冲结构。
循环缓冲的缓冲区是系统的公共资源,可供各个进程共享,并由系统统一分配和管理。
在LINUX系统中,无论是块设备还是字符设备,都使用循环缓冲技术。
4缓冲池
循环缓冲仅适用于某个特定的I/O进程和计算进程,因而属于专用缓冲。当系统较大是,将会有许多这样的循环缓冲,不仅需要消耗大量的内存空间,而且利用率也不高。
为了提高缓冲区的利用率,目前广泛流行的方式是采用公共缓冲池,池中的缓冲区可供多个进程共享。
缓冲池是把多个缓冲区连接起来统一管理,既可用于输入又可用于输出的缓冲结构。
6.3.3缓冲池的管理
缓冲池由多个缓冲区组成,一个缓冲区由两部分组成:一部分是用来标识该缓冲区和用于管理的缓冲首部,另一部分是用于存放数据的缓冲体。
在缓冲池中有四种工作缓冲区:
1)用于收容设备输入数据的收容输入缓冲区hin;
2)用于提取设备输入数据的提取输入缓冲区sin;
3)用于收容cpu输出数据的收容输出缓冲区hout;
4)用于提取cpu输出数据的提取输出缓冲区sout.
6.4设备分配
四个因素:
1 I/O设备的固有属性
某些设备要求人工干预。对于高速磁盘来说,完全可以由多个进程共享使用。
2系统所采用的分配算法
3设备分配时应防止死锁
将独占设备(虚拟)共享化,使其通过SPOOLing技术做到共享,是解决死锁的一种有效的方法。另外,通过要求进程按照一定是顺序申请其所使用的资源,也可以达到防止死锁的目的。
4使用户程序与实际使用的物理设备无关
提高系统的适应性和扩展性,用户程序中使用的设备都是逻辑设备,由系统根据用户的请求和资源使用的情况,分配具体的物理设备,可大大减少用户程序对设备的滥用或破坏。
6.4.2设备分配的原则和方式
原则是根据设备特性、用户要求和系统配置情况决定的。总原则是:既要充分发挥设备的使用效率,尽可能地让设备忙,又要避免由于不合理的分配方式造成进程死锁。另外,还要做到把用户程序和具体物理设备隔离开,即用户程序面对的是逻辑设备,而分配程序将在系统把逻辑设备转换成物理设备之后,再根据要求的物理设备号进行分配。
分配方式有两种:静态分配和动态分配。
静态分配是在用户作业开始执行之前,由系统一次分配该作业所要求的全部设备、控制器和通道。一旦分配之后,这些设备、控制器和通道就一直为该作业所占用,直到该作业被撤销。
静态分配方式不会出现死锁,但设备的利用率低。因此,静态设备方式并不符合设备分配的总原则。
动态分配在进程执行过程中根据执行需要进行。当进程需要设备时,通过系统调用命令向系统提出设备请求,由系统按照事先规定的策略给进程分配所需要的设备、I/O控制器和通道,一旦用完之后,便立即释放。有利于提高设备的利用率,但如果分配算法使用不当,则有可能造成进程死锁。
6.4.3进程分配技术
1独占分配技术
把独占设备固定地分配给一个进程,直至该进程完成I/O操作并且释放它为止。该进程占用设备期间,即使闲置页不用,也不能分配给其他进程使用。这是由设备的物理性质决定的,好处是使用方便,且避免死锁。但设备利用率会降低。例如打印机。
2共享分配技术
适用于高速、大容量的直接存取存储设备,如磁盘机和可读CD-ROM等可共用的设备。各个进程分时地使用这些设备,系统保证其彼此之间互不干扰,这时共享设备的利用率显著提高。
对于独占设备,页可以采用这种共享分配形式。例如打印机,在分配给一个进程打印完一段内容后,可暂时释放并分配给另外进程使用。可以大大提高设备利用率。
3虚拟分配技术
利用共享设备去实现独占设备的功能,从而使独占设备从使用者的角度成为可共享的、快速的I/O设备。最成功的技术是SPOOLing技术。
6.4.4设备分配算法
动态设备分配常用的算法有先请求先分配、优先级高者先分配算法等。
1、先请求先分配
当多个进程对某一设备提出I/O请求时,或者在同一设备上进行多次I/O操作时,系统按提出I/O请求的先后顺序,将进程发出的I/O请求命令排成队列,其队首指向请求设备。当设备空闲时,系统从该设备的请求队列的队首取下一个I/O请求消息,将设备分配给发出这个请求消息的进程。
2、优先级高者先分配
优先级指的是发出I/O请求命令的进程的优先级。这种策略和进程调度的优先级法是一致的,即进程的优先级高,它的I/O请求页优先予以满足。对于相同优先级的进程,则按照先请求先分配策略分配。
6.5 I/O控制
从用户进程的输入输出请求开始,给用户进程分配设备和启动有关设备进行I/O操作,在I/O操作完成之后响应中断,直到进行善后处理为止的整个系统控制过程,称为I/O控制。
6.5.2I/O控制的功能
I/O请求处理是用户进程和设备管理程序接口的一部分,它把用户进程的I/O请求变换为设备管理程序所能接受的信息。一般来说,用户的I/O请求包括所申请进行I/O操作的逻辑设备名、要求的操作、传输数据的长度和起始地址等。处理时首先将逻辑设备名转换为对应的物理设备名,然后检查I/O请求命令中是否有参数错误。在参数正确时,把命令插入指向响应设备的I/O请求队列,然后启动设备分配程序。
之后,I/O模块还将启动缓冲管理模块为此次I/O传送申请必要的缓冲区,以保证I/O传送的顺利完成。申请缓冲区也可以在设备分配之前进行,例如,LINUX系统首先请求缓冲区,再把I/O请求命令写到缓冲区中,并将该缓冲区挂到设备的I/O请求队列上。
在数据传送结束后,对于不同的中断,处理不同。例如,处理结束中断时,要释放响应的设备和控制器,并唤醒正在等待操作完成的进程。另外还要检查是否还有等待该设备的I/O请求命令。如有,则通知I/O控制过程进行下一个I/O传送。
6.5.3I/O控制的实现
I/O控制过程在系统中可以有三种方式实现:
1)作为请求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控制方案。
3)I/O控制由专门的系统进程——I/O进程完成。在用户进程发出I/O请求命令后,系统调度I/O进程执行,控制I/O操作。同样,在外设发出中断请求之后,I/O进程也调度执行以响应中断。
I/O进程也可以分成三种方式实现:
a每类(个)设备设一个专门的I/O进程,该进程只能在系统状态下执行。
b整个系统设一I/O进程,全面负责系统的数据传送工作。
c每类(个)设备设一个专门的I/O进程,但该进程可在用户态也可在系统态下执行。
LINUX进程控制采用第二种,即作为当前进程的一部分实现,其本质实际上是由中断驱动的,只是借用了当前进程的上下文。
6.6磁盘调度
6.6.1磁盘存取时间
分为三个部分:
1)系统要把磁头移动到响应的磁道或柱面上,这个时间叫做寻道时间;
2)一旦磁头到达指定磁道,必须等待所需要的扇区转到读写头下,这个延迟时间叫做旋转延迟时间;
3)信息实际在磁盘和内存之间进行传输时间,叫做传输时间。
一次磁盘服务的总时间就是三者之和。第一个时间远远大于2、3时间之和。所以,减少1时间可以显著改善系统性能。
6.6.2磁盘调度算法
1先来先服务法(FCFS)
适用于访问请求不是很多的情况。
2最短寻道时间优先法(SSTF)
缺点:对用户请求的响应机会不是均等的,有可能出现”饥饿“问题。并不是最优的算法。
3扫描法(SCAN)
也叫电梯算法。将请求队列中,磁臂前进方向上最接近磁头当前所在柱面的访问要求作为下一个调度对象,若前进方向上没有请求,那么磁臂就要改变移动方向。请求最近者,依次地进行调度,直到该方向上没有调度请求磁臂才改变移动方向,并依次服务于此方向上的访问请求。在一定程度上克服SSTF 算法的集中于中间磁道和响应时间变化较大的缺点。
4循环扫描法(C-SCAN)
是SCAN的变种,可使等待时间变得更均匀。调度方法是:总是按同一方向移动磁臂,处理完最高(低)编号柱面上的请求后,磁臂立即返回请求的最低(高)的编号柱面,然后继续按该方向处理请求。
在磁盘访问负荷较小的情况下,SCAN算法是最好的,而在中等以上负荷的情况下,C-SCAN算法效果最佳。
本文详细介绍了操作系统中设备管理的目标、功能、设备分类、设备控制器、设备管理的层次结构、I/O控制方式、缓冲技术和设备分配等内容。重点讨论了设备的分类,包括字符设备、块设备和网络设备,以及设备的共享性,如独占设备、共享设备和虚拟设备。此外,还阐述了设备控制器的作用、设备管理的目标和功能,并分析了各种I/O控制方式如程序直接控制、中断控制、DMA和通道方式。最后,探讨了I/O软件的分层结构、缓冲技术和设备分配策略,如先来先服务、最短寻道时间优先、扫描法和循环扫描法。

3599

被折叠的 条评论
为什么被折叠?



