【操作系统】设备管理
设备管理的对象主要是I/O 设备,及设备控制器和I/O 通道。设备管理为了完成用户提出的I/O 请求,提高I/O 速率以及提高I/O 设备的利用率。设备管理的主要功能有: 缓冲区管理、设备分配、设备处理、虚拟设备及实现设备独立性等。I/O 系统中包括有用于实现信息输入、输出和存储功能的设备和相应的设备控制器,在有的大、中型机中,还有I/O 通道或I/O 处理机。
I/O系统
I/O设备分类
块设备用于存储信息,信息的存取总是以数据块为单位,它属于有结构设备。典型的块设备是磁盘,每个盘块的大小为512 B~4 KB。磁盘设备的基本特征是其传输速率较高,可寻址。磁盘设备的I/O 常采用DMA方式。
字符设备用于数据的输入和输出,其基本单位是字符,它属于无结构类型。字符设备的种类繁多,如交互式终端、打印机等。字符设备的基本特征是其传输速率较低,不可寻址。字符设备在输入/输出时,常采用中断驱动方式。
设备控制器
设备并不是直接与CPU 进行通信,而是与设备控制器通信,因此,在I/O 设备中应含有与设备控制器间的接口,数据信号线、控制信号线和状态信号线。
设备控制器是计算机中的一个实体,其主要职责是控制一个或多个I/O 设备,以实现I/O设备和计算机之间的数据交换。设备控制器是一个可编址的设备(每个设备都有唯一的地址)。设备控制器的基本功能:接收和识别命令(为此内含控制寄存器和译码器)、数据交换(内含数据寄存器)、标识和报告设备状态(内含状态寄存器)、地址识别(内含地址译码器)、数据缓冲(内含缓冲器)、差错控制。控制器的组成如下图,包扣设备控制器与处理机接口(共有三类信号线: 数据线、地址线和控制线)、设备控制器与设备的接口(数据、控制和状态三种信号)、I/O逻辑(用于实现对设备的控制。它通过一组控制线与处理机交互,处理机利用该逻辑向控制器发送I/O 命令;I/O 逻辑对收到的命令进行译码)。
I/O 通道是一种特殊的处理机,它具有执行I/O 指令的能力,并通过执行通道(I/O)程序来控制I/O 操作。I/O 通道与一般的处理机 一是其指令类型单一;二是通道没有自己的内存,通通道与CPU共享内存。I/O通道的目的是为了减少CPU的负担,CPU只需要发送简单指令给I/O通道,剩余控制交给I/O通道。通到的类型有:字节多路通道(子通道按时间片轮转方式共享主通道)、数组选择通道(主通道在一段时间内有一个程序独占)、数组多路通道(结合上述两种)。 解决I/O“瓶颈”问题的有效方法,便是增加设备到主机间的通路而不增加通道,如换言之,就是把一个设备连接到多个控制器上,而一个控制器又连接到多个通道上。
总线
- ISA(Industry Standard Architecture)总线
- EISA(Extended ISA)总线
- 局部总线(是指将多媒体卡、高速LAN 网卡、高性能图形板等,从ISA 总线上卸下来,再通过局部总线控制器直接接到CPU 总线上,使之与高速CPU 总线相匹配。如VESA(Video Electronic Standard Association)总线、PCI(Peripheral Component Interface)总线随)
I/O控制方式
I/O的控制方式有:程序I/O方式、中断驱动I/O控制方式、DMA I/O控制方式、I/O通道控制方式。
程序I/O方式
程序IO方式是早期使用,或称为忙——等待方式。在处理机向控制器发出一条I/O 指令启动输入设备输入数据时,要同时把状态寄存器中的忙/闲标志busy置为1,然后便不断地循环测试busy。当busy=1 时,表示输入机尚未输完一个字(符),直至busy=0,表明输入机已将输入数据送入控制器的数据寄存器中。于是处理机将数据寄存器中的数据取出,送入内存指定单元中,这样便完成了一个字(符)的I/O。由于CPU的高速性和I/O 设备的低速性,致使CPU的绝大部分时间处于等待和循环测试中。CPU 之所以要不断地测试I/O 设备的状态,就是因为在CPU 中无中断机构,使I/O 设备无法向CPU报告它已完成了一个字符的输入操作。
中断驱动I/O控制方式
当某进程要启动某个I/O 设备工作时,便由CPU向相应的设备控制器发出一条I/O 命令,然后立即返回继续执行原来的任务。设备控制器于是按照该命令的要求去控制指定I/O 设备,一旦数据进入数据寄存器,控制器便通过控制线向CPU发送一中断信号,由CPU检查输入过程中是否出错,若无错,便向控制器发送取走数据的信号,然后再通过控制器及数据线将数据写入内存指定单元中。
直接存储器访问(DMA)I/O控制方式
该方式的特点:(1) 数据传输的基本单位是数据块,即在CPU 与I/O 设备之间,每次传送至少一个数据块;(2) 所传送的数据是从设备直接送入内存的,或者相反;(3) 仅在传送一个或多个数据块的开始和结束时,才需CPU 干预,整块数据的传送是在控制器的控制下完成的。
DMA 控制器如图由三部分组成:主机与DMA 控制器的接口;DMA 控制器与块设备的接口;I/O 控制逻辑。其中命令/状态寄存器(CR),用于接收从CPU 发来的I/O 命令,或有关控制信息,或设备的状态。(2) 内存地址寄存器(MAR),在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。(3) 数据寄存器(DR),用于暂存从设备到内存,或从内存到设备的数据。(4) 数据计数器(DC),存放本次CPU要读或写的字(节)数。
IO通道方式
I/O 通道方式是DMA方式的发展,它可进一步减少CPU的干预,即把对一个数据块的读(或写)为单位的干预减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。通道是通过执行通道程序,并与设备控制器共同实现对I/O 设备的控制的。
缓冲管理
为了缓和CPU与I/O 设备速度不匹配的矛盾,减少对CPU的中断频率放宽对CPU中断响应时间的限制,提高CPU和I/O 设备的并行性,几乎所有的I/O 设备在与处理机交换数据时都用了缓冲区。缓冲管理的主要职责是组织好这些缓冲区,并提供获得和释放缓冲区的手段。
单缓冲情况下,每当用户进程发出一I/O 请求时,操作系统便在主存中为之分配一缓冲区。由于T 和C 是可以并行的,当T>C 时,系统对每一块数据的处理时间为M+T,反之则为M+C,故可把系统对每一块数据的处理时间表示为Max(C,T)+M。
双缓冲
循环缓冲
当输入与输出或生产者与消费者的速度基本相匹配时,采用双缓冲能获得较好的效果,可使生产者和消费者基本上能并行操作。但若两者的速度相差甚远,双缓冲的效果则不够理想,不过可以随着缓冲区数量的增加,使情况有所改善。在循环缓冲中包括多个缓冲区,其每个缓冲区的大小相同。作为输入的多缓冲区可分为三种类型:用于装输入数据的空缓冲区R、已装满数据的缓冲区G 以及计算进程正在使用的现行工作缓冲区C。作为输入的缓冲区可设置三个指针:用于指示计算进程下一个可用缓冲区G 的指针Nextg、指示输入进程下次可用的空缓冲区R的指针Nexti,以及用于指示计算进程正在使用的缓冲区C的指针。Current。
当Nexti 指针追赶上Nextg 指针。这意味着输入进程输入数据的速度大于计算进程处理数据的速度,已把全部可用的空缓冲区装满,再无缓冲区可用。此时,输入进程应阻塞,直到计算进程把某个缓冲区中的数据全部提取完,使之成为空缓冲区R,并调用Releasebuf过程将它释放时,才将输入进程唤醒。这种情况被称为系统受计算限制。
Nextg 指针追赶上Nexti 指针。这意味着输入数据的速度低于计算进程处理数据的速度,使全部装有输入数据的缓冲区都被抽空,再无装有数据的缓冲区供计算进程提取数据。这时,计算进程只能阻塞,直至输入进程又装满某个缓冲区,并调用Releasebuf 过程将它释放时,才去唤醒计算进程。这种情况被称为系统受I/O 限制。
缓冲池
上述的缓冲区仅适用于某特定的I/O 进程和计算进程,因而它们属于专用缓冲。当系统较大时,将会有许多这样的循环缓冲,这不仅要消耗大量的内存空间,而且其利用率不高。为了提高缓冲区的利用率,目前广泛流行公用缓冲池(Buffer Pool),在池中设置了多个可供若干个进程共享的缓冲区。
(1) 收容输入。在输入进程需要输入数据时,便调用Getbuf(emq)过程,从空缓冲队列emq 的队首摘下一空缓冲区,把它作为收容输入工作缓冲区hin。然后,把数据输入其中,装满后再调用Putbuf(inq,hin)过程,将该缓冲区挂在输入队列inq 上。
(2) 提取输入。当计算进程需要输入数据时,调用Getbuf(inq)过程,从输入队列inq 的队首取得一个缓冲区,作为提取输入工作缓冲区(sin),计算进程从中提取数据。计算进程用完该数据后,再调用Putbuf(emq,sin)过程,将该缓冲区挂到空缓冲队列emq 上。
(3) 收容输出。当计算进程需要输出时,调用Getbuf(emq)过程从空缓冲队列emq 的队首取得一个空缓冲区,作为收容输出工作缓冲区hout。当其中装满输出数据后,又调用Putbuf(outq,hout)过程,将该缓冲区挂在outq 末尾。
(4) 提取输出。由输出进程调用Getbuf(outq)过程,从输出队列的队首取得一装满输出数据的缓冲区,作为提取输出工作缓冲区sout。在数据提取完后,再调用Putbuf(emq,sout)过程,将该缓冲区挂在空缓冲队列末尾。
I/O软件
I/O软件设计目标:与具体设备无关、统一命名、对错误的处理、缓冲技术、设备的分配与释放、I/O控制方式。I/O软件普遍采用层次结构,在层次式结构的I/O 软件中,只要层次间的接口不变,对每个层次中的软件进行的修改都不会引起其下层或高层代码的变更,仅最低层才会涉及到硬件的具体特性。
中断处理程序
中断处理层的主要工作有:进行进程上下文的切换,对处理中断信号源进行测试,读取设备状态和修改进程状态等。
通常由硬件自动将处理机状态字PSW 和程序计数器(PC)中的内容,保存在中断保留区(栈)中,然后把被中断进程的CPU现场信息(即包括所有的CPU寄存器,如通用寄存器、段寄存器等内容)都压入中断栈中。
设备驱动程序
设备驱动程序通常又称为设备处理程序,它是I/O 进程与设备控制器之间的通信程序,又由于它常以进程的形式存在,故以后就简称之为设备驱动进程。其主要任务是接收上层软件发来的抽象I/O 要求,如read或write命令,在把它转换为具体要求后,发送给设备控制器,启动设备去执行;此外,它也将由设备控制器发来的信号传送给上层软件。设备驱动程序的主要任务是启动指定设备。但在启动之前,还必须完成必要的准备工作,如检测设备状态是否为“忙”等。在完成所有的准备工作后,才最后向设备控制器发送一条启动命令。工作过程如下:
- 将抽象要求转换为具体要求;
- 检查I/O 请求的合法性;
- 读出和检查设备的状态;
- 传送必要的参数;
- 工作方式的设置;
- 启动I/O 设备。
设备独立性软件
设备独立性软件是为了应用程序独立于具体使用的物理设备。为了在应用程序中,使用逻辑设备名称来请求使用某类设备;而系统在实际执行时,还必须使用物理设备名称。设备独立性软件的主要功能有:1对独立设备的分配与回收;2将逻辑设备名映射为物理设备名,进一步可以找到相应物理设备的驱动程序;3对设备进行保护,禁止用户直接访问设备;4缓冲管理,即对字符设备和块设备的缓冲区进行有效的管理,以提高I/O的效率;5差错控制,由于在I/O操作中的绝大多数错误都与设备无关,故主要由设备驱动程序处理,而设备独立性软件只处理那些设备驱动程序无法处理的错误;6 提供独立于设备的逻辑块;7向用户层(或文件层)软件提供统一接口。
为了实现设备的独立性,系统必须设置一张逻辑设备表(LUT,Logical Unit Table),用于将应用程序中所使用的逻辑设备名映射为物理设备名。在该表的每个表目中包含了三项:逻辑设备名、物理设备名和设备驱动程序的入口地址。LUT 的设置可采取两种方式:第一种方式是在整个系统中只设置一张LUT;第二种方式是为每个用户设置一张LUT。
用户层的I/O软件
一般而言,大部分的I/O 软件都在操作系统内部,但仍有一小部分在用户层,包括与用户程序链接在一起的库函数,以及完全运行于内核之外的一些程序。
设备分配
在多道程序环境下,系统中的设备供所有进程共享。为防止诸进程对系统资源的无序竞争,特规定系统设备不允许用户自行使用,必须由系统统一分配。
用到的数据结构有:设备控制表(用于记录本设备使用情况)、控制器控制表(记录本控制器情况)、通道控制表(记录本通道的情况)和系统设备表(全部设备情况)等。
系统在分配设备时,应考虑: ① 设备的固有属性(独占性、共享性、可虚拟设备);② 设备分配算法(与进程调度相似,先来先服务、优先级最高优先);③ 设备分配时的安全性(安全分配方式即IO请求后,进程阻塞;不安全分配方式即IO请求后,进程继续至发现设备被占用才阻塞);④ 设备独立性。
系统分配设备步骤:1、分配设备;2、分配控制器;3、分配通道。 进程是以物理设备名来提出I/O 请求的;采用的是单通路的I/O 系统结构,容易产生“瓶颈”现象。改进方法是增加设备的独立性,进程应使用逻辑设备名请求I/O和采用多通路的I/O 系统结构。
SPOOLing技术
通过SPOOLing 技术便可将一台物理I/O 设备虚拟为多台逻辑I/O 设备,同样允许多个用户共享一台物理I/O设备。为了缓和CPU的高速性与I/O 设备低速性间的矛盾而引入了脱机输入、脱机输出技术。SPOOLing 技术是对脱机输入、输出系统的模拟。该技术是利用专门的外围控制机,将低速I/O 设备上的数据传送到高速磁盘上;或者相反。使得此时的外围操作与CPU对数据的处理同时进行。SPOOLing系统必须建立在具有多道程序功能的操作系统上,而且还应有高速随机外存的支持,这通常是采用磁盘存储技术。
(1) 输入井和输出井。这是在磁盘上开辟的两个大存储空间。输入井是模拟脱机输入时的磁盘设备,用于暂存I/O 设备输入的数据;输出井是模拟脱机输出时的磁盘,用于暂存用户程序的输出数据。
(2) 输入缓冲区和输出缓冲区。为了缓和CPU 和磁盘之间速度不匹配的矛盾,在内存中要开辟两个缓冲区:输入缓冲区和输出缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,以后再传送给输出设备。
(3) 输入进程SPi和输出进程SPo。这里利用两个进程来模拟脱机I/O 时的外围控制机。其中,进程SPi模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井,当CPU 需要输入数据时,直接从输入井读入内存;进程SPo模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。
磁盘管理
最常见磁盘分类有:将磁盘分成硬盘和软盘、单片盘和多片盘、固定头磁盘和活动头(移动头)磁盘等。
磁盘调度算法
- 先来先服务(FCFS,First Come First Served):根据进程请求访问磁盘的先后次序进行调度。优点是公平;缺点是平均寻到时间长。
- 最短寻道时间优先(SSTF,Shortest Seek Time First):每次选择访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短的进程。优点是每次寻到时间最短;缺点是可能出现饥饿现象。
- 扫描(SCAN )算法:又常称之为电梯调度算法,不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。优点是避免了饥饿现象,缺点是当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。
- 循环扫描(CSCAN )算法:规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问的磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。请求进程的请求延迟将从原来的2T减为T + S,其中,T为由里向外或由外向里单向扫描完要访问的磁道所需的寻道时间,而S 是将磁头从最外面被访问的磁道直接移到最里面欲访问的磁道(或相反)的寻道时间。
- NStepSCAN 算法:在 SSTF、SCAN 及CSCAN 几种调度算法中,都可能会出现磁臂停留在某处不动的情况,例如,有一个或几个进程对某一磁道有较高的访问频率,即这个(些)进程反复请求对某一磁道的I/O 操作,从而垄断了整个磁盘设备,我们把这一现象称为“磁臂粘着”。N步SCAN 算法是将磁盘请求队列分成若干个长度为N 的子队列,磁盘调度将按FCFS 算法依次处理这些子队列,而每处理一个队列时又是按SCAN 算法,对一个队列处理完后,再处理其他队列。当正在处理某子队列时,如果又出现新的磁盘I/O 请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。
- FSCAN 算法:实质上是N步SCAN 算法的简化一个是由当前所有请求磁盘I/O 的进程形成的队列,由磁盘调度按SCAN 算法进行处理。在扫描期间,将新出现的所有请求磁盘I/O的进程,放入另一个等待处理的请求队列。
磁盘高速缓存指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。访问数据时,先看高速缓存,没有在访问磁盘。数据交付的方式有数据交付(直接将高速缓存中的数据传送到请求者进程的内存工作区中)、指针交付(将指向高速缓存中某区域的指针交付给请求者进程)。当高速缓存满是将会发送置换,较常用的置换算法仍然是最近最久未使用算法LRU、最近未使用算法NRU及最少使用算法LFU等。解决数据点一致性问题,有LRU链,和周期性的写入磁盘。
提高磁盘IO速度的方法除了磁盘高速缓存,还有提前读(预先读取下一块数据到缓冲区)、延迟写(指在缓冲区A中的数据,本应立即写回磁盘,但考虑到该缓冲区中的数据在不久之后可能还会再被本进程或其它进程访问(共享资源),因而并不立即将该缓冲区A 中的数据写入磁盘,而是将它挂在空闲缓冲区队列的末尾)、优化物理块分布、虚拟盘(是指利用内存空间去仿真磁盘,又称为RAM 盘)。
廉价磁盘冗余阵列(RAID,Redundant Array of Inexpensive Disk)的并行交叉存取是指在该系统中,有多台磁盘驱动器,系统将每一盘块中的数据分为若干个子盘块数据,再把每一个子盘块的数据分别存储到各个不同磁盘中的相同位置上,当要将一个盘块的数据传送到内存时,采取并行传输方式。 RAID 的分级为0到7。
参考
《计算机操作系统》第三版 汤小丹