操作系统---设备管理

I/O 系统

  • I/O系统管理的主要对象是I/O设备和相应的设备控制器。其最主要的任务是,完成用户提出的I/O请求,提高I/O速率,以及提高设备的利用率,为更高层的进程方便地使用这些设备提供手段。

  • I/O系统的基本功能
    隐藏物理设备的细节。与设备的无关性。提高处理机和I/O设备的利用率。对I/O设备进行控制。确保对设备的正确共享错误处理

  • I/O系统接口
    块设备接口:隐藏了磁盘的二维结构,将抽象命令映射为低层操作。

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

    网络通信接口:通过某种方式把计算机连接到网络上,使计算机能通过网络与网络上的其它计算机进行通信或上网浏览。

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

  • 内存映像I/O
    在这种方式中,在编址上不再区分内存单元地址和设备控制器中的寄存器地址.

I/O 设备

  • 按设备的使用特性分类
    存储设备,也称外存或后备存储器、 辅助存储器,是计算机系统用以存储信息的主要设备。该类设备存取速度较内存慢,但容量比内存大得多,相对价格也便宜。

    输入/输出设备,又具体可分为输入设备、 输出设备和交互式设备。输入设备用来接收外部信息。输出设备是用于将计算机加工处理后的信息送向外部的设备。交互式设备则是集成上述两类设备,利用输入设备接收用户命令信息,通过输出设备同步显示用户命令以及命令执行的结果。

  • 按传输速率分类
    低速设备,这是指其传输速率仅为每秒钟几个字节至数百个字节的一类设备。属于低速设备的典型设备有键盘、鼠标器、语音的输入和输出等设备。

    中速设备,这是指其传输速率在每秒钟数千个字节至 数十万个字节的一类设备。典型的中速设备有行式打印机、 激光打印机等。

    高速设备,这是指其传输速率在数百个千字节至千兆字节的一类设备。典型的高速设备有磁带机、磁盘机、光盘机等。

  • 按信息交换的单位分类
    块设备(Block Device),这类设备用于存储信息。由于信息的存取总是以数据块为单位,故而得名。它属于有结构设备。 典型的块设备是磁盘,每个盘块的大小为 512 B~4 KB。磁盘设备的基本特征是其传输速率较高,通常每秒钟为几兆位;另一特征是可寻址,即对它可随机地读/写任一块;此外,磁盘设备的 I/O 常采用 DMA 方式。

    字符设备(Character Device),用于数据的输入和输出。其基本单位是字符。它属于无结构类型。基本特征是其传输速率较低,另一特征是不可寻址,即输入/输出时不能指定数据的输入源地址及输出的目标地址,字符设备在输入/输出时,常采用中断驱动方式。

  • 按设备的共享属性分类
    独占设备。这是指在一段时间内只允许一个用户(进程)访问的设备,即临界资源。 因而,对多个并发进程而言,应互斥地访问这类设备。系统一旦把这类设备分配给了某进程后,便由该进程独占,直至用完释放。独占设备的分配有可能引起进程死锁。

    共享设备。这是指在一段时间内允许多个进程同时访问的设备。当然,对于每一时刻而言,该类设备仍然只允许一个进程访问。显然,共享设备必须是可寻址的和可随机访问的设备。典型的共享设备是磁盘。共享设备不仅可获得良好的设备利用率,而且它也是实现文件系统和数据库系统的物质基础。

    虚拟设备。这是指通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户(进程)同时使用。

设备与控制器之间的接口

  • 设备并不是直接与 CPU 进行通信,而是与设备控制器通信,因此,在 I/O 设备中应含有与设备控制器间的接口,在该接口中有三种类型的信号,各对应一条信号线。

    数据信号线:用于在设备和设备控制器之间传送数据信号。对输入设备而言,由外界输入的信号经转换器转换后所形成的数据,通常先送入缓冲器中。当数据量达到一定的比特(字符)数后,再从缓冲器通过一组数据信号线传送给设备控制器。对输出设备而言,则是将从设备控制器经过数据信号线传送来的一批数据先暂存于缓冲器中,经转换器作适当转换后,再逐个字符地输出。

    控制信号线:这是作为由设备控制器向 I/O 设备发送控制信号时的通路。该信号规定了设备将要执行的操作。

    状态信号线:这类信号线用于传送指示设备当前状态的信号。设备的当前状态有正在读(或写);设备已读(写)完成,并准备好新的数据传送。
    在这里插入图片描述

设备控制器

  • 设备控制器是计算机中的一个实体,其主要职责是控制一个或多个 I/O 设备,以实现 I/O 设备和计算机之间的数据交换。它是 CPU 与 I/O 设备之间的接口,它接收从 CPU 发来的命令,并去控制 I/O 设备工作,以使处理机从繁杂的设备控制事务中解脱出来。 设备控制器是一个可编址的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;
    若控制器可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个设备。 设备控制器的复杂性因不同设备而异,相差甚大。

  • 用于控制字符设备的控制器,用于控制块设备的控制器。

  • 在微型机和小型机中的控制器,常做成印刷电路卡形式,因而也常称为接口卡,可将它插入计算机。

  • 设备控制器的基本功能
    接收和识别命令: CPU 可以向控制器发送多种不同的命令,设备控制器应能接收并识别这些命令。为此,在控制器中应具有相应的控制寄存器,用来存放接收的命令和参数,并对所接收的命令进行译码。

    数据交换:这是指实现 CPU 与控制器之间、控制器与设备之间的数据交换。对于前者,是通过数据总线,由 CPU 并行地把数据写入控制器,或从控制器中并行地读出数据;对于后者,是设备将数据输入到控制器,或从控制器传送给设备。为此,在控制器中须设置数据寄存器。

    标识和报告设备的状态:控制器应记下设备的状态供 CPU 了解。为此,在控制器中应设置一状态寄存器,用其中的每一位来反映设备的某一种状态。当 CPU 将该寄存器的内容读入后,便可了解该设备的状态。

    地址识别:系统中的每一个设备都有一个地址,而设备控制器又必须能够识别它所控制的每个设备的地址。此外,为使 CPU 能向(或从)寄存器中写入(或读出)数据,这些寄存器都应具有唯一的地址。控制器应能正确识别这些地址,为此,在控制器中应配置地址译码器。

    数据缓冲:由于I/O 设备的速率较低而 CPU 和内存的速率却很高,故在控制器中必须设置一缓冲器。输出时,缓冲器暂存由主机高速传来的数据,然后以 I/O 设备所具有的速率将缓冲器中的数据传送给 I/O 设备;输入时,缓冲器用于暂存从I/O设备送来的数据,待接收到一批数据后,再将缓冲器中的数据高速地传送给主机。

    差错控制:若发现传送中出现了错误,通常是将差错检测码置位,并向 CPU 报告。于是 CPU 将本次传送来的数据作废,并重新进行一次传送。

  • 设备控制器的组成
    在这里插入图片描述
    由于设备控制器位于 CPU 与设备之间,它既要与 CPU 通信,又要与设备通信,还应具有按照 CPU 所发来的命令去控制设备工作的功能。

    设备控制器与处理机的接口:该接口用于实现 CPU 与设备控制器之间的通信。共有三类信号线: 数据线、地址线和控制线。数据线通常与两类寄存器相连接:第一类是数据寄存器,在控制器中可以有一个或多个数据寄存器,用于存放从设备送来的数据(输入)或从CPU 送来的数据(输出);第二类是控制/状态寄存器:在控制器中可以有一个或多个这类寄存器,用于存放从 CPU 送来的控制信息或设备的状态信息。

    设备控制器与设备的接口:在一个设备控制器上,可以连接一个或多个设备。相应地,在控制器中便有一个或多个设备接口。一个接口连接一台设备。在每个接口中都存在数据、控制和状态三种类型的信号。控制器中的 I/O 逻辑根据处理机发来的地址信号去选择一个设备接口。

    I/O 逻辑:在设备控制器中的 I/O 逻辑用于实现对设备的控制。它通过一组控制线与处理机交互,处理机利用该逻辑向控制器发送 I/O 命令;I/O 逻辑对收到的命令进行译码。每当 CPU 要启动一个设备时,一方面将启动命令发送给控制器;另一方面又同时通过地址线把地址发送给控制器,由控制器的 I/O 逻辑对收到的地址进行译码,再根据所译出的命令对所选设备进行控制。

I/O通道(I/O Channel)

  • I/O 通道设备的引入
    虽然在 CPU 与 I/O 设备之间增加了设备控制器后,已能大大减少 CPU 对 I/O 的干预,但当主机所配置的外设很多时,CPU 的负担仍然很重。为此,在 CPU 和设备控制器之间又增设了通道。其主要目的是为了建立独立的 I/O 操作,不仅使数据的传送能独立于CPU,而且也希望有关对 I/O 操作的组织、管理及其结束处理尽量独立,以保证CPU 有更多的时间去进行数据处理;或者说,其目的是使一些原来由 CPU 处理的 I/O 任务转由通道来承担,从而把 CPU 从繁杂的 I/O 任务中解脱出来。

    在设置了通道后,CPU 只需向通道发送一条 I/O 指令。通道在收到该指令后,便从内存中取出本次要执行的通道程序,然后执行该通道程序,仅当通道完成了规定的 I/O 任务后,才向 CPU 发中断信号。 I/O 通道是一种特殊的处理机,它具有执行 I/O 指令的能力,并通过执行通道 (I/O)程序来控制 I/O 操作。

    I/O 通道又与一般的处理机不同,其指令类型单一:这是由于通道硬件比较简单,其所能执行的命令主要局限于与 I/O 操作有关的指令;通道所执行的通道程序是放在主机的内存中的,换言之,是通道与CPU 共享内存

  • 通道类型
    字节多路通道(Byte Multiplexor Channel) :这是一种按字节交叉方式工作的通道。它通常都含有许多非分配型子通道,其数量可从几十到数百个,每一个子通道连接一台 I/O 设备,并控制该设备的 I/O 操作。这些子通道按时间片轮转方式共享主通道。当第一个子通道控制其 I/O 设备完成一个字节的交换后,便立即腾出主通道,让给第二个子通道使用;当所有子通道轮转一周后,重又返回来由第一个子通道去使用字节多路主通道。这样,只要字节多路通道扫描每个子通道的速率足够快,而连接到子通道上的设备的速率不是太高时,便不致丢失信息。
    在这里插入图片描述
    数组选择通道(Block Selector Channel) :字节多路通道不适于连接高速设备,这推动了按数组方式进行数据传送的数组选择通道的形成。这种通道虽然可以连接多台高速设备,但由于它只含有一个分配型子通道,在一段时间内只能执行一道通道程序,控制一台设备进行数据传送,致使当某台设备占用了该通道后,便一直由它独占。即使是它无数据传送,通道被闲置,也不允许其它设备使用该通道,直至该设备传送完毕释放该通道通道的利用率很低。

    数组多路通道(Block Multiplexor Channel) :数组多路通道是将数组选择通道传输速率高和字节多路通道能使各子通道(设备)分时并行操作的点相结合而形成的一种新通道。它含有多个非分配型子通道,因而这种通道既具有很高的数据传输速率,又能获得令人满意的通道利用率。该通道能被广泛地用于连接多台高、中速的外围设备,其数据传送是按数组方式进行的。

  • “瓶颈”问题
    由于通道价格昂贵,使机器中所设置的通道数量势必较少,成了 I/O 的瓶颈,进而造成整个系统吞吐量的下降。解决“瓶颈”问题的最有效的方法,便是增加设备到主机间的通路而不增加通道,就是把一个设备连接到多个控制器上,而一个控制器又连接到多个通道上。多通路方式不仅解决了“瓶颈”问题,而且提高了系统的可靠性,个别通道或控制器的故障不会使设备和存储器之间没有通路。
    在这里插入图片描述
    在这里插入图片描述

总线系统

  • 在计算机系统中的各部件,如 CPU、存储器以及各种 I/O 设备之间的联系,都是通过总线来实现的。总线的性能是用总线的时钟频率、带宽和相应的总线传输速率等指标来衡量的。

I/O 控制方式

  • 尽量减少主机对 I/O 控制的干预,把主机从繁杂的I/O 控制事务中解脱出来,以便更多地去完成数据处理任务。

程序I/O(Programmed I/O)方式

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

  • 在程序 I/O 方式中,由于 CPU 的高速性和 I/O 设备的低速性,致使 CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中,造成对 CPU 的极大浪费。CPU 之所以要不断地测试 I/O 设备的状态,就是因为无中断机构,使 I/O 设备无法向 CPU 报告它已完成了一个字符的输入操作。
    在这里插入图片描述

中断驱动(Interrupt Driven)I/O控制方式

  • 当某进程要启动某个 I/O 设备工作时,便由 CPU 向相应的设备控制器发出一条 I/O 命令,然后立即返回继续执行原来的任务。设备控制器于是按照该命令的要求去控制指定 I/O 设备。此时,CPU 与 I/O 设备并行操作。在输入时,当设备控制器收到 CPU 发来的读命令后,便去控制相应的输入设备读数据。一旦数据进入数据寄存器,控制器便通过控制线向 CPU 发送一中断信号,由 CPU 检查输入过程中是否出错。若无错,便向控制器发送取走数据的信号,然后再通过控制器及数据线将数据写入内存指定单元中。
  • 在 I/O 设备输入每个数据的过程中,由于无需 CPU 干预,因而可使 CPU 与 I/O 设备并行工作。仅当输完一个数据时,才需 CPU 花费极短的时间去做些中断处理。可见,这样可使 CPU 和 I/O 设备都处于忙碌状态,从而提高了整个系统的资源利用率及吞吐量。
    在这里插入图片描述

直接存储器访问(DMA) (Direct Memory Access)I/O控制方式

  • 中断驱动 I/O仍是以字为单位进行 I/O 的,每当完成一个字(节)的 I/O 时,控制器便要向 CPU 请求一次中断。DMA控制方式数据传输的基本单位是数据块,即在CPU 与 I/O 设备之间,每次传送至少一个数据块;所传送的数据是从设备直接送入内存的,或者相反;仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在控制器的控制下完成的。

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

  • 为了实现在主机与控制器之间成块数据的直接交换,必须在DMA 控制器中设置四类寄存器。命令/状态寄存器(CR):用于接收 CPU 发来的 I/O 命令,或有关控制信息,或设备的状态。内存地址寄存器(MAR):在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。 数据寄存器(DR):用于暂存从设备到内存,或从内存到设备的数据。 数据计数器(DC):存放本次 CPU 要读或写的字(节)数。

  • DMA 工作过程:当 CPU 要从磁盘读入一数据块时,便向磁盘控制器发送一条读命令。该命令被送到其中的命令寄存器(CR)中。同时,还须发送本次要将数据读入的内存起始目标地址,该地址被送入内存地址寄存器(MAR) 中;本次要读数据的字(节)数则送入数据计数器(DC)中,还须将磁盘中的源地址直接送至 DMA 控制器的 I/O 控制逻辑上。然后,启动 DMA 控制器进行数据传送,CPU 便可去处理其它任务。此后,整个数据传送过程便由 DMA 控制器进行控制。当 DMA 控制器已从磁盘中读入一个字(节)的数据并送入数据寄存器(DR)后再挪用一个存储器周期,将该字(节)传送到 MAR 所指示的内存单元中。接着便对 MAR 内容加 1,将 DC 内容减 1。若减 1 后 DC 内容不为 0,表示传送未完,便继续传送下一个字(节);否则,由 DMA 控制器发出中断请求。
    在这里插入图片描述

I/O通道控制方式

  • 实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。

  • 通道程序:通道是通过执行通道程序,并与设备控制器共同实现对 I/O 设备的控制的。通道程序是由一系列通道指令(或称为通道命令)所构成的。通道指令与一般的机器指令不同,在它的每条指令中都包含下列诸信息:

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

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

    计数。该信息表示本条指令所要读(或写)数据的字节数。

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

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

缓冲管理

缓冲的引入

  • 缓和 CPU 与 I/O 设备间速度不匹配的矛盾:凡在数据到达速率与其离去速率不同的地方,都可设置缓冲区,以缓和它们之间速率不匹配的矛盾。减少对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制,提高 CPU 和 I/O 设备之间的并行性,提高系统的吞吐量和设备的利用率。

单缓冲(Single Buffer)

  • 每当用户进程发出一 I/O 请求时,操作系统便在主存中为之分配一缓冲区。
  • 在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间为T,操作系统将该缓冲区中的数据传送到用户区的时间为 M,CPU 对这一块数据处理(计算)的时间为 C。由于 T 和 C 是可以并行的,当 T>C 时,系统对每一块数据的处理时间为M+T,反之则为M+C。故可把系统对每一块数据的处理时间表示为Max(C,T)+M。
  • 在字符设备输入时,缓冲区用于暂存用户输入的一行数据,在输入期间,用户进程被挂起以等待数据输入完毕;在输出时,用户进程将一行数据输入到缓冲区后,继续进行处理。当用户进程已有第二行数据输出时,如果第一行数据尚未被提取完毕,则此时用户进程应阻塞。

双缓冲(Double Buffer)

  • (缓冲对换(Buffer Swapping))。在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。此时操作系统可以从第一缓冲区中移出数据,并送入用户进程。接着由 CPU 对数据进行计算。在双缓冲时,系统处理一块数据的时间可以粗略地认为是 Max(C,T)。如果 C<T,可使块设备连续输入;如果 C>T,则可使 CPU 不必等待设备输入。 对于字符设备,若采用行输入方式,则采用双缓冲通常能消除用户的等待时间,即用户在输入完第一行之后,在CPU 执行第一行中的命令时,用户可继续向第二缓冲区输下一行数据。 如果我们在实现两台机器之间的通信时,仅为它们配置了单缓冲,那么,它们之间在任一时刻都只能实现单方向的数据传输。为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收缓冲区

循环缓冲

  • 若输入与输出的速度相差甚远,双缓冲的效果则不够理想,不过可以随着缓冲区数量的增加,使情况有所改善。可将多个缓冲组织成循环缓冲形式。对于用作输入的循环缓冲,通常是提供给输入进程或计算进程使用。输入进程不断向空缓冲区输入数据,而计算进程则从中提取数据进行计算。

  • 循环缓冲的组成
    多个缓冲区:在循环缓冲中包括多个缓冲区,其每个缓冲区的大小相同。作为输入的多缓冲区可分为三种类型:用于装输入数据的空缓冲区 R,已装满数据的缓冲区 G ,计算进程正在使用的现行工作缓冲区 C。

    多个指针:作为输入的缓冲区可设置三个指针:用于指示计算进程下一个可用缓冲区 G 的指针 Nextg,指示输入进程下次可用的空缓冲区 R 的指针 Nexti,指示计算进程正在使用的缓冲区 C 的指针 Current。

  • 循环缓冲区的使用
    Getbuf 过程:当计算进程要使用缓冲区中的数据时,可调用 Getbuf 过程。该过程将由指针 Nextg 所指示的缓冲区提供给进程使用,相应地,须把它改为现行工作缓冲区,并令 Current 指针指向该缓冲区的第一个单元,同时将Nextg 移向下一个 G 缓冲区。类似地,每当输入进程要使用空缓冲区来装入数据时,也调用 Getbuf 过程由该过程将指针 Nexti 所指示的缓冲区提供给输入进程使用,同时将Nexti 指针移向下一个R 缓冲区。

    Releasebuf 过程:当计算进程把 C 缓冲区中的数据提取完毕时,便调用 Releasebuf 过程,将缓冲区 C 释放。此时,把该缓冲区由当前(现行)工作缓冲区 C 改为空缓冲区 R。类似地,当输入进程把缓冲区装满时,也应调用 Releasebuf 过程,将该缓冲区释放,并改为 G 缓冲区。

  • 进程同步
    使用输入循环缓冲,可使输入进程和计算进程并行执行。相应地,指针 Nexti 和指针 Nextg 将不断地沿着顺时针方向移动,这样就可能出现下述两种情况:

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

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

缓冲池(Buffer Pool)

  • 上述的缓冲区仅适用于某特定的 I/O 进程和计算进程,因而它们属于专用缓冲。当系统较大时,将会有许多这样的循环缓冲,这不仅要消耗大量的内存空间,而且其利用率不高。

  • 缓冲池的组成
    对于既可用于输入又可用于输出的公用缓冲池,其中至少应含有以下三种类型的缓冲区: 空(闲)缓冲区装满输入数据的缓冲区装满输出数据的缓冲区

    为了管理上的方便,可将相同类型的缓冲区链成一个队列,于是可形成以下三个队列:
    空缓冲队列 emq:这是由空缓冲区所链成的队列。输入队列 inq:这是由装满输入数据的缓冲区所链成的队列。输出队列 outq:这是由装满输出数据的缓冲区所链成的队列。

    除了上述三个队列外,还应具有四种工作缓冲区:用于收容输入数据的工作缓冲区用于提取输入数据的工作缓冲区用于收容输出数据的工作缓冲区用于提取输出数据的工作缓冲区

  • Getbuf 过程和 Putbuf 过程
    为使诸进程能互斥地访问缓冲池队列,可为每一队列设置一个互斥信号量 MS(type)。
    此外,为了保证诸进程同步地使用缓冲区,又为每个缓冲队列设置了一个资源信号量 RS(type)。

  • 缓冲区的工作方式
    收容输入:在输入进程需要输入数据时,便调用 Getbuf(emq)过程,从空缓冲队列 emq 的队首摘下一空缓冲区,把它作为收容输入工作缓冲区 hin。然后,把数据输入其中,装满后再调用 Putbuf(inq,hin)过程,将该缓冲区挂在输入队列 inq 上。

    提取输入:当计算进程需要输入数据时,调用 Getbuf(inq)过程,从输入队列 inq 的 队首取得一个缓冲区,作为提取输入工作缓冲区(sin),计算进程从中提取数据。计算进程用完该数据后,再调用 Putbuf(emq,sin)过程,将该缓冲区挂到空缓冲队列 emq 上。

    收容输出:当计算进程需要输出时,调用 Getbuf(emq)过程从空缓冲队列 emq 的队首取得一个空缓冲区,作为收容输出工作缓冲区 hout。当其中装满输出数据后,又调用Putbuf(outq,hout)过程,将该缓冲区挂在 outq 末尾。

    提取输出:由输出进程调用 Getbuf(outq)过程,从输出队列的队首取得一装满输出数据的缓冲区,作为提取输出工作缓冲区 sout。在数据提取完后,再调用 Putbuf(emq,sout) 过程,将该缓冲区挂在空缓冲队列末尾。

I/O 软件

  • 高效率:确保 I/O 设备与 CPU 的并发性,以提高资源的利用率。
  • 通用性:尽可能地提供简单抽象、清晰而统一的接口,采用统一标准的方法,来管理所有的设备以及所需的 I/O 操作。
  • 通常将 I/O 软件组织成一种层次结构,低层软件用于实现与硬件相关的操作,并可屏蔽硬件的具体细节高层软件则主要向用户提供一个简洁、友好和规范的接口。每一层具有一个要执行的定义明确的功能和一个与邻近层次定义明确的接口,各层的功能与接口随系统的不同而异。
    在这里插入图片描述

I/O 软件的设计目标和原则

I/O软件的设计目标

  • 与具体设备无关:对于 I/O 系统中许多种类不同的设备,作为程序员,只需要知道如何使用这些资源来完成所需要的操作,而无需了解设备的有关具体实现细节。为了提高 OS 的可移植性和易适应性,I/O 软件应负责屏蔽设备的具体细节,向高层软件提供抽象的逻辑设备,并完成逻辑设备与具体物理设备的映射。 对于操作系统本身而言,应允许在不需要将整个操作系统进行重新编译的情况下,增添新的设备驱动程序,以方便新的 I/O 设备的安装。如在 Windows 中,系统可以为新 I/O 设备自动安装和寻找驱动程序,从而实现即插即用。

  • 统一命名:不同的操作系统有不同的命名规则,一般而言,是在系统中对各类设备采取预先设计的,统一的逻辑名称进行命名,所有软件都以逻辑名称访问设备。这种统一命名与具体设备无关,即同一个逻辑设备的名称,在不同的情况下可能对应于不同的物理设备。

  • 对错误的处理:一般而言,错误多数是与设备紧密相关的,因此对于错误的处理,应该尽可能在接近硬件的层面处理。只有低层软件解决不了的错误才通知高层软件解决。

  • 缓冲技术:由于 CPU 与设备之间的速度差异,无论是块设备还是字符设备,都需要使用缓冲技术。 对于不同类型的设备,其缓冲区(块)的大小是不一样的,就是同类型的设备,其缓冲区(块)的大小也是存在差异的。因此,I/O 软件应能屏蔽这种差异,向高层软件提供统一大小的数据块或字符单元,使得高层软件能够只与逻辑块大小一致的抽象设备进行交互。

  • 设备的分配和释放:对于系统中的共享设备,可以同时为多个用户服务。对于这样的设备,应该允许多个进程同时对其提出 I/O 请求。但对于独占设备,在某一段时间只能供一个用户使用,对其分配和释放的不当,将引起混乱,甚至死锁。

  • I/O 控制方式:I/O 软件应向高层软件提供统一的操作接口。

I/O 软件的层次

  • 为使十分复杂的 I/O 软件能具有清晰的结构,更好的可移植性和易适应性。目前在 I/O软件中已普遍采用了层次式结构,将系统中的设备操作和管理软件分为若干个层次,每一层都利用其下层提供的服务,完成输入、输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。 在层次式结构的 I/O软件中,只要层次间的接口不变,对每个层次中的软件进行的修改都不会引起其下层或高层代码的变更,最低层才会涉及到硬件的具体特性。

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

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

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

    中断处理程序:用于保存被中断进程的CPU 环境,转入相应的中断处理程序进行处理,处理完后再恢复被中断进程的现场,返回到被中断进程。

中断处理程序

  • 中断处理层的主要工作有:进行进程上下文的切换,对处理中断信号源进行测试,读取设备状态,修改进程状态等。

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

  • 中断处理程序的处理过程
    唤醒被阻塞的驱动(程序)进程:当中断处理程序开始执行时,首先去唤醒处于阻塞状态的驱动(程序)进程。如果是采用了信号量机制,则可通过执行 signal 操作,将处于阻塞状态的驱动(程序)进程唤醒。

    保护被中断进程的 CPU 环境:通常由硬件自动将处理机状态字 PSW 和程序计数器(PC)中的内容,保存在中断保留区(栈)中,然后把被中断进程的 CPU 现场信息(即包括所有的 CPU 寄存器,如通用寄存器、段寄存器等内容)都压入中断栈中。

    转入相应的设备处理程序:由处理机对各个中断源进行测试,以确定引起本次中断的 I/O 设备,并发送一应答信号给发出中断请求的进程,使之消除该中断请求信号,然后将相应的设备中断处理程序的入口地址装入到程序计数器中,使处理机转向中断处理程序。

    中断处理:对于不同的设备,有不同的中断处理程序。该程序首先从设备控制器中读出设备状态,以判别本次中断是正常完成中断,还是异常结束中断。若是前者,中断程序便进行结束处理;若还有命令,可再向控制器发送新的命令,进行新一轮的数据传送。若是异常结束中断,则根据发生异常的原因做相应的处理。

    恢复被中断进程的现场:当中断处理完成以后,便可将保存在中断栈中的被中断进程的现场信息取出,并装入到相应的寄存器中。其中包括该程序下一次要执行的指令的地址 N+1、处理机状态字 PSW, 以及各通用寄存器和段寄存器的内容。这样,当处理机再执行本程序时,便从N+1 处开始, 最终返回到被中断的程序。I/O 操作完成后,驱动程序必须检查本次 I/O 操作中是否发生了错误,并向上层软件报告。最终向调用者报告本次 I/O 的执行情况。

  • 对多中断源的处理方式:屏蔽(禁止)中断,嵌套中断。

  • 中断 陷入
    陷入通常由处理机正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的。陷入处理程序提供的服务为当前进程所用,而中断处理程序提供的服务则不是为了当前进程的。CPU 在执行完一条指令之后,下一条指令开始之前响应中断,而在一条指令执行中也可以响应陷入。在有的系统中,陷入处理程序被规定在各自的进程上下文中执行,而中断处理程序则在系统上下文中执行。

设备驱动程序

  • 其主要任务是接收上层软件发来的抽象 I/O 要求,在把它转换为具体要求后,发送给设备控制器,启动设备去执行;此外,它也将由设备控制器发来的信号传送给上层软件。有时也可为非常类似的两类设备配置一个驱动程序

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

  • 设备驱动程序的功能
    接收由设备独立性软件发来的命令和参数,并将命令中的抽象要求转换为具体要求,检查用户 I/O 请求的合法性,了解 I/O 设备的状态,传递有关参数,设置设备的工作方式。 发出 I/O 命令。如果设备空闲,便立即启动 I/O 设备去完成指定的 I/O 操作;如果设备处于忙碌状态,则将请求者的请求块挂在设备队列上等待。 及时响应由控制器或通道发来的中断请求,并根据其中断类型调用相应的中断处理程序进行处理。 对于设置有通道的计算机系统,驱动程序还应能够根据用户的 I/O 请求,自动地构成通道程序。

  • 设备处理方式
    为每一类设备设置一个进程,专门用于执行这类设备的 I/O 操作。

    在整个系统中设置一个 I/O 进程,专门用于执行系统中所有各类设备的 I/O 操作。

    设置一个输入进程和一个输出进程,分别处理系统中所有设备的输入或输出操作。

    不设置专门的设备处理进程,而只为各类设备设置相应的设备处理程序(模块),供用户进程或系统进程调用。

  • 驱动程序主要是指在请求 I/O 的进程与设备控制器之间的一个通信和转换程序。它将进程的 I/O 请求经过转换后,传送给控制器;又把控制器中所记录的设备状态和 I/O 操作完成情况及时地反映给请求 I/O 的进程。驱动程序与设备控制器和 I/O 设备的硬件特性紧密相关,因而对不同类型的设备应配置不同的驱动程序。驱动程序与 I/O 设备所采用的 I/O 控制方式紧密相关。由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言书写。目前有很多驱动程序的基本部分,已经固化在 ROM 中。 驱动程序应允许可重入:一个正在运行的驱动程序常会在一次调用完成前被再次调用。 驱动程序不允许系统调用。但是为了满足其与内核其它部分的交互,可以允许对某些内核过程的调用。

  • 设备驱动程序的处理过程
    检查 I/O 请求的合法性:对于任何输入设备,都是只能完成一组特定的功能,若该设备不支持这次的 I/O 请求, 则认为这次 I/O 请求非法。

    读出和检查设备的状态:在启动某个设备进行 I/O 操作时,其前提条件应是该设备正处于空闲状态。因此在启动设备之前,要从设备控制器的状态寄存器中,读出设备的状态。

    传送必要的参数:对于许多设备,特别是块设备,除必须向其控制器发出启动命令外,还需传送必要的参数。

    工作方式的设置:启动 I/O 设备:在完成上述各项准备工作之后,驱动程序可以向控制器中的命令寄存器传送相应的控制命令。

    对于字符设备,若发出的是写命令,驱动程序将把一个数据传送给控制器;若发出的是读命令,则驱动程序等待接收数据,并通过从控制器中的状态寄存器读入状态字的方法,来确定数据是否到达。

  • 驱动程序发出 I/O 命令后,基本的 I/O 操作是在设备控制器的控制下进行的。通常,I/O 操作所要完成的工作较多,需要一定的时间。

设备独立性(Device Independence)软件

  • 应用程序独立于具体使用的物理设备。 在应用程序中, 使用逻辑设备名称来请求使用某类设备; 而系统在实际执行时,还必须使用物理设备名称。 因此,系统须具有将逻辑设备名称转换为某物理设备名称的功能。

  • 设备分配时的灵活性:当应用程序(进程)以物理设备名称来请求使用指定的某台设备时,如果该设备已经分配给其他进程或正在检修,而此时尽管还有几台其它的相同设备正在空闲,该进程却仍阻塞。 若进程能以逻辑设备名称来请求某类设备时,系统可立即将该类设备中的任一台分配给进程,仅当所有此类设备已全部分配完毕时,进程才会阻塞。

    易于实现 I/O 重定向 :所谓 I/O 重定向,是指用于 I/O 操作的设备可以更换(即重定向),而不必改变应用程序。

  • 设备独立性软件
    驱动程序是一个与硬件(或设备)紧密相关的软件。为了实现设备独立性,必须再在驱动程序之上设置一层软件,称为设备独立性软件。

  • 功能
    执行所有设备的公有操作。包括: 对独立设备的分配与回收,将逻辑设备名映射为物理设备名,进一步可以找到相应物理设备的驱动程序。对设备进行保护,禁止用户直接访问设备。缓冲管理,即对字符设备和块设备的缓冲区进行有效的管理,以提高I/O的效率。差错控制,由于在I/O操作中的绝大多数错误都与设备有关,故主要由设备驱动程序处理,而设备独立性软件只处理那些设备驱动程序无法处理的错误;暂时性错误:暂时性的事件引起的,可以进行重试来纠正。持久性错误:持久性故障引起,通常要查清错误原因,才能排除。提供独立于设备的逻辑块,不同类型的设备信息交换单位是不同的,读取和传输速率也各不相同,即使同一类型的设备,其信息交换单位大小也是有差异的,对逻辑设备使用并向高层软件提供大小统一的逻辑数据块。

    向用户层(或文件层)软件提供统一接口。逻辑设备名到物理设备名映射的实现。

    逻辑设备表(LUT,Logical Unit Table) :为了实现设备的独立性,系统必须设置一张逻辑设备表,用于将应用程序中所使用的逻辑设备名映射为物理设备名。在该表的每个表目中包含了三项: 逻辑设备名、物理设备名和设备驱动程序的入口地址。当进程用逻辑设备名请求分配 I/O 设备时,系统为它分配相应的物理设备,并在 LUT 上建立一个表目,填上应用程序中使用的逻辑设备名和系统分配的物理设备名,以及该设备驱动程序的入口地址。当以后进程再利用该逻辑设备名请求 I/O 操作时,系统通过查找 LUT,便可找到物理设备和驱动程序。

    LUT 的设置问题
    整个系统中只设置一张 LUT:由于系统中所有进程的设备分配情况都记录在同一张 LUT 中,因而不允许在 LUT 中具有相同的逻辑设备名这就要求所有用户都不使用相同的逻辑设备名。主要用于单用户系统中。

    为每个用户设置一张 LUT。每当用户登录时,便为该用户建立一个进程,同时也为之建立一张 LUT,并将该表放入进程的 PCB 中。由于通常在多用户系统中,都配置了系统设备表,故此时的逻辑设备表的表目为逻辑设备名,系统设备表指针

用户层的 I/O 软件

  • 为使诸进程能有条不紊地使用I/O设备,保护设备的安全性, 不允许运行在用户态的应用进程去直接调用运行在核心态(系统态)的OS过程。应用进程在运行时,又必须取得OS所提供的服务,否则,应用程序几乎无法运行。 为了解决此矛盾,OS在用户层中引入了一个中介过程——系统调用。

  • 应用程序可以通过它间接调用OS中的I/O过程,对I/O设备进行操作。用户层软件必须通过一组系统调用来取得操作系统服务。在现代的高级语言以及 C 语言中,通常提供了与各系统调用一一对应的库函数,用户程序通过调用对应的库函数使用系统调用。这些库函数与调用程序连接在一起,包含在运行时装入在内存的二进制程序中。

设备分配

  • 为防止诸进程对系统资源的无序竞争,特规定系统设备不允许用户自行使用,必须由系统统一分配。每当进程向系统提出 I/O 请求时,只要是可能和安全的,设备分配程序便按照一定的策略,把设备分配给请求用户(进程)。在有的系统中,为了确保在 CPU 与设备之间能进行通信,还应分配相应的控制器和通道。

设备分配中的数据结构

  • 设备控制表(DCT) ,用于记录本设备的情况。
    指示设备类型的字段 type

    设备标识字段deviceid

    设备队列队首指针:凡因请求本设备而未得到满足的进程,其 PCB 都应按照一定的策略排成一个队列称该队列为设备请求队列或简称设备队列。 其队首指针指向队首 PCB。在有的系统中还设置了队尾指针。

    设备状态。当设备自身正处于使用状态时,应将设备的忙/闲标志置“1”。若与该设备相连接的控制器或通道正忙,也不能启动该设备,此时则应将设备的等待标志置“1”。

    与设备连接的控制器表指针:在设备到主机之间具有多条通路的情况下,一个设备将与多个控制器相连接。 此时,在 DCT中还应设置多个控制器表指针。

    重复执行次数:由于外部设备在传送数据时,较易发生数据传送错误,因而在许多系统中,如果发生传送错误,并不立即认为传送失败,而是令它重新传送,并由系统规定设备在工作中发生错误时应重复执行的次数。在重复执行时,若能恢复正常传送,则仍认为传送成功。 仅当屡次失败,致使重复执行次数达到规定值而传送仍不成功时,才认为传送失败。

  • 控制器控制表(COCT)。控制器标识符,控制器状态,与控制器连接的通道表指针,控制器队列的队首指针,控制器队列的队尾指针。

  • 通道控制表(CHCT)。通道标识符,通道状态,与通道连接的控制器表首址,通道队列的队首指针,通道队列的队尾指针。

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

设备分配时应考虑的因素

  • 设备的固有属性:在分配设备时,首先应考虑与设备分配有关的设备属性。对于独占设备,应采用独享分配策略,即将一个设备分配给某进程后,便由该进程独占,直至该进程完成或释放该设备,然后,系统才能再将该设备分配给其他进程使用。设备得不到充分利用,而且还可能引起死锁。对于共享设备,可同时分配给多个进程使用,此时须注意对这些进程访问该设备的先后次序进行合理的调度。可虚拟设备。一台可虚拟设备是可共享的设备,可以将它同时分配给多个进程使用,并对这些访问该设备的先后次序进行控制。

  • 设备分配算法
    先来先服务。当有多个进程对同一设备提出 I/O 请求时,该算法是根据诸进程对某设备提出请求的先后次序,将这些进程排成一个设备请求队列,设备分配程序总是把设备首先分配给队首进程。

    优先级高者优先。在进程调度中的这种策略,是优先权高的进程优先获得处理机。 如果对这种高优先权进程所提出的 I/O请求也赋予高优先权,显然有助于这种进程尽快完成。 在利用该算法形成设备队列时,将优先权高的进程排在设备队列前面,而对于优先级相同的 I/O请求,则按先来先服务原则。

  • 设备分配中的安全性

    安全分配方式:在这种分配方式中,每当进程发出 I/O 请求后,便进入阻塞状态,直到其 I/O 操作完成时才被唤醒。一旦进程已经获得某种设备(资源)后便阻塞,使该进程不可能再请求任何资源,而在它运行时又不保持任何资源。 因此,这种分配方式摒弃了 “请求和保持”条件,从而使设备分配是安全的。 进程进展缓慢,即 CPU 与 I/O 设备是串行工作的。

    不安全分配方式:在这种分配方式中,进程在发出 I/O 请求后仍继续运行,需要时又发出第二个I/O 请求、 仅当进程所请求的设备已被另一进程占用时,请求进程才进入阻塞状态。 一个进程可同时操作多个设备,使进程推进迅速。分配不安全,因为它可能具备“请求和保持”条件,从而可能造成死锁。因此,在设备分配程序中,还应再增加一个功能,以用于对本次的设备分配是否会发生死锁进行安全性计算,仅当计算结果说明分配是安全的情况下才进行设备分配。

独占设备的分配程序

  • 分配设备:首先根据 I/O 请求中的物理设备名,查找系统设备表(SDT),从中找出该设备的 DCT, 再根据 DCT中的设备状态字段,可知该设备是否正忙。 若忙,便将请求 I/O 进程的 PCB。挂在设备队列上;否则,便按照一定的算法来计算本次设备分配的安全性。 如果不会导致系统进入不安全状态,便将设备分配给请求进程;否则,仍将其PCB 插入设备等待队列。

  • 分配控制器 :在系统把设备分配给请求 I/O 的进程后,再到其 DCT 中找出与该设备连接的控制器的 COCT,从 COCT的状态字段中可知该控制器是否忙碌。 若忙,便将请求 I/O 进程的 PCB 挂在该控制器的等待队列上;否则,便将该控制器分配给进程。

  • 分配通道:在该 COCT 中又可找到与该控制器连接的通道的 CHCT 再根据 CHCT 内的状态信息, 可知该通道是否忙碌。若忙,便将请求I/O 的进程挂在该通道的等待队列上; 否则,将该通道分配给进程。只有在设备、 控制器和通道三者都分配成功时,这次的设备分配才算成功。然后,便可启动该 I/O 设备进行数据传送。

  • 设备分配程序的改进
    增加设备的独立性:为了获得设备的独立性,进程应使用逻辑设备名请求I/O。 这样,系统首先从 SDT 中 找出第一个该类设备的 DCT。 仅当所有该类设备都忙时,才把进程挂在该类设备的等待队列上;而只要有一个该类设备可用,系统便进一步计算分配该设备的安全性。

    考虑多通路情况:为了防止在 I/O系统中出现“瓶颈”现象,通常都采用多通路的 I/O 系统结构。 此时对控制器和通道的分配同样要经过几次反复,仅当所有的控制器(通道)都忙时,此次的控制器(通道)分配才算失败,才把进程挂在控制器(通道)的等待队列上。 而只要有一个控制器,(通道)可用,系统便可将它分配给进程。

SPOOLing技术

  • 将一台物理 I/O 设备虚拟为多台逻辑 I/O 设备,允许多个用户共享一台物理 I/O 设备。

  • 当系统中引入了多道程序技术后,完全可以利用其中的一道程序,来模拟脱机输入时的外围控制机功能,把低速 I/O设备上的数据传送到高速磁盘上;再用另一道程序来模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。这样,便可在主机的直接控制下,实现脱机输入、输出功能。 此时的外围操作与 CPU 对数据的处理同时进行,这种在联机情况下实现的同时外围操作称为 SPOOLing(Simultaneaus Periphernal Operating On Line),或称为假脱机操作。

  • SPOOLing 系统的组成
    输入井:模拟脱机输入时的磁盘,用于暂存 I/O 设备输入的数据;输出井:模拟脱机输出时的磁盘,用于暂存用户程序的输出数据。

    为了缓和 CPU 和磁盘之间速度不匹配的矛盾,在内存中要开辟两个缓冲区。输入缓冲区:用于暂存由输入设备送来的数据,以后再传送到输入井。输出缓冲区:用于暂存从输出井送来的数据,以后再传送给输出设备。

    输入进程SPi:模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井,当 CPU 需要输入数据时,直接从输入井读入内存;

    输出进程 SPo:模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。

  • 共享打印机
    当用户进程请求打印输出时,SPOOLing 系统同意为它打印输出,但并不真正立即把打印机分配给该用户进程:由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中;输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上。如果还有进程要求打印输出,系统仍可接受该请求,也同样为该进程做上述两件事。 如果打印机空闲,输出进程将从请求打印队列的队首取出一张请求打印表。根据表中的要求将要打印的数据,从输出井传送到内存缓冲区,再由打印机进行打印。打印完后,输出进程再查看请求打印队列中是否还有等待打印的请求表。若有,又取出队列中的第一张表,并根据其中的要求进行打印,如此下去,直至请求打印队列为空,输出进程才将自己阻塞起来,仅当下次再有打印请求时,输出进程才被唤醒。

  • SPOOLing 系统的特点
    提高了 I/O 的速度:对数据所进行的 I/O 操作,已从对低速 I/O 设备进行的 I/O操作,演变为对输入井或输出井中数据的存取,提高了 I/O 速度,缓和了 CPU 与低速 I/O 设备之间速度不匹配的矛盾。

    将独占设备改造为共享设备。因为在 SPOOLing 系统中,实际上并没为任何进程分配设备,而只是在输入井或输出井中为进程分配一个存储区和建立一张I/O 请求表。 这样,便把独占设备改造为共享设备。

    实现了虚拟设备功能。宏观上,虽然是多个进程在同时使用一台独占设备,而对于每一个进程而言,他们都会认为自己是独占了一个设备。当然,该设备只是逻辑上的设备。 SPOOLing 系统实现了将独占设备变换为若干台对应的逻辑设备的功能。

磁盘存储器的管理

磁盘性能简述

  • 数据的组织和格式
    磁盘设备可包括一或多个物理盘片,每个磁盘片分一个或两个存储面(surface)。每个磁盘面被组织成若干个同心环,这种环称为磁道(track),各磁道之间留有必要的间隙。为使处理简单起见,在每条磁道上可存储相同数目的二进制位。磁盘密度即每英寸中所存储的位数,显然是内层磁道的密度较外层磁道的密度高。每条磁道又被逻辑上划分成若干个扇区(sectors),一个扇区称为一个盘块(或数据块),常常叫做磁盘扇区。各扇区之间保留一定的间隙。

  • 一个物理记录存储在一个扇区上,磁盘上存储的物理记录块数目是由扇区数、磁道数以及磁盘面数所决定的。为了提高磁盘的存储容量,充分利用磁盘外面磁道的存储能力,现代磁盘不再把内外磁道划分为相同数目的扇区。而是利用外层磁道容量较内层磁道大的特点,将盘面划分成若干条环带,使得同一环带内的所有磁道具有相同的扇区数。显然,外层环带的磁道拥有较内层环带的磁道更多的扇区。为了减少这种磁道和扇区在盘面分布的几何形式变化对驱动程序的影响,大多数现代磁盘都隐藏了这些细节。向操作系统提供虚拟几何的磁盘规格,而不是实际的物理几何规格。

  • 为了在磁盘上存储数据,必须先将磁盘低级格式化。其中每条磁道含有 30 个固定大小的扇区,每个扇区容量 为 600 个字节,其中 512 个字节存放数据,其余的用于存放控制信息。每个扇区包括两个字段: 标识符字段,其中SYNCH具有特定的位图像,作为该字段的定界符,利用磁道号,磁头号及扇区号三者来标识一个扇区;CRC 字段用于段校验。数据字段,其中可存放 512 个字节的数据。

    磁盘格式化完成后,一般要对磁盘分区。在逻辑上,每个分区就是一个独立的逻辑磁盘。每个分区的起始扇区和大小都记录在磁盘 0 扇区的主引导记录分区表所包含的分区表中。在这个分区表中必须有一个分区被标记成活动的,以保证能够从硬盘引导系统。 但是,在真正可以使用磁盘前,还需要对磁盘进行一次高级格式化,即设置一个引导块、空闲存储管理、根目录和一个空文件系统,同时在分区表中标记该分区所使用的文件系统。

  • 磁盘的类型
    硬盘和软盘

    单片盘和多片盘

    固定头磁盘:这种磁盘在每条磁道上都有一读/写磁头,所有的磁头都被装在一刚性磁臂中。通过这些磁头可访问所有各磁道,进行并行读/写,有效地提高了磁盘的 I/O 速度。 这种结构的磁盘主要用于大容量磁盘上。

    移动头磁盘:每一个盘面仅配有一个磁头,也被装入磁臂中。 为能访问该盘面上的所有磁道,该磁头必须能移动以进行寻道。可见,移动磁头仅能以串行方式读/写,致使其 I/O 速度较慢; 但由于其结构简单,故仍广泛应用于中小型磁盘设备中。在微型机上配置的温盘和软盘都采用移动磁头结构。

  • 磁盘访问时间
    磁盘设备在工作时以恒定速率旋转。为了读或写,磁头必须能移动到所要求的磁道上,并等待所要求的扇区的开始位置旋转到磁头下,然后再开始读或写数据。

    寻道时间 Ts:这是指把磁臂(磁头)移动到指定磁道上所经历的时间。 该时间是启动磁臂的时间 s 与磁头移动 n 条磁道所花费的时间之和, Ts = m×n + s 其中,m 是一常数,与磁盘驱动器的速度有关,对于一般磁盘,m = 0.2;对于高速磁盘,m ≤0.1,磁臂的启动时间约为 2 ms。

    旋转延迟时间 Tr :这是指定扇区移动到磁头下面所经历的时间。 不同的磁盘类型中,旋转速度至少相差一个数量级,甚至更高。

    传输时间 Tt:这是指把数据从磁盘读出或向磁盘写入数据所经历的时间。Tt的大小与每次所读/写的字节数b和旋转速度有关: Tt= b/ rN 其中,r为磁盘每秒钟的转数;N 为一条磁道上的字节数,当一次读/写的字节数相当于半条磁道上的字节数时,Tt 与 Tr相同。

    因此,可将访问时间 Ta表示为 Ta=Ts+1/2r+b/rN。在访问时间中,寻道时间和旋转延迟时间基本上都与所读/写数据的多少无关,而且它通常占据了访问时间中的大头。适当地集中数据(不要太零散)传输,将有利于提高传输效率。

磁盘调度

  • 先来先服务(FCFS,First Come First Served) :这是一种最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。 公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。 适用于请求磁盘 I/O 的进程数目较少的场合。

  • 最短寻道时间优先(SSTF,Shortest Seek Time First) :其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短 但这种算法不能保证平均寻道时间最短。

  • 扫描(SCAN)算法:SSTF 算法虽然能获得较好的寻道性能,但却可能导致某个进程发生“饥饿” (Starvation) 现象 。 因为只要不断有新进程的请求到达,且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的 I/O请求必然优先满足。SCAN算法算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。要访问的磁道在当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现象。由于在这种算法中磁头移动的规律颇似电梯的运行,因而又常称之为电梯调度算法。

  • 循环扫描(CSCAN)算法 :SCAN 存在这样的问题:当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完所有要访问的磁道后,才处理该进程的请求 致使该进程的请求被大大地推迟。 为了减少这种延迟,CSCAN 算法规定磁头单向移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问的磁道 ,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。

  • NStepSCAN 算法
    在 SSTF、 SCAN 及 CSCAN几种调度算法中,都可能会出现磁臂停留在某处不动的情况,从而垄断了整个磁盘设备。 我们把这一现象称为“磁臂粘着” (Armstickiness)。在高密度磁盘上容易出现此情况。 N 步 SCAN 算法是将磁盘请求队列分成若干个长度为 N 的子队列,磁盘调度将按 FCFS 算法依次处理这些子队列。 而每处理一个队列时又是SCAN 算法,对一个队列处理完后,再处理其他队列。当正在处理某子队列时,如果又出现新的磁盘 I/O 请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。 当 N 值取得很大时,会使N 步扫描法的性能接近于SCAN 算法的性能;当 N=1 时,N 步 SCAN 算法便蜕化为 FCFS 算法。

  • FSCAN 算法
    FSCAN 算法实质上是 N 步 SCAN 算法的简化,即 FSCAN 只将磁盘请求队列分成两个子队列。一个是由当前所有请求磁盘 I/O 的进程形成的队列,由磁盘调度按 SCAN 算法进行处理。 在扫描期间,将新出现的所有请求磁盘 I/O的进程,放入另一个等待处理的请求队列。 这样,所有的新请求都将被推迟到下一次扫描时处理。

磁盘高速缓存(Disk Cache)

  • 指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。 因此,这里的高速缓存是一组在逻辑上属于磁盘,而物理上是驻留在内存中的盘块。在内存中开辟一个单独的存储空间来作为磁盘高速缓存,其大小是固定的,不会受应用程序多少的影响。

  • 把所有未利用的内存空间变为一个缓冲池,供请求分页系统和磁盘 I/O 时(作为磁盘高速缓存)共享。此时,高速缓存的大小显然不再是固定的。当磁盘 I/O 的频繁程度较高时,该缓冲池可能包含更多的内存空间;而在应用程序运行得较多时,该缓冲池可能只剩下较少的内存空间。

  • 数据交付(Data Delivery)
    指将磁盘高速缓存中的数据传送给请求者进程。当有一进程请求访问某个盘块中的数据时,由核心先去查看磁盘高速缓冲器,看其中是否存在进程所需访问的盘块数据的拷贝。若有其拷贝,便直接从高速缓存中提取数据交付给请求者进程, 这样,就避免了访盘操作,从而使本次访问速度提高;否则,应先从磁盘中将所要访问的数据读入并交付给请求者进程,同时也将数据送高速缓存。当以后又需要访问该盘块的数据时,便可直接从高速缓存中提取。

  • 数据交付。这是直接将高速缓存中的数据,传送到请求者进程的内存工作区中。

  • 指针交付。将指向高速缓存中某区域的指针交付给请求者进程。由于所传送的数据量少,因而节省了数据从磁盘高速缓存到进程的内存工作区的时间。

  • 置换算法
    访问频率:通常,每执行一条指令时,便可能访问一次联想存储器,亦即联想存储器的访问频率, 基本上与指令执行的频率相当。 而对高速缓存的访问频率,则与磁盘I/O 的频率相当。 因此,对联想存储器的访问频率远远高于对高速缓存的访问频率。

    预见性

  • 数据的一致性
    在有的系统中将高速缓存中的所有盘块数据拉成一条 LRU 链。对于那些会严重影响到数据一致性的盘块数据和很久都可能不再使用的盘块数据,都放在 LRU 链的头部,使它们被优先写回磁盘,以减少发生数据不一致性的概率,或者可以尽早地腾出高速缓存的空间。 对于那些可能在不久之后便要再使用的盘块数据,应挂在 LRU链的尾部,以便在不久以后需要时,只要该数据块尚未从链中移至链首而被写回磁盘,便可直接到高速缓存中(即 LRU 链中)去找到它们。

  • 周期性地写回磁盘
    LRU 链意味着链中任一元素在被访问之后,总是又被挂到链尾而不被写回磁盘;只是一直未被访问的元素,才有可能移到链首,而被写回磁盘,为了解决这一问题,在 UNIX系统中专门增设了一个修改(update)程序,使之在后台运行,该程序周期性地调用一个系统调用 SYNC,该调用的主要功能是强制性地将所有在高速缓存中已修改的盘块数据写回磁盘。 这样, 因系统故障所造成的工作损失不会超过30 s的劳动量。在MS-DOS中所采用的方法是: 只要高速缓存中的某盘块数据被修改,便立即将它写回磁盘,并将这种高速缓存称为“写穿透高速缓存”(write-through cache)。 MS-DOS所采用的写回方式,几乎不会造成数据的丢失,但须频繁地启动磁盘。

提高磁盘 I/O 速度的其它方法

  • 提前读(Read-ahead)
    用户(进程)对文件进行访问时,经常采用顺序访问方式,即顺序地访问文件各盘块的数据。在这种情况下,在读当前块时可以预知下一次要读的盘块。因此,可以采取预先读方式,即在读当前块的同时,还要求将下一个盘块(提前读的块)中的数据也读入缓冲区。 这样,当下一次要读该盘块中的数据时,由于该数据已被提前读入缓冲区,因而此时便可直接从缓冲区中取得下一盘块的数据,而不需再去启动磁盘I/O,从而大大减少了读数据的时间。 这也就等效于提高了磁盘 I/O 的速度。

  • 延迟写
    延迟写是指在缓冲区 A 中的数据,本应立即写回磁盘,但考虑到该缓冲区中的数据在不久之后可能还会再被本进程或其它进程访问(共享资源) ,因而并不立即将该缓冲区 A中的数据写入磁盘,而是将它挂在空闲缓冲区队列的末尾。 随着空闲缓冲区的使用,缓冲区也缓缓往前移动,直至移到空闲缓冲队列之首。当再有进程申请到该缓冲区时,才将该缓冲区中的数据写入磁盘,而把该缓冲区作为空闲缓冲区分配出去。 当该缓冲区A仍在队列中时,任何访问该数据的进程,都可直接读出其中的数据而不必去访问磁盘。

  • 优化物理块的分布
    使磁头的移动距离最小。 虽然链接分配和索引分配方式都允许将一个文件的物理块分散在磁盘的任意位置,但如果将一个文件的多个物理块安排得过于分散,会增加磁头的移动距离。如果我们将这两个数据块安排在属于同一条磁道的两个盘块上,显然会由于消除了磁头在磁道间的移动而大大提高对这两个盘块的访问速度。

    对文件盘块位置的优化,应在为文件分配盘块时进行。 如果系统中的空白存储空间是采用位示图方式表示的则要将同属于一个文件的盘块安排在同一条磁道上或相邻的磁道上是十分容易的事。 这时,只要从位示图中找到一片相邻接的多个空闲盘块即可。但当系统采用线性表(链)法来组织空闲存储空间时,要为一文件分配多个相邻接的盘块,就要困难一些。此时,我们可以将在同一条磁道上的若干个盘块组成一簇,在分配存储空间时,以簇为单位进行分配。这样就可以保证在访问这几个盘块时,不必移动磁头或者仅移动一条磁道的距离,从而减少了磁头的平均移动距离。

  • 虚拟盘
    所谓虚拟盘,是指利用内存空间去仿真磁盘,又称为 RAM 盘。该盘的设备驱动程序也可以接受所有标准的磁盘操作,但这些操作的执行,不是在磁盘上而是在内存中。 这些对用户都是透明的。它是易失性存储器,故一旦系统或电源发生故障,或系统再启动时,原来保存在虚拟盘中的数据将会丢失。因此,虚拟盘通常用于存放临时文件,如编译程序所产生的目标程序等。 虚拟盘中的内容完全由用户控制,而高速磁盘缓存中的内容则是由 OS 控制的

廉价磁盘冗余阵列 (RAID,Redundant Array of Inexpensive Disk)

  • 它是利用一台磁盘阵列控制器,来统一管理和控制一组(几台到几十台)磁盘驱动器,组成一个高度可靠的、快速的大容量磁盘系统。

  • 并行交叉存取:为了提高对磁盘的访问速度,已把在大、中型机中应用的交叉存取(Interleave)技术应用到了磁盘存储系统中。在该系统中,有多台磁盘驱动器,系统将每一盘块中的数据分为若干个子盘块数据,再把每一个子盘块的数据分别存储到各个不同磁盘中的相同位置上。当要将一个盘块的数据传送到内存时,采取并行传输方式,将各个盘块中的子盘块数据同时向内存中传输,从而使传输时间减少。

  • RAID 的分级
    RAID 0级。 本级仅提供了并行交叉存取。它虽能有效地提高磁盘 I/O速度,但并无冗余校验功能,致使磁盘系统的可靠性不好。 只要阵列中有一个磁盘损坏,便会造成不可弥补的数据丢失,故较少使用。

    RAID1级。 它具有磁盘镜像功能,在每次访问磁盘时,可利用并行读、写特性,将数据分块同时写入主盘和镜像盘。故其比传统的镜像盘速度快,但其磁盘容量的利用率只有 50%,它是以牺牲磁盘容量为代价的

    RAID 3级。这是具有并行传输功能的磁盘阵列。 它利用一台奇偶校验盘来完成数据的校验功能,比起磁盘镜像,它减少了所需要的冗余磁盘数。

    RAID3级经常用于科学计算和图像处理。

    RAID 5级。这是一种具有独立传送功能的磁盘阵列。每个驱动器都各有自己独立的数据通路,独立地进行读/写,且无专门的校验盘。用来进行纠错的校验信息,是以螺旋 (Spiral)方式散布在所有数据盘上。 RAID 5 级常用于 I/O 较频繁的事务处理中。

    RAID 6级和RAID 7级。 这是强化了的 RAID。在 RAID 6级的阵列中,设置了一个专用的、可快速访问的异步校验盘。该盘具有独立的数据访问通路,具有比 RAID 3 级及 RAID 5 级更好的性能,但其性能改进得很有限,且价格昂贵。 RAID 7级是对 RAID 6 级的改进,在该阵列中的所有磁盘,都具有较高的传输速率和优异的性能 是目前最高档次的磁盘阵列,但其价格也较高。

  • RAID 的优点
    可靠性高: 除了 RAID 0 级外,其余各级都采用了容错技术。当阵列中某一磁盘损坏时,并不会造成数据的丢失,因为它既可实现磁盘镜像,又可实现磁盘双工,还可实现其它的冗余方式。所以此时可根据其它未损坏磁盘中的信息,来恢复已损坏的盘中的信息。 它与单台磁盘机相比,其可靠性高出了一个数量级。

    磁盘 I/O速度高:由于磁盘阵列可采取并行交叉存取方式,故可将磁盘 I/O 速度提高 N-1 倍(N 为磁盘数目)。

    性能/价格比高:利用 RAID技术来实现大容量高速存储器时 其体积与具有相同容量和速度的大型磁盘系统相比,只是后者的 1/3 价格也只是后者的 1/3,且可靠性高

发布了30 篇原创文章 · 获赞 1 · 访问量 403

猜你喜欢

转载自blog.csdn.net/weixin_46265246/article/details/105116657