1. I/O系统的功能、模型和接口

I/O系统管理的主要对象是I/O设备和相应的设备控制器。

  • 最主要的任务是,完成用户提出的I/O请求,提高I/O速率,以及提高设备的利用率,并能为更高层的进程方便地使用这些设备提供手段。

1.1 I/O系统的基本功能

隐藏物理设备的细节:

  • I/O设备的类型非常多,且彼此间在多方面都有差异,诸如它们接收和产生数据的速度,传输方向、粒度、数据的表示形式及可靠性等方面。

与设备的无关性:

  • 隐藏物理设备的细节,在早期的OS中就已实现,它可方便用户对设备的使用。

  • 与设备的无关性是在较晚时才实现的,这是在隐藏物理设备细节的基础上实现的。

以上功能方便了用户使用IO设备。

提高处理机和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通道方式。

以上功能提高CPU和IO设备的利用率。

确保对设备的正确共享:

  • 从设备的共享属性上,可将系统中的设备分为如下两类:

    • 独占设备,进程应互斥地访问这类设备,即系统一旦把这类设备分配给了某进程后,便由该进程独占,直至用完释放。

      典型的独占设备有打印机、磁带机等。系统在对独占设备进行分配时,还应考虑到分配的安全性。

    • 共享设备,是指在一段时间内允许多个进程同时访问的设备。

      典型的共享设备是磁盘,当有多个进程需对磁盘执行读、写操作时,可以交叉进行,不会影响到读、写的正确性。

错误处理:

  • 大多数的设备都包括了较多的机械和电气部分,运行时容易出现错误和故障。

  • 从处理的角度,可将错误分为临时性错误和持久性错误。对于临时性错误,可通过重试操作来纠正,只有在发生了持久性错误时,才需要向上层报告。

以上功能是为用户在共享设备使用时提供方便。

1.2 I/O系统的层次结构和模型

I/O软件的层次结构:

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

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

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

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

I/O系统中各种模块之间的层次视图:

  • I/O系统的上、下接口:

    I/O系统接口。

    • 它是IO系统与上层系统之间的接口,向上层提供对设备进行操作的抽象 UO 命令,以方便高层对设备的使用。

    • 有不少OS在用户层提供了与IO操作有关的库函数,供用户使用。在上层系统中有文件系统、虚拟存储器系统以及用户进程等。

    软件/硬件接口(RW/HW):

    • 在软件/硬件接口的上面是中断处理程序和用于不同设备的设备驱动程序。

    • 在软件/硬件接口的下面是各种设备的控制器。如CD-ROM 控制器、硬盘控制器、键盘控制器、打印机控制器、网络控制器等,它们都属于硬件。由于设备种类繁多,故该接口相当复杂。

  • I/O系统的分层:

    中断处理程序。

    • 它处于IO系统的底层,直接与硬件进行交互。

    • 当有IO设备发来中断请求信号时,在中断硬件做了初步处理后,便转向中断处理程序。

    • 它首先保存被中断进程的 CPU环境,然后转入相应设备的中断处理程序进行处理,在处理完成后,又恢复被中断进程的 CPU环境,返回断点继续运行。

    设备驱动程序。

    • 它处于IO系统的次底层,是进程和设备控制器之间的通信程序,其主要功能是,将上层发来的抽象IO请求转换为对IO设备的具体命令和参数,并把它装入到设备控制器中的命令和参数寄存器中,或者相反。

    • 由于设备之间的差异很大,每类设备的驱动程序都不相同,故必须由设备制造厂商提供,而不是由OS设计者来设计。

    • 因此,每当在系统中增加一个新设备时,都需要由安装厂商提供新的驱动程序。

    设备独立性软件。

    • 现代OS中的IO系统基本上都实现了与设备无关性,也称为与设备无关的软件。

    • 其基本含义是:IO软件独立于具体使用的物理设备。

    • 由此带来的最大好处是,提高了IO系统的可适应性和可扩展性。使它们能应用于许多类型的设备,而且在每次增加新设备或替换老设备时,都不需要对O软件进行修改,这样就方便了系统的更新和扩展。

    • 设备独立性软件的内容包括设备命名、设备分配、数据缓冲和数据高速缓冲一类软件等。

1.3 I/O系统接口

块设备接口:

块设备接口是块设备管理程序与高层之间的接口。该接口反映了大部分磁盘存储器和光盘存储器的本质特征,用于控制该类设备的输入或输出。

  • 块设备。

    • 块设备指数据的存取和传输都是以数据块为单位的设备。

    • 典型的块设备是磁盘。该设备的基本特征是传输速率较高,通常每秒钟为数MB到数十MB。另一特征是可寻址,即能指定数据的输入源地址及输出的目标地址,可随机地读写磁盘中计任一块;磁盘设备的IO常采用DMA方式。

  • 隐藏了磁盘的二维结构。

    • 块设备接口将磁盘上的所有扇区从0到n-1依次编号,n是磁盘中的扇区总数。

    • 经过这样编号后,就把磁盘的二维结构改变为一种线性序列。

    • 在二维结构中,每个扇区的地址需要用磁道号和扇区号来表示。或者说,块设备接口隐藏了磁作昏统盘地址是二维结构的情况。

  • 将抽象命令映射为低层操作。

    • 块设备接口支持上层发来的对文件或设备的打开、读、写和关闭等抽象命令。

    • 该接口将上述命令映射为设备能识别的较低层具体操作。

    • 例如,上层发来读磁盘命令时,它先将抽象命令中的逻辑块号转换为磁盘的盘面、磁道和扇区等虚拟存储器系统也需要使用块设备接口,因为在进程运行期间,每当它所访问的页面不在内存时便会发生缺页中断,此时就需要利用O系统,通过块设备接口从磁盘存储器中将所缺之页面调入内存。

流设备接口:

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

  • 字符设备。

    • 字符设备是指数据的存取和传输是以字符为单位的设备,如键盘、打印机等。

    • 字符设备的基本特征是传输速率较低,通常为每秒几个字节至数千字节。另一特征是不可寻址,即不能指定数据的输入源地址及输出的目标地址。

    • 字符设备在输入输出时,常采用中断驱动方式。

  • get和put操作。

    • 由于字符设备是不可寻址的,因而对它只能采取顺序存取方式。

    • 通常是为字符设备建立一个字符缓冲区(队列),设备的IO字符流顺序地进入字符缓冲区(读入),或从字符缓冲区顺序地送出到设备(输出)。

    • 用户程序获取或输出字符的方法是采用get和 put 操作。

    • get操作用于从字符缓冲区取得一个字符(到内存),将它返回给调用者。

    • put操作则用于把一个新字符(从内存)输出到字符缓冲区中,以待送出到设备。

  • in-control指令。

    • 因字符设备的类型非常多,且差异甚大,为了以统一的方式来处理它们,通常在流设备接口中提供了一种通用的in-control指令,在该指令中包含了许多参数,每个参数表示一个与具体设备相关的特定功能。

由于大多数流设备都属于独占设备,必须采取互斥方式实现共享,为此,流设备接口提供了打开和关闭操作。在使用这类设备时,必须先用打开操作来打开设备。如果设备已被打开,则表示它正被其它进程使用。

网络通信接口:

  • 在现代OS中,都提供了面向网络的功能。首先还需要通过某种方式把计算机连接到网络上。同时操作系统也必须提供相应的网络软件和网络通信接口,使计算机能通过网络与网络上的其它计算机进行通信或上网浏览。

  • 由于网络通信接口涉及到许多关于网络方面的知识,如网络中的网络通信协议和网络的层次结构等。

2. I/O设备和设备控制器

I/O设备一般是由执行I/O操作的机械部分和执行控制I/O的电子部件组成。

  • 通常将这两部分分开,执行I/O操作的机械部分就是一般的I/O设备,而执行控制I/O的电子部件则称为设备控制器或适配器(adapter)。

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

  • 在有的大、中型计算机系统中,还配置了I/O通道或I/O处理机。

2.1 I/O设备

I/O 设备的类型:

  • 按使用特性分类。

    • 第一类是存储设备,也称外存、辅存,是用以存储信息的主要设备。该类设备存取速度较内存慢,但容量却大得多,价格也便宜。

    • 第二类就是IO设备,它又可分为输入设备、输出设备和交互式设备。输入设备用来接收外部信息,如键盘、鼠标、扫描仪、视频摄像等。

输出设备用于将计算机处理后的信息送向处理机外部的设备,如打印机、绘图仪等。

交互式设备则是指集成的上述两类设备,主要是显示器,用于同步显示用户命令以及命令执行的结果。

  • 按传输速率分类。

    • 第一类是低速设备,其传输速率仅为每秒钟几个字节至数百个字节。典型的低速设备有键盘、鼠标器。

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

    • 第三类是高速设备,其传输速率在数十万字节至千兆字节。典型的高速设备有磁带机、磁盘机、光盘机等。

  • 设备与控制器之间的接口。

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

    数据信号线。

    • 这类信号线用于在设备和设备控制器之间传送数据信号。

    • 对输入设备而言,由外界输入的信号经转换器转换后,所形成的数据通常先送入缓冲器中,当数据量达到一定的比特(字符)数后,再从缓冲器通过一组数据信号线传送给设备控制器。

    • 对输出设备而言,则是将从设备控制器经过数据信号线传送来的一批数据先暂存于缓冲器中,经转换器作适当转换后,再逐个字符地输出。

    控制信号线。

    • 这是作为由设备控制器向IO设备发送控制信号时的通路。

    • 该信号规定了设备将要执行的操作,如读操作(指由设备向控制器传送数据)或写操作(从控制器接收数据),或执行磁头移动等操作。

    状态信号线。

    • 该信号线用于传送指示设备当前状态的信号。

    • 设备的当前状态有正在读(或写);设备已读(写)完成,并准备好新的数据传送。

2.2 设备控制器

设备控制器的主要功能是,控制一个或多个O设备,以实现O设备和计算机之间的数据交换。

它是CPU与IO设备之间的接口,接收从CPU发来的命令,去控制IO设备工作,使处理机能够从繁杂的设备控制事务中解脱出来。

设备控制器是一个可编址的设备当它仅控制一个设备时,它只有一个唯一的设备地址;若控制器可连接多个设备,则应含有多个设备地址,每一个设备地址对应一个设备。

可把设备控制器分成两类:一类是用于控制字符设备的控制器,另一类是用于控制块设备的控制器。

设备控制器的基本功能:

  • 接收和识别命令。

    设备控制器能接收并识别处理机发来的多种命令。

    在控制器中具有相应的控制寄存器,用来存放接收的命令和参数,并对所接收的命令进行译码。

    例如,磁盘控制器可以接收CPU发来的read、write、format等15 条不同的命令,而且有些命令还带有参数。相应地,在磁盘控制器中有多个寄存器和命令译码器等。

  • 数据交换。

    设备控制器可实现 CPU与控制器之间、控制器与设备之间的数据交换。

    对于前者,是通过数据总线,由CPU并行地把数据写入控制器,或从控制器中并行地读出数据。

    对于后者,是设备将数据输入到控制器,或从控制器传送给设备。为此,在控制器中须设置数据寄存器。

  • 标识和报告设备的状态。

    控制器应记下设备的状态供CPU了解。

    例如,仅当该设备处于发送就绪状态时,CPU才能启动控制器从设备中读出数据。

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

  • 地址识别。

    就像内存中的每一个单元都有一个地址一样,系统中的每一个设备也都有一个地址。

    设备控制器必须能够识别其所控制的每个设备的地址。

    此外,为使CPU能向(或从)寄存器中写入(或读出)数据,这些寄存器都应具有唯一的地址。

    控制器应能正确识别这些地址。为此,在控制器中应配置地址译码器。

  • 数据缓冲区。

    由于 IO 设备的速率较低,而 CPU 和内存的速率却很高,故在控制器中必须设置一缓冲区。

    在输出时,用此缓冲区暂存由主机高速传来的数据,然后才以与IO 设备所匹配的速率将缓冲器中的数据传送给 IO 设备。

    在输入时,缓冲区则用于暂存从IO 设备送来的数据,待接收到一批数据后,再将缓冲区中的数据高速地传送给主机。

  • 差错控制。

    对于由IO设备传送来的数据,设备控制器还兼管进行差错检测。

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

    这样便可保证数据输入的正确性。

设备控制器的组成:

  • 设备控制器与处理机的接口。

    该接口用于实现CPU与设备控制器之间的通信,在该接口中共有三类信号线:数据线、地址线和控制线

    数据线通常与两类寄存器相连接:

    • 第一类是数据寄存器,在控制器中可以有一个或多个数据寄存器,用于存放从设备送来的数据(输入),或从 CPU 送来的数据(输出)。

    • 第二类是控制/状态寄存器,在控制器中可以有一个或多个这类寄存器,用于存放从CPU送来的控制信息或设备的状态信息。

  • 设备控制器与设备的接口。

    在一个设备控制器上,可以连接一个或多个设备。

    相应的,在控制器中便有一个或多个设备接口。在每个接口中都存在数据、控制和状态三种类型的信号。

    控制器中的IO逻辑根据处理机发来的地址信号去选择一个设备接口。

  • I/O 逻辑。

    IO 逻辑用于实现对设备的控制。它通过一组控制线与处理机交互,处理机利用该逻辑向控制器发送IO命令。

    每当CPU要启动一个设备时,一方面将启动命令发送给控制器,另一方面又同时通过地址线把地址发送给控制器,由控制器的O逻辑对收到的地址进行译码,再根据所译出的命令对所选设备进行控制。

2.3 内存映像I/O

利用特定的I/O指令:

  • 在早期的计算机中,包括大型计算机,为实现CPU和设备控制器之间的通信,为每个控制寄存器分配一个I/O端口,这是一个8位或16位的整数。

内存映像I/O:

  • 在这种方式中,在编址上不再区分内存单元地址和设备控制器中的寄存器地址,都采用k。当k值处于0~n-1范围时,被认为是内存地址,若k大于等于n时,被认为是某个控制器的寄存器地址。

2.4 I/O通道

I/O通道设备的引入:

  • 虽然在CPU与I/O设备之间增加了设备控制器后,已能大大减少CPU对I/O的干预,但当主机所配置的外设很多时,CPU的负担仍然很重。为此,在CPU和设备控制器之间又增设了I/O通道(I/O Channel)。

  • 实际上,IO通道是一种特殊的处理机。它具有执行IO指令的能力,并通过执行通道(IO)程序来控制 IO 操作。

  • 但 IO 通道又与一般的处理机不同,主要表现在以下两个方面:

    • 一是其指令类型单一,这是由于通道硬件比较简单,其所能执行的命令,主要局限于与IO操作有关的指令;

    • 二是通道没有自己的内存,通道所执行的通道程序是放在主机的内存中的,换言之,是通道与CPU共享内存。

通道类型:

  • 字节多路通道(Byte Multiplexor Channel)。

    • 这是一种按字节交叉方式工作的通道。它通常都含有许多非分配型子通道,其数量可从几十到数百个,每一个子通道连接一台I/O设备,并控制该设备的I/O操作。

    • 这些子通道按时间片轮转方式共享主通道。

  • 数组选择通道(Block Selector Channel)。

    • 字节多路通道不适于连接高速设备,这推动了按数组方式进行数据传送的数组选择通道的形成。

    • 这种通道虽然可以连接多台高速设备,但由于它只含有一个分配型子通道,在一段时间内只能执行一道通道程序,控制一台设备进行数据传送,致使当某台设备占用了该通道后,便一直由它独占,即使是它无数据传送,通道被闲置,也不允许其它设备使用该通道,直至该设备传送完毕释放该通道。

    • 这种通道的利用率很低。

  • 数组多路通道(Block Multiplexor Channel)。

    • 数组选择通道虽有很高的传输速率,但它却每次只允许一个设备传输数据。

    • 数组多路通道是将数组选择通道传输速率高和字节多路通道能使各子通道(设备)分时并行操作的优点相结合而形成的一种新通道。

“瓶颈”问题:

  • 由于通道价格昂贵,致使机器中所设置的通道数量势必较少,这往往又使它成了I/O的瓶颈,进而造成整个系统吞吐量的下降。

  • 解决“瓶颈”问题的最有效的方法,便是增加设备到主机间的通路而不增加通道。

3. 中断机构和中断处理程序

中断在操作系统中有着特殊重要的地位,它是多道程序得以实现的基础,没有中断,就不可能实现多道程序,因为进程之间的切换是通过中断来完成的。

中断也是设备管理的基础,为了提高处理机的利用率和实现CPU与I/O设备并行执行,也必需有中断的支持。中断处理程序是I/O系统中最低的一层,它是整个I/O系统的基础。

3.1 中断简介

中断:

  • 中断是指 CPU 对 IO 设备发来的中断信号的一种响应。

  • CPU暂停正在执行的程序,保留 CPU环境后,自动地转去执行该JO 设备的中断处理程序。

  • 执行完后,再回到断点,继续执行原来的程序。

  • IO设备可以是字符设备,也可以是块设备、通信设备等。

  • 由于中断是由外部设备引起的,故又称外中断。

陷入:

  • 另外还有一种由 CPU 内部事件所引起的中断,例如进程在运算中发生了上溢或下溢又如程序出错,如非法指令、地址越界,以及电源故障等。

  • 通常把这类中断称为内中断或陷入(trap)。

  • 与中断一样,若系统发现了有陷入事件,CPU也将暂停正在执行的程序,转去执行该陷入事件的处理程序。

  • 中断和陷入的主要区别是信号的来源,即是来自CPU外部,还是 CPU 内部。

中断向量表:

  • 为了处理上的方便,通常是为每种设备配以相应的中断处理程序,并把该程序的入口地址放在中断向量表的一个表项中,并为每一个设备的中断请求规定一个中断号,它直接对应于中断向量表的一个表项中。

  • 当IO设备发来中断请求信号时,由中断控制器确定该请求的中断号,根据该设备的中断号去查找中断向量表,从中取得该设备中断处理程序的入口地址,这样便可以转入中断处理程序执行。

中断优先级:

  • 实际上经常会有多个中断信号源,每个中断源对服务要求的紧急程度并不相同,例如,键盘终端的中断请求的紧急程度不如打印机,而打印机中断请求的紧急程度又不如磁盘等。

  • 为此,系统就需要为它们分别规定不同的优先级。

对多中断源的处理方式:

对于多中断信号源的情况,当处理机正在处理一个中断时,又来了一个新的中断请求,这时应如何处理。

例如,当系统正在处理打印机中断时,又收到了优先级更高的磁盘中断信号。对于这种情况,可有两种处理方式:屏蔽(禁止)中断与嵌套中断。

  • 屏蔽(禁止)中断。

    • 当处理机正在处理一个中断时,将屏蔽掉所有的中断,即处理机对任何新到的中断请求,都暂时不予理睬,而让它们等待。

    • 直到处理机已完成本次中断的处理后,处理机再去检查是否有中断发生。

    • 若有,再去处理新到的中断,若无,则返回被中断的程序。

    • 在该方法中,所有中断都将按顺序依次处理。其优点是简单,但不能用于对实时性要求较高的中断请求。

  • 嵌套中断。

    在设置了中断优先级的系统中,通常按这样的规则来进行优先级控制:

    • 当同时有多个不同优先级的中断请求时,CPU 优先响应最高优先级的中断请求;

    • 高优先级的中断请求可以抢占正在运行的低优先级中断的处理机,该方式类似于基于优先级的抢占式进程调度。

    例如,处理机正在处理打印机中断,当有磁盘中断到来时,可暂停对打印机中断的处理,转去处理磁盘中断。

    如果新到的是键盘中断,由于它的优先级低于打印机的优先级,故处理机继续处理打印机中断。

3.2中断处理程序

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

中断处理程序的处理过程可分成以下几个步骤:

  • 测定是否有未响应的中断信号。

    每当设备完成一个字符(字或数据块)的读入(或输出),设备控制器便向处理机发送一个中断请求信号。

    请求处理机将设备已读入的数据传送到内存的缓冲区中(读入),或者请求处理机将要输出的数据(输出)传送给设备控制器。

    程序每当执行完当前指令后,处理机都要测试是否有未响应的中断信号。

    若没有,继续执行下条指令。若有,则停止原有进程的执行,准备转去执行中断处理程序,为把处理机的控制权转交给中断处理程序做准备。

  • 保护被中断进程的 CPU 环境。

    在把控制权转交给中断处理程序之前,需要先保护被中断进程的 CPU 环境,以便以后能恢复运行。

    首先需要保存的是,从中断现场恢复到当前进程运行所需要的信息。

    通常由硬件自动将处理机状态字(PSW)和保存在程序计数器(PC)中下一条指令的地址保存在中断保留区(栈)中。

    然后,把被中断进程的 CPU 现场信息,即将包括所有CPU寄存器的(如通用寄存器、段寄存器等)内容都压入中断栈中。

    因为在中断处理时可能会用到这些寄存器。

  • 转入相应的设备处理程序。

    由处理机对各个中断源进行测试,以确定引起本次中断的IO设备,并向提供中断信号的设备发送确认信号。

    在该设备收到确认信号后,就立即取消它所发出的中断请求信号。

    然后,将相应的设备中断处理程序的入口地址装入到程序计数器中。

    这样,当处理机运行时,便可自动地转向中断处理程序。

  • 中断处理。

    对不同的设备,有不同的中断处理程序。

    该程序首先从设备控制器中读出设备状态,以判别本次中断是正常完成中断还是异常结束中断。

    若是前者,中断程序便做结束处理。假如这次是字符设备的读操作,则来自输入设备的中断是表明该设备已经读入了一个字符(字)的数据,并已放入数据寄存器中。此时中断处理应将该数据传送给CPU,再将它存入缓冲区中,并修改相应的缓冲区指针,使其指向下一个内存单元。

    若还有命令,可再向控制器发送新的命令,进行新一轮的数据传送。若是异常结束中断,则根据发生异常的原因做相应的处理。

  • 恢复CPU的现场并退出中断。

    当中断处理完成以后,需要恢复CPU的现场,退出中断。但是,此刻是否返会到被中断的进程,取决于两个因素:

    • 本中断是否采用了屏蔽(禁止)中断方式,若是,就会返回被中断的进程。

    • 采用的是中断嵌套方式,如果没有优先级更高的中断请求IO,在中断完成后,仍会返回被中断的进程:反之,系统将处理优先级更高的中断请求。

    如果是要返回到被中断的进程,可将保存在中断栈中的被中断进程的现场信息取出,并装入到相应的寄存器中,其中包括该程序下一次要执行的指令的地址N+1、处理机状态字PSW,以及各通用寄存器和段寄存器的内容。

    这样,当处理机再执行本程序时,便从N+1处开始,最终返回到被中断的程序。

IO 操作完成后,驱动程序必须检查本次IO操作中是否发生了错误,并向上层软件告,最终向调用者报告本次IO的执行情况。

除了上述的第4步外,其它各步骤对所有JO设备都是相同的,因而对于某种操作系统,例如UNIX系统,是把这些共同的部分集中起来,形成中断总控程序。每当要进行中断处理时,都要首先进入中断总控程序。

而对于第4步,则对不同设备须采用不同的设备中断处理程序继续执行。

4. 设备驱动程序

设备处理程序通常又称为设备驱动程序,它是I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象I/O要求,如read或write命令,再把它转换为具体要求后,发送给设备控制器,启动设备去执行;反之,它也将由设备控制器发来的信号传送给上层软件。

由于驱动程序与硬件密切相关,故通常应为每一类设备配置一种驱动程序。例如,打印机和显示器需要不同的驱动程序。

4.1 设备驱动程序概述

设备驱动程序的功能:

  • 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列。

  • 检查用户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控制方式是中断驱动和DMA方式。

  • 由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言书写。目前有很多驱动程序的基本部分已经固化在ROM中。

  • 驱动程序应允许可重入。一个正在运行的驱动程序常会在一次调用完成前被再次调用。

设备处理方式:

  • 为每一类设备设置一个进程,专门用于执行这类设备的IO操作。比如,为所有的交互式终端设置一个交互式终端进程;又如,为同一类型的打印机设置一个打印进程。这种方式比较适合于较大的系统。

  • 在整个系统中设置一个IO进程,专门用于执行系统中所有各类设备的IO 操作。也可以设置一个输入进程和一个输出进程,分别处理系统中的输入或输出操作。

  • 不设置专门的设备处理进程,而只为各类设备设置相应的设备驱动程序,供用户或系统进程调用。这种方式目前用得较多。

4.2设备驱动程序的处理过程

设备驱动程序的主要任务是启动指定设备,完成上层指定的IO工作。但在启动之前应先完成必要的准备工作,如检测设备状态是否为“忙”等。在完成所有的准备工作后,才向设备控制器发送一条启动命令。

设备驱动程序的处理过程:

  • 将抽象要求转换为具体要求。

    • 通常在每个设备控制器中都含有若干个寄存器,分别用于暂存命令、参数和数据等。

    • 由于用户及上层软件对设备控制器的具体情况毫无了解,因而只能发出命令(抽象的要求),这些命令是无法传送给设备控制器的。

    • 因此,就需要将这些抽象要求转换为具体要求。例如,将抽象要求中的盘块号转换为磁盘的盘面、磁道号及扇区。而这一转换工作只能由驱动程序来完成,因为在OS中只有驱动程序才同时了解抽象要求和设备控制器中的寄存器情况,也只有它才知道命令、数据和参数应分别送往哪个寄存器。

  • 对服务请求进行校验。

    • 驱动程序在启动 IO 设备之前,必须先检查该用户的IO 请求是不是该设备能够执行的。

    • 一个非法请求的典型例子是,用户试图请求从一台打印机读入数据。如果驱动程序能检查出这类错误,便认为这次IO请求非法,它将向IO系统报告 IO 请求出错。

    • IO 系统可以根据具体情况做出不同的决定。如可以停止请求进程的运行,或者仅通知请求进程它的IO请求有错,但仍然让它继续运行。

    • 此外,还有些设备如磁盘和终端,它们虽然都是既可读、又可写的,但若在打开这些设备时规定的是读,则用户的 写请求必然被拒绝。

  • 检查设备的状态。

    启动某个设备进行IO操作,其前提条件应是该设备正处于就绪状态。

    为此,在每个设备控制器中,都配置有一个状态寄存器。驱动程序在启动设备之前要先把状态寄存器中的内容读入到CPU的某个寄存器中,通过测试寄存器中的不同位,来了解设备的状态。

  • 传送必要的参数。

    在确定设备处于接收(发送)就绪状态后,便可向控制器的相应寄存器传送数据及与控制本次数据传输有关的参数。

    例如,在某种设备控制器中配置了两个控制寄存器,其中一个是命令寄存器,用于存放处理机发来的各种控制命令,以决定本次IO 操作是接收数据还是发送数据等。

    另一个是方式寄存器,它用于控制本次传送数据的速率、发送的字符长度等。如果是利用RS232C 接口进行异步通信,在启动该接口之前,应先按通信规程设定下述参数:波特率、奇偶校验方式、停止位数目及数据字节长度等。

    对于较为复杂的块设备,除必须向其控制器发出启动命令外,还需传送更多的参数。

  • 启动IO设备。

    在完成上述各项准备工作后,驱动程序便可以向控制器中的命令寄存器传送相应的控制命令。

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

在多道程序系统中,驱动程序一旦发出IO命令,启动了一个IO操作后,驱动程序便把控制返回给 IO 系统,把自己阻塞起来,直到中断到来时再被唤醒。

具体的IO操作是在设备控制器的控制下进行的,因此,在设备忙于传送数据时,处理机又可以去干其它的事情,实现了处理机与IO设备的并行操作。

4.3 对I/O设备的控制方式

使用轮询的可编程I/O方式:

  • 处理机对I/O设备的控制采取轮询的可编程I/O方式,即在处理机向控制器发出一条I/O指令,启动输入设备输入数据时,要同时把状态寄存器中的忙/闲标志busy置为1,然后便不断地循环测试busy(称为轮询)。

  • 当busy=1时,表示输入机尚未输完一个字(符),处理机应继续对该标志进行测试,直至busy=0,表明输入机已将输入数据送入控制器的数据寄存器中。

  • 于是处理机将数据寄存器中的数据取出,送入内存指定单元中,这样便完成了一个字(符)的I/O。

  • 接着再去启动读下一个数据,并置busy=1。

使用中断的可编程I/O方式:

  • 当前,对I/O设备的控制,广泛采用中断的可编程I/O方式,即当某进程要启动某个I/O设备工作时,便由CPU向相应的设备控制器发出一条I/O命令,然后立即返回继续执行原来的任务。

  • 设备控制器于是按照该命令的要求去控制指定I/O设备。此时,CPU与I/O设备并行操作。

直接存储器访问方式:

  • 接存储器访问方式的引入。

    • 虽然中断驱动I/O比程序I/O方式更有效,但它仍是以字(节)为单位进行I/O的。每当完成一个字(节)的I/O时,控制器便要向CPU请求一次中断。

    • 采用中断驱动 IO方式时的CPU,是以字(节)为单位进行干预的。如果将这种方式用于块设备的IO,显然是极其低效的。例如,为了从磁盘中读出1KB的数据块,需要中断CPU1K次。为了进一步减少CPU对I/0的干预,而引入了直接存储器访问方式

    • 该方式的特点是:

      • 数据传输的基本单位是数据块,即在CPU与I/O设备之间,每次传送至少一个数据块。

      • 所传送的数据是从设备直接送入内存的,或者相反。

      • 仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在控制器的控制下完成的。可见,DMA方式较之中断驱动方式又进一步提高了CPU与I/O设备的并行操作程度。

  • DMA控制器的组成:

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

    为了实现在主机与控制器之间成块数据的直接交换,必须在DMA控制器中,设置如下四类寄存器:

    • 命令/状态寄存器CR,用于接收从CPU发来的IO命令,或有关控制信息,或设备的状态。

    • 内存地址寄存器MAR,在输入时,它存放把数据从设备传送到内存的起始目标地址,在输出时,它存放由内存到设备的内存源地址。

    • 数据寄存器DR,用于暂存从设备到内存,或从内存到设备的数据。

    • 数据计数器DC,存放本次CPU 要读或写的字(节)数。

  • DMA 工作过程:

    1. 当CPU要从磁盘读入一数据块时,便向磁盘控制器发送一条读命令。

    2. 该命令被送入命令寄存器CR中。同时,需要将本次要读入数据在内存的起始目标地址送入内存地址寄存器 MAR 中。

    3. 将要读数据的字(节)数送入数据计数器DC中。还须将磁盘中的源地址直接送至 DMA 控制器的 IO 控制逻辑上。

    4. 然后,启动 DMA 控制器进行数据传送。

    5. 以后,CPU便可去处理其它任务,整个数据传送过程由 DMA 控制器进行控制。当DMA 控制器已从磁盘中读入一个字(节)的数据,并送入数据寄存器DR后,再挪用一个存储器周期,将该字(节)传送到 MAR 所指示的内存单元中。

    6. 然后便对MAR 内容加1,将DC内容减1,若减1后DC内容不为0,表示传送未完,便继续传送下一个字(节):否则,由DMA控制器发出中断请求。

  • I/O通道控制方式:

    I/O通道控制方式的引入:

    • 虽然DMA方式比起中断方式来已经显著地减少了CPU的干预,即已由以字(节)为单位的干预减少到以数据块为单位的干预,但CPU每发出一条I/O指令,也只能去读(或写)一个连续的数据块。

    • 而当我们需要一次去读多个数据块且将它们分别传送到不同的内存区域,或者相反时,则须由CPU分别发出多条I/O指令及进行多次中断处理才能完成。

    • UO 通道方式是 DMA 方式的发展,它可进一步减少CPU的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。

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

    • 例如,当CPU要完成一组相关的读(或写)操作及有关控制时,只需向O通道发送一条IO指令,以给出其所要执行的通道程序的首址和要访问的O设备,通道接到该指令后,通过执行通道程序便可完成 CPU指定的IO任务。

    通道程序:

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

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

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

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

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

    • 记录结束标志R,R=0表示本通道指令与下一条指令所处理的数据是同属于一个记录:R=1表示这是处理某记录的最后一条指令。

5. 与设备无关的I/O软件

为了方便用户和提高OS的可适应性与可扩展性,在现代OS的I/O系统中,都无一例外地增加了与设备无关的I/O软件,以实现设备独立性,也称为设备无关性。

其基本含义是:应用程序中所用的设备,不局限于使用某个具体的物理设备。为每个设备所配置的设备驱动程序是与硬件紧密相关的软件。

5.1 与设备无关(Device Independence)软件的基本概念

以物理设备名使用设备:

  • 在早期OS中,应用程序在使用I/O设备时,都使用设备的物理名称,这使应用程序与系统中的物理设备直接相关。

引入了逻辑设备名:

  • 为了实现与设备的无关性而引入了逻辑设备和物理设备两个概念。逻辑设备是抽象的设备名。

逻辑设备名称到物理设备名称的转换:

  • 在应用程序中,用逻辑设备名称使用设备虽然方便了用户,但系统却只识别物理设备名称,因此在实际执行时,还必须使用物理名称。

  • 为此,在系统中,必须具有将逻辑设备名称转换为某物理设备名称的功能。

5.2 与设备无关的软件

设备驱动程序的统一接口:

  • 为了使所有的设备驱动程序有着统一的接口,一方面,要求每个设备驱动程序与OS之间都有着相同的接口,或者相近的接口,这样会使添加一个新的设备驱动程序变得很容易,同时在很大程度上方便了开发人员对设备驱动程序的编制。

  • 另一方面,要将抽象的设备名映射到适当的驱动程序上,或者说,将抽象的设备名转换为具体的物理设备名,并进一步可以找到相应物理设备的驱动程序入口。

  • 此外,还应对设备进行保护,禁止用户直接访问设备,以防止无权访问的用户使用。

缓冲管理:

  • 无论是字符设备还是块设备,它们的运行速度都远低于CPU的速度。

  • 为了缓和CPU和I/O设备之间的矛盾、提高CPU的利用率,在现代OS中都无一例外地分别为字符设备和块设备配置了相应的缓冲区。

  • 缓冲区有着多种形式,如单缓冲区、双缓冲区、循环缓冲区、公用缓冲池等,以满足不同情况的需要。

差错控制:

  • 由于设备中有着许多的机械和电气部分,因此,它们比主机更容易出现故障,这就导致I/O操作中的绝大多数错误都与设备有关。

  • 错误可分为如下两类: 暂时性错误。

    • 暂时性错误是因发生暂时性事件引起的,如电源的波动。它可以通过重试操作来纠正。

    持久性错误。

    • 持久性错误是由持久性故障引起的,如电源掉电、磁盘上有一条划痕或者在计算中发生除以零的情况等。持久性错误容易发现,有些错误是只要重复执行相同的程序就会再现的错误。

对独立设备的分配与回收:

  • 在系统中有两类设备:独占设备和共享设备。

  • 对于独占设备,为了避免诸进程对独占设备的争夺,必须由系统来统一分配,不允许进程自行使用。

  • 每当进程需要使用某(独占)设备时,必须先提出申请。OS接到对设备的请求后,先对进程所请求的独占设备进行检查,看该设备是否空闲。若空闲,才把该设备分配给请求进程。

  • 否则,进程将被阻塞,放入该设备的请求队列中等待。等到其它进程释放该设备时,再将队列中的第一个进程唤醒,该进程得到设备后继续运行。

独立于设备的逻辑数据块:

  • 不同类型的设备,其数据交换单位是不同的,读取和传输速率也各不相同,如字符型设备以单个字符(字)为单位,块设备是以一个数据块为单位。

  • 即使同一类型的设备,其数据交换单位的大小也是有差异的,如不同磁盘由于扇区大小的不同,可能造成数据块大小的不一致。

  • 设备独立性软件应能够隐藏这些差异而被逻辑设备使用,并向高层软件提供大小统一的逻辑数据块

5.3 设备分配

设备分配中的数据结构:

  • 设备控制表DCT:

    系统为每一个设备都配置了一张设备控制表,用于记录设备的情况。

    设备控制表的字段:

    • 设备队列队首指针,凡因请求本设备而未得到满足的进程,应将其PCB按照一定的策略排成一个设备请求队列,其队首指针指向队首PCB;

    • 忙/闲标志,用于表示当前设备的状态是忙或闲;

    • 与设备连接的控制器表指针,该指针指向该设备所连接的控制器的控制表;

    • 重复执行次数,由于外部设备在传送数据时较易发生数据传送错误,因而在许多系统中规定了设备在工作中发生错误时应重复执行的次数,在重复执行时,若能恢复正常传送,则仍认为传送成功,仅当重复执行次数达到规定值仍不成功时,才认为传送失败。

  • 控制器控制表、通道控制表和系统设备表:

    • 控制器控制表(COCT)。系统为每一个控制器都设置了用于记录控制器情况的控制器控制表。

    • 通道控制表(CHCT)。每个通道都有一张通道控制表。

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

设备分配时应考虑的因素:

  • 设备的固有属性。 设备的固有属性可分成三种,对它们应采取不同的分配策略:

    • 独占设备的分配策略。

      将一个设备分配给某进程后,便由该进程独占,直至该进程完成或释放该设备。

    • 共享设备的分配策略。

      对于共享设备,可同时分配给多个进程使用,此时须注意对这些进程访问该设备的先后次序进行合理的调度。

    • 虚拟设备的分配策略,虚拟设备属于可共享的设备,可以将它同时分配给多个进程使用。

  • 设备分配算法。 对设备分配的算法,通常只采用以下两种分配算法:

    • 先来先服务。

    • 优先级高者优先。

  • 设备分配中的安全性。 从进程运行的安全性上考虑,设备分配有以下两种方式:

    • 安全分配方式。

    • 不安全分配方式。

独占设备的分配程序:

  • 基本的设备分配程序。 当某进程提出I/O请求后,系统的设备分配程序可按下述步骤进行设备分配:

    1. 分配设备。

    2. 分配控制器。

    3. 分配通道。

  • 设备分配程序的改进。 上面的例子中,进程是以物理设备名提出I/O请求的。如果所指定的设备已分配给其它进程,则分配失败。或者说上面的设备分配程序不具有与设备无关性。为获得设备的独立性,进程应使用逻辑设备名请求I/O。

5.4 逻辑设备名到物理设备名映射的实现

逻辑设备表LUT(Logical Unit Table):

  • 在逻辑设备表的每个表目中包含了三项:逻辑设备名、物理设备名和设备驱动程序的入口地址

逻辑设备表的设置问题:

  • 在系统中可采取两种方式设置逻辑设备表:

    • 第一种方式,是在整个系统中只设置一张LUT。

    • 第二种方式,是为每个用户设置一张LUT。

6. 用户层的I/O软件

6.1 系统调用与库函数

系统调用:

  • 为使诸进程能有条不紊地使用I/O设备,且能保护设备的安全性,不允许运行在用户态的应用进程去直接调用运行在核心态(系统态)的OS过程。

  • 应用进程在运行时,又必须取得OS所提供的服务,否则,应用程序几乎无法运行。为了解决此矛盾,OS在用户层中引入了一个中介过程,即系统调用。应用程序可以通过它间接调用OS中的I/O过程,对I/O设备进行操作。

库函数:

  • 在C语言以及UNIX系统中,系统调用(如read)与各系统调用所使用的库函数(如read)之间几乎是一一对应的。

  • 而微软定义了一套过程,称为Win32 API的应用程序接口(Application Program Interface),程序员利用它们取得OS服务,该接口与实际的系统调用并不一一对应。

  • 用户程序通过调用对应的库函数使用系统调用,这些库函数与调用程序连接在一起,被嵌入在运行时装入内存的二进制程序中。

6.2 假脱机(Spooling)系统

假脱机技术:

  • 在20世纪50年代,为了缓和CPU的高速性与I/O设备低速性间的矛盾,而引入了脱机输入、脱机输出技术。

  • 该技术是利用专门的外围控制机,先将低速I/O设备上的数据传送到高速磁盘上,或者相反。

  • 这样当处理机需要输入数据时,便可以直接从磁盘中读取数据,极大地提高了输入速度。

  • 反之,在处理机需要输出数据时,也可以很快的速度把数据先输出到磁盘上,处理机便可去做自己的事情。

  • 当系统中引入了多道程序技术后,完全可以利用其中的一道程序,来模拟脱机输入时的外围控制机功能,把低速UO设备上的数据传送到高速磁盘上。再用另一道程序模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。这样,便可在主机的直接控制下,实现以前的脱机输入、输出功能。

  • 此时的外围操作与CPU对数据的处理同时进行,我们把这种在联机情况下实现的同时外围操作的技术称为SPOOLing技术,或称为假脱机技术。

SPOOLing的组成:

  • SPOOLing技术是对脱机输入/输出系统的模拟;SPOOLing系统建立在通道技术和多道程序技术的基础上,以高速随机外存(通常为磁盘)为后援存储器。

  • SPOOLing系统主要由以下四部分构成:

    • 输入井和输出井。

    • 输入缓冲区和输出缓冲区。

    • 输入进程和输出进程。

    • 井管理程序。

  • SPOOLing系统的特点:

    • 提高了I/O的速度。

    • 将独占设备改造为共享设备。

    • 实现了虚拟设备功能。

  • 假脱机打印机系统:

    打印机是经常用到的输出设备,属于独占设备。利用假脱机技术可将它改造为一台可供多个用户共享的打印设备,从而提高设备的利用率,也方便了用户。共享打印机技术已被广泛地用于多用户系统和局域网络中。

    假脱机打印系统主要有以下三部分:

    • 磁盘缓冲区。

    • 打印缓冲区。

    • 假脱机管理进程和假脱机打印进程。

  • 守护进程(daemon):

    • 人们对该利用假脱机系统来实现打印机共享的一种方案进行了某些修改,如取消该方案中的假脱机管理进程;;

    • 为打印机建立一个守护进程,由它执行一部分原来由假脱机管理进程实现的功能,如为用户在磁盘缓冲区中申请一个空闲盘块,并将要打印的数据送入其中,将该盘块的首址返回给请求进程。

    • 另一部分由请求进程自己完成,每个要求打印的进程首先生成一份要求打印的文件,其中包含对打印的要求和指向装有打印输出数据盘块的指针等信息,然后将用户请求打印文件放入假脱机文件队列(目录)中。

7. 缓冲区管理

在现代操作系统中,几乎所有的I/O设备在与处理机交换数据时都用了缓冲区。

  • 缓冲区是一个存储区域,它可以由专门的硬件寄存器组成,但由于硬件的成本较高,容量也较小,一般仅用在对速度要求非常高的场合,如存储器管理中所用的联想存储器;设备控制器中用的数据缓冲区等。

7.1 缓冲的引入

引入缓冲区的原因有很多,可归结为以下几点:

  • 缓和CPU与I/O设备间速度不匹配的矛盾。

  • 减少对CPU的中断频率,放宽对CPU中断响应时间的限制。

  • 解决数据粒度不匹配的问题。

  • 提高CPU和I/O设备之间的并行性。

7.2 单缓冲区和双缓冲区

单缓冲区(Single Buffer):

  • 在单缓冲情况下,每当用户进程发出一I/O请求时,操作系统便在主存中为之分配一缓冲区。

双缓冲区(Double Buffer):  由于缓冲区是共享资源,生产者与消费者在使用缓冲区时必须互斥。如果消费者尚未取走缓冲区中的数据,即使生产者又生产出新的数据,也无法将它送入缓冲区,生产者等待。如果为生产者与消费者设置了两个缓冲区,便能解决这一问题。

7.3 环形缓冲区

环形缓冲区的组成:

  • 多个缓冲区。

    在环形缓冲中包括多个缓冲区,其每个缓冲区的大小相同。作为输入的多缓冲区可分为三种类型:

    • 用于装输入数据的空缓冲区;

    • 已装满数据的缓冲区;

    • 计算进程正在使用的现行工作缓冲区。

环形缓冲区的使用:

  • Getbuf 过程。

    当计算进程要使用缓冲区中的数据时,可调用 Getbuf 过程。

    • 该过程将由指针Nextg所指示的缓冲区提供给进程使用,相应地,须把它改为现行工作缓冲区,并令Current指针指向该缓冲区的第一个单元,同时将Nextg移向下一个 G 缓冲区。

    • 类似地,每当输入进程要使用空缓冲区来装入数据时,也调用Getbuf过程,由该过程将指针Nexti所指示的缓冲区提供给输入进程使用,同时将Nexti指针移向下一个R缓冲区。

  • Releasebuf过程。

    当计算进程把C缓冲区中的数据提取完毕时,便调用Releasebuf过程,将缓冲区C释放。

    • 此时,把该缓冲区由当前(现行)工作缓冲区改为空缓冲区R类似地,当输入进程把缓冲区装满时,也应调用Releasebuf过程,将该缓冲区释放,并改为 G 缓冲区。

进程之间的同步问题:

  • 使用输入循环缓冲,可使输入进程和计算进程并行执行。相应地,指针Nexti和指针Nextg将不断地沿着顺时针方向移动.

  • 这样就可能出现下述两种情况:

    • Nexti指针追赶上Nextg指针。

    • Nextg指针追赶上Nexti指针。

7.4 缓冲池(Buffer Pool)

缓冲池的组成:

  • 缓冲池管理着多个缓冲区,每个缓冲区由用于标识和管理的缓冲首部以及用于存放数据的缓冲体两部分组成。

  • 缓冲首部一般包括缓冲区号、设备号、设备上的数据块号、同步信号量以及队列链接指针等。

  • 为了管理上的方便,一般将缓冲池中具有相同类型的缓冲区链接成一个队列,于是可形成以下三个队列:

    • 空白缓冲队列emq。

    • 输入队列inq。

    • 输出队列outq。

缓冲区的工作方式:

  • 收容输入;

  • 提取输出;

  • 收容输出;

  • 提取输出。

8. 磁盘存储器的性能和调度

8.1 磁盘性能简述

数据的组织和格式:

  • 磁盘设备可包括一个或多个物理盘片,每个磁盘片分一个或两个存储面(Surface),每个盘面上有若干个磁道(Track),磁道之间留有必要的间隙(Gap)。为使处理简单起见,在每条磁道上可存储相同数目的二进制位。

磁盘的类型:

  • 对于磁盘,可以从不同的角度进行分类。最常见的有:将磁盘分成硬盘和软盘、单片盘和多片盘、固定头磁盘和活动头(移动头)磁盘等。

磁盘访问时间:

  • 磁盘设备在工作时以恒定速率旋转。

  • 为了读或写,磁头必须能移动到所指定的磁道上,并等待所指定的扇区的开始位置旋转到磁头下,然后再开始读或写数据。

8.2 早期的磁盘调度算法

先来先服务(FCFS):

  • 这是最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。

最短寻道时间优先(SSTF):

  • 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种算法不能保证平均寻道时间最短。

8.3 基于扫描的磁盘调度算法

扫描(SCAN)算法:

  • SSTF算法的实质是基于优先级的调度算法,因此就可能导致优先级低的进程发生“饥饿”(Starvation)现象。

  • 因为只要不断有新进程的请求到达,且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的I/O请求必然优先满足。

  • 在对SSTF算法略加修改后,则可防止低优先级进程出现“饥饿”现象。

循环扫描(CSCAN)算法:

  • SCAN算法既能获得较好的寻道性能,又能防止“饥饿”现象,故被广泛用于大、中、小型机器和网络中的磁盘调度。

  • 但也存在这样的问题:当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完处于外面的所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。

NStepSCAN算法:

  • 在SSTF、SCAN及CSCAN几种调度算法中,都可能出现磁臂停留在某处不动的情况,例如,有一个或几个进程对某一磁道有较高的访问频率,即这个(些)进程反复请求对某一磁道的I/O操作,从而垄断了整个磁盘设备。

  • 我们把这一现象称为“磁臂粘着”(Armstickiness)。

  • 在高密度磁盘上容易出现此情况。

FSCAN算法:

  • FSCAN算法实质上是N步SCAN算法的简化,即FSCAN只将磁盘请求队列分成两个子队列。

  • 一个是由当前所有请求磁盘I/O的进程形成的队列,由磁盘调度按SCAN算法进行处理。

  • 另一个是在扫描期间,将新出现的所有请求磁盘I/O的进程放入等待处理的请求队列。这样,所有的新请求都将被推迟到下一次扫描时处理。

9. 补充

  • 试说明I/O系统的基本功能。

    I/O系统(输入/输出系统)是计算机系统中用于管理外部设备和内部存储器之间数据传输的关键部分。其基本功能可以概括为以下几个方面:

    1. 数据输入(Input):

    • 从外部设备(如键盘、鼠标、扫描仪、摄像头、磁盘驱动器等)读取数据,并将其传输到计算机的内存中供CPU处理。

    • 包括对输入数据的格式化和校验,确保数据准确无误地进入计算机系统。

    1. 数据输出(Output):

    • 将CPU处理后的数据从内存传输到外部设备(如显示器、打印机、磁盘驱动器等),以呈现给用户或保存到外部存储介质中。

    • 涉及对输出数据的格式化,以确保数据以用户可理解或设备可处理的形式展现。

    1. 设备控制与管理:

    • 控制外部设备的启动、停止、复位等操作,以及管理设备的状态(如忙碌、空闲、错误等)。

    • 分配和管理设备资源,确保多个进程或线程能够高效地共享设备。

    • 实现设备的缓冲(buffering)和缓存(caching)策略,以提高数据传输效率。

    1. 错误处理:

    • 检测和处理I/O操作中的错误,如设备故障、数据传输错误等。

    • 采取相应的恢复措施,如重试、数据校正、设备重置等,确保系统的稳定性和数据的完整性。

    1. 数据转换与同步:

    • 在数据从一种格式转换为另一种格式时(如字符编码转换、数据压缩/解压缩等),I/O系统负责协调这些转换过程。

    • 实现CPU与外部设备之间的同步操作,确保数据在正确的时刻被读取或写入,避免数据丢失或覆盖。

    1. 中断处理:

    • 当外部设备完成一项I/O操作或发生错误时,通过中断机制通知CPU。

    • CPU响应中断后,执行相应的中断服务程序(Interrupt Service Routine, ISR),处理I/O操作的完成或错误情况。

    1. 性能优化:

    • 通过各种技术(如直接内存访问DMA、并行I/O处理、设备轮询与中断结合等)提高I/O操作的效率。

    • 管理和优化I/O缓冲区,减少CPU的等待时间,提高系统的吞吐量。

    综上所述,I/O系统的基本功能涵盖了数据的输入输出、设备的控制与管理、错误处理、数据转换与同步、中断处理以及性能优化等多个方面,这些功能共同确保了计算机系统与外部设备之间高效、可靠的数据传输。

  • 简要说明I/O软件的四个层次的基本功能。

    I/O软件的四个层次及其基本功能如下:

    一、用户层I/O软件

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

    • 详细功能:

    • 提供用户友好的接口,使用户能够方便地执行I/O操作。

    • 将用户请求翻译成格式化的I/O请求,并通过系统调用请求操作系统内核的服务。

    • 在用户程序中以库函数的形式出现,供用户调用。

    二、设备独立性软件(又称设备无关性软件)

    • 功能概述:实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。

    • 详细功能:

    • 向上提供统一的调用接口,如read/write系统调用。

    • 实现设备的保护,类似于文件保护,确保不同用户对设备的访问权限。

    • 进行差错处理,对设备的错误进行处理,确保系统的稳定性。

    • 实现设备的分配与回收,管理设备资源。

    • 进行数据缓冲区管理,提高数据传输效率。

    • 建立逻辑设备名到物理设备名的映射关系,根据设备类型选择调用相应的驱动程序。

    三、设备驱动程序

    • 功能概述:与硬件直接相关,用于具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。

    • 详细功能:

    • 接受来自上层、与设备无关软件的抽象读写请求。

    • 检查I/O请求的合法性,并将其排在请求队列的队尾。

    • 取出请求队列中的首请求,将相应设备分配给它。

    • 向设备控制器发送命令,启动设备工作,完成指定的I/O操作。

    • 处理来自设备的中断,确保设备操作的顺利完成。

    四、中断处理程序

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

    • 详细功能:

    • 当I/O设备完成操作或发生错误时,接收来自设备的中断信号。

    • 保存被中断进程的CPU环境,以便在中断处理完毕后恢复。

    • 转入相应的中断处理程序,处理设备的中断请求。

    • 根据中断处理的结果,恢复被中断进程的现场,并返回到被中断的进程。

    综上所述,I/O软件的四个层次各自承担着不同的功能,共同协作以确保计算机与外部设备之间的数据传输和控制操作能够高效、可靠地进行。

  • I/O系统接口与软件/硬件(RW/HW)接口分别是什么接口?

    I/O系统接口与软件/硬件(RW/HW)接口在计算机系统中扮演着不同的角色,以下是它们的详细解释:

    一、I/O系统接口

    1. 定义:

    • I/O系统接口是I/O系统与上层系统之间的接口。

    1. 功能:

    • 向上层系统提供对I/O设备进行操作的抽象命令,使得高层软件能够更加方便地使用I/O设备。

    • 负责实现CPU通过系统总线将I/O电路和外围设备联系在一起,实现数据的传输和控制。

    1. 硬件分类:

    • 按照电路和设备的复杂程度,I/O接口的硬件主要分为I/O接口芯片和I/O接口控制卡两大类。

      • I/O接口芯片:大都是集成电路,通过CPU输入不同的命令和参数,并控制相关的I/O电路和简单的外设作相应的操作,常见的接口芯片如定时计数器、中断控制器、DMA控制器、并行接口等。

      • I/O接口控制卡:由若干个集成电路按一定的逻辑组成为一个部件,或者直接与CPU同在主板上,或是一个插件插在系统总线插槽上。

    1. 接口分类:

    • 按照接口的连接对象来分,I/O接口可以分为串行接口、并行接口、键盘接口和磁盘接口等。

    二、软件/硬件(RW/HW)接口

    1. 定义:

    • 软件/硬件(RW/HW)接口是连接软件系统和硬件设备的桥梁,使得软件能够控制和管理硬件设备。

    1. 结构:

    • 该接口的上面是中断处理程序和用于不同设备的设备驱动程序。

    • 其下面是各种设备的控制器,负责具体执行硬件设备的操作。

    1. 功能:

    • 提供设备驱动程序与硬件控制器之间的通信机制,确保软件能够正确地控制硬件设备。

    • 实现中断处理,当硬件设备完成操作或发生错误时,通过中断机制通知CPU进行处理。

    总结

    I/O系统接口和软件/硬件(RW/HW)接口在计算机系统中起着至关重要的作用。I/O系统接口负责实现CPU与外部设备之间的数据传输和控制,而软件/硬件接口则连接软件系统和硬件设备,确保软件能够正确地控制和管理硬件设备。两者共同协作,使得计算机系统能够高效地运行。

  • 与设备无关性的基本含义是什么? 为什么要设置该层?

    与设备无关性的基本含义及设置该层的原因如下:

    一、与设备无关性的基本含义

    与设备无关性,也称设备独立性,其基本含义是:应用程序独立于具体使用的物理设备。为了实现设备独立性,引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名称来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用。

    二、设置与设备无关性层的原因

    1. 提高OS的可适应性和可扩展性

    • 通过设置与设备无关性层,操作系统可以屏蔽底层硬件设备的具体细节,向上层软件提供统一的逻辑设备接口。这使得操作系统能够更容易地适应不同的硬件设备,提高系统的可扩展性。

    1. 增加设备分配的灵活性

    • 在与设备无关性层中,设备资源的管理和分配是抽象的、统一的。这使得系统能够根据实际需求动态地分配设备资源,提高了设备分配的灵活性。

    1. 易于实现I/O重定向

    • I/O重定向是指用于I/O操作的设备可以更换,而不必改变应用程序。通过设置与设备无关性层,可以轻松地实现这种重定向。例如,在打印作业时,可以将输出从一台打印机重定向到另一台打印机,而无需修改应用程序。

    1. 提高系统的稳定性和可靠性

    • 与设备无关性层可以对硬件设备的错误进行统一处理,减少了因设备差异而导致的错误和故障。这提高了系统的稳定性和可靠性。

    综上所述,设置与设备无关性层是为了提高操作系统的可适应性和可扩展性、增加设备分配的灵活性、易于实现I/O重定向以及提高系统的稳定性和可靠性。这一层次的设计使得操作系统能够更好地管理和控制硬件设备,为用户提供更加稳定、可靠和灵活的计算机环境。

  • 试说明设备控制器的组成。

    设备控制器是计算机硬件中的一个重要组成部分,它负责管理和控制外部设备的数据传输和操作。设备控制器的组成主要包括以下几个部分:

    一、设备控制器与处理机的接口

    这个接口是设备控制器与CPU之间进行通信的桥梁。它主要由数据线、地址线和控制线组成。

    1. 数据线:用于CPU与设备控制器之间传输数据。这些数据线可以连接到一个或多个数据寄存器,用于存放从设备送来的数据(输入)或从CPU送来的数据(输出)。

    2. 地址线:用于CPU向设备控制器发送地址信息,以便选择特定的设备或寄存器进行数据传输。

    3. 控制线:用于CPU向设备控制器发送控制信号,如启动、停止、中断等,以控制设备的操作。

    二、设备控制器与设备的接口

    这个接口是设备控制器与外部设备之间进行通信的桥梁。它主要包括数据信号、状态信号和控制信号三类。

    1. 数据信号:用于设备控制器与外部设备之间传输数据。

    2. 状态信号:用于设备向设备控制器报告其当前状态,如忙碌、空闲、错误等。

    3. 控制信号:用于设备控制器向外部设备发送控制信号,以控制设备的操作。

    三、I/O逻辑

    I/O逻辑是设备控制器的核心部分,它负责处理CPU发来的命令,并控制外部设备的操作。I/O逻辑主要由指令译码器和地址译码器两部分功能部件构成。

    1. 指令译码器:用于将CPU发来的命令进行译码,识别出具体的操作类型和参数。

    2. 地址译码器:用于将CPU发来的地址进行译码,选择出特定的设备或寄存器进行数据传输。

    此外,I/O逻辑还负责实现数据缓冲、差错控制等功能。在数据缓冲方面,I/O逻辑设置缓冲器,用于暂存CPU与外部设备之间传输的数据,以协调两者之间的速率差异。在差错控制方面,I/O逻辑对传输的数据进行差错检测,并在发现错误时向CPU报告,以便采取相应的恢复措施。

    综上所述,设备控制器的组成包括设备控制器与处理机的接口、设备控制器与设备的接口以及I/O逻辑三个部分。这些部分共同协作,实现了CPU与外部设备之间的高效、可靠的通信和数据传输。

  • 为了实现CPU与设备控制器间的通信,设备控制器应具备哪些功能?

    为了实现CPU与设备控制器间的通信,设备控制器应具备以下功能:

    1. 接收和识别命令:设备控制器需要能够接收来自CPU的命令,并正确识别这些命令的意图。这是通信的基础,确保CPU能够向设备控制器发送有效的控制指令。

    2. 数据交换:设备控制器应具备与CPU进行数据交换的能力。这包括从CPU接收数据以用于控制外部设备,以及将外部设备的数据传输回CPU进行进一步处理。

    3. 标识和报告设备的状态:设备控制器需要能够监测外部设备的状态,并将这些状态信息报告给CPU。这有助于CPU了解设备的当前情况,从而做出适当的控制决策。

    4. 地址识别:设备控制器应能够识别CPU发送的地址信息,以确定要控制的外部设备或设备中的特定寄存器。这是确保数据和控制信号能够正确传输到目标设备的关键。

    5. 数据缓冲:由于CPU和外部设备的速率可能存在差异,设备控制器需要设置数据缓冲器来暂存数据。这有助于协调两者之间的速率差异,确保数据的正确传输。

    6. 差错控制:在数据传输过程中,设备控制器应能够检测并纠正可能的错误。这包括数据校验、重传机制等,以确保数据的完整性和准确性。

    综上所述,设备控制器在实现CPU与设备间的通信中扮演着至关重要的角色。它负责接收CPU的命令、与外部设备进行数据交换、报告设备状态、识别地址信息、进行数据缓冲以及差错控制等功能。这些功能的实现确保了CPU与外部设备之间的有效通信和数据传输。

  • 什么是内存映像I/O? 它是如何实现的?

    内存映像I/O(MMIO)是一种I/O设备内存映射技术,它是PCI规范的一部分。在这种技术下,I/O设备被放置在内存空间而不是传统的I/O空间,从处理器的角度看,内存映射I/O后系统设备访问起来和内存一样。这样,访问AGP/PCI-E显卡上的帧缓存、BIOS、PCI设备等就可以使用读写内存一样的汇编指令完成,从而简化了程序设计的难度和接口的复杂性。

    内存映像I/O的实现主要依赖于操作系统的内存管理功能和硬件的支持。具体来说,实现过程大致如下:

    1. 硬件支持:首先,硬件平台需要支持内存映像I/O。这通常意味着I/O设备需要被设计为可以映射到内存地址空间中的设备。此外,硬件还需要提供必要的寄存器和控制逻辑,以便操作系统能够配置和管理这些内存映射的I/O设备。

    2. 操作系统支持:操作系统需要提供机制来允许用户空间或内核空间程序访问这些内存映射的I/O设备。在内核空间中,操作系统通常使用特定的内核函数(如ioremap()在Linux中)来将I/O设备的物理内存地址映射到内核空间的虚拟地址上。在用户空间中,程序可以使用系统调用(如mmap())来请求将I/O设备的物理内存地址映射到用户空间的虚拟内存地址上。

    3. 地址映射:一旦映射完成,用户空间或内核空间的一段内存就与I/O设备的内存关联起来。当用户或内核访问这段内存地址范围时,实际上会转化为对I/O设备的访问。这种映射关系使得对I/O设备的操作变得像对内存的操作一样简单和直接。

    4. 访问控制:为了确保系统的安全性和稳定性,操作系统还需要对内存映射的I/O设备进行访问控制。这包括确保只有具有适当权限的进程或线程才能访问这些设备,以及监控和记录对这些设备的访问情况。

    总的来说,内存映像I/O是一种强大的技术,它使得对I/O设备的访问变得更加简单和高效。然而,它也需要硬件和操作系统的紧密配合才能实现。

  • 为什么说中断是OS赖以生存的基础?

    中断被认为是操作系统(OS)赖以生存的基础,这一观点主要基于以下几个方面的原因:

    一、多道程序实现的基础

    中断机制是实现多道程序设计的基础。在多道程序环境下,CPU需要不断地在各个程序之间进行切换,以便充分利用系统资源。这种切换是通过中断来完成的。当某个程序需要等待I/O操作完成时,CPU可以接收到一个中断信号,然后切换到另一个程序去执行。这样,即使某个程序在等待I/O操作时处于阻塞状态,CPU也不会空闲下来,而是可以继续执行其他程序。这种并发执行的特性大大提高了系统的吞吐量和资源利用率。

    二、设备管理的基础

    中断也是设备管理的基础。在操作系统中,设备管理是一个重要的功能。为了提高处理机的利用率和实现CPU与I/O设备的并行执行,操作系统需要能够及时地响应I/O设备的请求。这种响应是通过中断机制来实现的。当I/O设备完成某项操作或需要CPU干预时,它会向CPU发送一个中断信号。CPU在接收到这个信号后,会暂停当前正在执行的程序,并转而去执行相应的中断处理程序。这样,操作系统就可以及时地处理I/O设备的请求,确保系统的正常运行。

    三、提高系统响应速度和效率

    中断机制还可以提高系统的响应速度和效率。在没有中断机制的情况下,CPU只能按照程序编写的先后顺序来执行指令,即采用轮询的方式来检查I/O设备的状态。这种方式不仅效率低下,而且无法及时响应紧急事件。而有了中断机制后,CPU可以在执行程序的过程中随时响应中断信号,从而及时地处理突发事件和I/O设备的请求。这大大提高了系统的响应速度和效率。

    四、实现用户态到核心态的转换

    中断是实现用户态到核心态转换的唯一途径。在操作系统中,为了保护系统的安全性和稳定性,通常将系统的执行状态分为用户态和核心态。用户态下的程序只能执行非特权指令,而核心态下的程序可以执行特权指令。当用户程序需要执行特权指令或访问受保护的资源时,它必须通过中断机制向操作系统发出请求。操作系统在接收到这个请求后,会暂停用户程序的执行,并切换到核心态去执行相应的服务程序。这样,操作系统就可以对用户程序的请求进行审查和处理,确保系统的安全性和稳定性。

    综上所述,中断机制在操作系统中扮演着至关重要的角色。它是实现多道程序设计、设备管理、提高系统响应速度和效率以及实现用户态到核心态转换的基础。因此,可以说中断是操作系统赖以生存的基础。

  • 对多中断源的两种处理方式分别用于何种场合?

    对多中断源的两种主要处理方式分别是屏蔽(禁止)中断和嵌套中断,它们各自适用于不同的场合:

    一、屏蔽(禁止)中断

    1. 处理方式

    • 当处理机正在处理一个中断时,将屏蔽掉所有的中断,即处理机对任何新到的中断请求都暂时不予理睬,而让它们等待。

    • 直到处理机已完成本次中断的处理后,再去检查是否有新的中断发生。若有,则按顺序处理新到的中断;若无,则返回被中断的程序。

    1. 适用场合

    • 适用于对实时性要求不高的中断请求。

    • 在某些情况下,为了确保当前中断处理的完整性和稳定性,需要暂时屏蔽其他中断请求,以避免中断处理的冲突和混乱。

    二、嵌套中断

    1. 处理方式

    • 在设置了中断优先级的系统中,当同时有多个不同优先级的中断请求时,CPU优先响应优先级最高的中断请求。

    • 高优先级的中断请求可以抢占正在运行的低优先级中断的处理机,类似于基于优先级的抢占式进程调度。

    1. 适用场合

    • 适用于对实时性要求较高的中断请求。

    • 在需要同时处理多个中断请求,并且这些请求具有不同的优先级时,嵌套中断可以确保高优先级的中断请求得到及时响应和处理。

    • 例如,在实时控制系统、嵌入式系统或网络系统中,通常需要处理多个具有不同优先级的中断请求,以确保系统的实时性和稳定性。

    综上所述,屏蔽(禁止)中断和嵌套中断是处理多中断源的两种主要方式。它们各自具有不同的特点和适用场合,可以根据系统的具体需求和中断请求的优先级来选择合适的处理方式。

  • 设备中断处理程序通常需完成哪些工作?

    设备中断处理程序是操作系统中负责处理设备中断事件的程序。当中断发生时,CPU会暂停当前正在执行的程序,并转而去执行中断处理程序。设备中断处理程序通常需要完成以下工作:

    1. 保护被中断进程的CPU环境

    • 中断处理程序在开始执行前,需要保存被中断进程的CPU环境,包括程序计数器、程序状态字、各寄存器的值等。这是为了确保在中断处理完成后,能够恢复到被中断程序的中断点,继续执行原来的程序。

    1. 分析中断原因

    • 中断处理程序需要检查设备状态寄存器的内容,分析中断发生的原因。不同的中断源可能对应不同的中断处理程序,因此需要根据中断原因确定要执行的中断处理程序。

    1. 处理中断事件

    • 根据中断原因,中断处理程序会执行相应的处理操作。例如,如果中断是由数据传输错误引起的,中断处理程序会向上层软件报告设备出错信息,并可能需要重新执行数据传输操作。如果中断是由设备完成某项操作引起的,中断处理程序会将数据从硬件设备复制到设备驱动程序的缓冲区中,并唤醒等待I/O操作的进程。

    1. 恢复被中断进程

    • 在中断处理完成后,中断处理程序需要恢复被中断进程的CPU环境,包括恢复程序计数器、程序状态字和各寄存器的值等。然后,中断处理程序会返回到被中断程序的断点处,继续执行原来的程序。

    此外,设备中断处理程序还需要完成一些其他的工作,如检查I/O请求的合法性、了解I/O设备的工作状态、传递与I/O操作有关的参数等。这些工作有助于确保中断处理的正确性和有效性。

    总的来说,设备中断处理程序是操作系统中非常重要的组成部分,它负责处理设备中断事件,确保系统的正常运行和稳定性。

  • 简要说明中断处理程序对中断进行处理的几个步骤。

    中断处理程序对中断进行处理的步骤通常可以归纳为以下几个主要环节:

    一、中断请求与响应

    1. 中断请求

    • 当外部设备或内部事件需要CPU处理时,会向CPU发送中断请求信号。对于外部中断,这个信号通常是由外部设备产生的,并通过特定的引脚(如NMI或INTR)施加到CPU上。对于内部中断,则是由CPU内部的中断控制逻辑触发的。

    1. 中断响应

    • CPU在检测到中断请求信号后,会根据中断优先级判断逻辑来选择响应哪个中断。如果当前CPU处于开中断状态(即允许中断),并且中断优先级高于当前执行的任务,CPU会暂停当前任务,并准备响应中断。

    二、中断处理准备

    1. 保护现场

    • 在进入中断处理程序之前,CPU需要保存当前任务的上下文信息,以便在中断处理完成后能够恢复到中断前的状态。这通常包括保存程序计数器(PC)、程序状态寄存器(PSR)以及其他相关寄存器的值。

    1. 关闭中断

    • 为了防止在中断处理过程中发生新的中断请求,导致系统状态混乱,CPU在进入中断处理程序后会关闭中断。这确保了中断处理的原子性和完整性。

    三、中断服务

    1. 识别中断源

    • 中断处理程序需要识别出是哪个中断源触发了中断,并根据中断源执行相应的处理逻辑。这通常是通过读取中断向量或中断状态寄存器来实现的。

    1. 执行中断服务程序

    • 根据中断源,中断处理程序会跳转到相应的中断服务程序进行执行。中断服务程序是预先编写好的,用于处理特定中断事件的代码段。

    1. 恢复现场

    • 在中断服务程序执行完毕后,中断处理程序会恢复之前保存的现场信息,包括程序计数器、程序状态寄存器以及其他相关寄存器的值。这确保了中断处理完成后能够正确地返回到被中断的程序继续执行。

    四、中断返回

    1. 开中断

    • 在恢复现场后,中断处理程序会重新打开中断,以允许新的中断请求被CPU响应。

    1. 返回被中断的程序

    • 最后,中断处理程序会跳转到被中断的程序的中断点处,继续执行被中断的程序。

    综上所述,中断处理程序的执行过程包括中断请求与响应、中断处理准备、中断服务以及中断返回等多个步骤。这些步骤共同确保了中断事件能够得到及时、准确的处理,从而保证了系统的稳定性和可靠性。

  • 试说明设备驱动程序具有哪些特点。

    设备驱动程序具有以下几个显著特点:

    1. 通信桥梁:

    • 设备驱动程序是请求I/O(输入/输出)的进程与设备控制器之间的一个通信程序。它负责将进程的I/O请求转换为设备控制器能够理解的格式,并传送给控制器。同时,它还将控制器中记录的设备状态和I/O操作完成情况反映给请求I/O的进程。

    1. 紧密相关性:

    • 驱动程序与I/O设备的特性紧密相关。不同的I/O设备具有不同的硬件特性和操作方式,因此需要为其配置不同的驱动程序。

    • 驱动程序与I/O控制方式也紧密相关。例如,常用的I/O控制方式包括程序查询方式、中断方式和DMA(直接内存访问)方式等,这些不同的控制方式需要不同的驱动程序来支持。

    1. 汇编语言编写:

    • 由于驱动程序与硬件紧密相关,因此其中的一部分必须用汇编语言编写,以便直接操作硬件寄存器和控制硬件设备的行为。汇编语言能够提供更精细的控制和更高的执行效率,但相应地也增加了编程的复杂性和难度。

    1. 固化在ROM中:

    • 许多驱动程序的基本部分被固化在ROM(只读存储器)中。这样做的好处是能够提高系统的启动速度和稳定性,因为ROM中的内容在断电后不会丢失,且读取速度较快。但相应地,这也限制了驱动程序的灵活性和可更新性。

    1. 动态加载:

    • 现代操作系统通常支持设备驱动程序的动态加载和卸载。这意味着操作系统可以在需要时加载相应的驱动程序,而在不需要时将其卸载,以节省系统资源和提高系统的灵活性。

    1. 设备无关性:

    • 设备驱动程序对I/O管理软件屏蔽了I/O设备的细节,实现了I/O管理软件的设备无关性。这意味着I/O管理软件可以不需要了解具体的I/O设备细节,而只通过调用驱动程序提供的接口来完成I/O操作。这提高了系统的可移植性和可扩展性。

    1. 底层操作系统组件:

    • 设备驱动程序是操作系统底层中和I/O设备相关的一部分。它直接与硬件设备进行交互,并向上层软件提供统一的接口和服务。因此,设备驱动程序的设计和实现需要充分考虑系统的安全性和稳定性。

    综上所述,设备驱动程序具有通信桥梁、紧密相关性、汇编语言编写、固化在ROM中、动态加载、设备无关性以及作为底层操作系统组件等特点。这些特点使得设备驱动程序在操作系统中扮演着至关重要的角色,为系统的稳定性和性能提供了有力的保障。

  • 设备驱动程序通常要完成哪些工作?

    设备驱动程序是操作系统内核的一部分,其主要职责是与硬件设备通信并管理其操作。设备驱动程序通常需要完成以下工作:

    1. 提供统一接口:

    • 设备驱动程序为上层软件(如应用程序和操作系统内核的其他部分)提供了一个统一的接口,隐藏了底层硬件的具体细节。这使得上层软件可以通过标准的系统调用来访问硬件设备,而无需了解硬件的具体实现。

    1. 抽象硬件功能:

    • 通过驱动程序,操作系统可以以统一的方式管理和控制各种不同的硬件设备。驱动程序将硬件设备的复杂性和多样性抽象为简单的接口,使得操作系统能够以一种标准化的方式来处理不同的硬件设备。

    1. 初始化硬件:

    • 在系统启动或设备插入时,驱动程序负责初始化硬件设备,设置必要的寄存器和参数。这包括配置设备的工作模式、频率、电压等,以确保设备能够正常工作。

    1. 配置设备参数:

    • 根据需要调整设备的工作模式、频率、电压等参数,以确保设备在不同场景下都能正常运行。

    1. 读写操作:

    • 驱动程序负责处理来自上层软件的数据读写请求,并将其转换为适合硬件的传输格式。这包括将数据从内存传输到设备或从设备读取数据到内存。

    1. 缓冲区管理:

    • 管理设备与内存之间的数据缓冲区,优化数据传输效率。驱动程序通常会使用缓冲区来暂存数据,以减少对硬件的直接访问次数,从而提高系统性能。

    1. 中断服务例程(ISR):

    • 当设备发出中断信号时,驱动程序需要快速响应并执行相应的中断服务例程。中断服务例程负责处理设备的中断请求,如更新数据缓冲区、检查设备状态等。

    1. 状态监控:

    • 持续监控设备的工作状态,检测可能的错误或异常情况。驱动程序会定期检查设备的状态寄存器,以确保设备正常运行。

    1. 错误处理:

    • 一旦发现错误,驱动程序需要采取适当的措施进行纠正或恢复,如重试操作、回滚状态等。这有助于确保系统的稳定性和可靠性。

    1. 分配与释放资源:

    • 为设备分配必要的系统资源(如内存、I/O端口、DMA通道等),并在不再使用时及时释放。这有助于避免资源冲突和数据损坏。

    1. 节能模式:

    • 支持设备的低功耗模式,在系统空闲或不需要高性能时降低能耗。这有助于延长设备的电池寿命和减少能源消耗。

    1. 唤醒机制:

    • 在设备接收到重要事件时能够及时唤醒系统,确保关键任务的及时处理。这有助于提高系统的响应速度和效率。

    1. 日志记录:

    • 记录设备的重要操作和事件,便于故障排查和维护。驱动程序通常会记录设备的启动、停止、错误等关键信息,以帮助开发人员诊断问题。

    综上所述,设备驱动程序是连接硬件与软件的桥梁,它负责完成一系列复杂而重要的工作,以确保系统的稳定性和性能。

  • 简要说明设备驱动程序的处理过程可分为哪几步。

    设备驱动程序的处理过程可以简要分为以下几个步骤:

    1. 接收抽象要求:

    • 设备驱动程序首先接收来自上层软件(如操作系统内核或应用程序)的抽象I/O要求。这些要求通常以read、write等命令的形式出现,它们描述了所需的I/O操作类型和参数。

    1. 转换具体要求:

    • 由于上层软件对硬件设备的具体情况不了解,因此它发出的命令是抽象的。设备驱动程序需要将这些抽象要求转换为具体的要求,以便硬件设备能够理解并执行。这通常涉及到设置硬件寄存器的值,以指定操作类型、数据位置等。

    1. 检查I/O请求的合法性:

    • 在执行I/O操作之前,设备驱动程序需要检查请求的合法性。这包括验证请求的I/O操作类型是否被设备支持,以及请求的数据大小和格式是否符合设备的规定。如果请求不合法,驱动程序会拒绝执行该请求,并向上层软件报告错误。

    1. 检查设备状态:

    • 在发送命令给硬件设备之前,设备驱动程序需要检测设备的当前状态。例如,它需要检查设备是否忙碌、是否已准备好接受新的命令等。如果设备状态不满足要求,驱动程序会等待设备状态变化或采取其他措施。

    1. 传送参数:

    • 一旦设备状态满足要求,设备驱动程序会将必要的参数传送给硬件设备。这些参数可能包括数据缓冲区的地址、数据长度、操作模式等。参数传送通常通过写入硬件寄存器的值来完成。

    1. 设置工作方式:

    • 根据I/O操作的要求,设备驱动程序可能需要设置硬件设备的工作方式。例如,对于数据传输操作,驱动程序可能需要配置设备的传输模式(如DMA、PIO等)和传输速度等。

    1. 启动I/O设备:

    • 在完成所有必要的准备工作后,设备驱动程序会向硬件设备发送启动命令。这通常涉及到写入特定的控制寄存器或触发硬件中断来启动设备。

    1. 处理中断和异常:

    • 在I/O操作执行过程中,设备可能会产生中断或异常信号。设备驱动程序需要编写中断处理程序和异常处理程序来响应这些信号。中断处理程序负责处理正常的I/O完成中断,而异常处理程序则负责处理数据传输错误、设备故障等异常情况。

    1. 报告执行结果:

    • 最后,设备驱动程序需要向上层软件报告I/O操作的执行结果。这包括确认操作是否成功完成、传输的数据量是否正确等。如果操作失败,驱动程序还需要提供错误代码或错误描述,以便上层软件能够采取相应的错误处理措施。

    综上所述,设备驱动程序的处理过程是一个复杂而精细的过程,它涉及到与硬件设备的通信、参数传送、工作方式设置、中断和异常处理等多个方面。通过这一过程,设备驱动程序能够确保I/O操作的正确性和高效性。

  • 试说明推动I/O控制发展的主要因素是什么。

    推动I/O控制发展的主要因素可以归纳为以下几点:

    一、技术进步

    1. CPU性能提升:随着CPU速度的不断提升,传统的I/O控制方式逐渐无法满足高效的数据传输和处理需求。因此,需要发展更先进的I/O控制方式,以减少CPU对I/O设备的干预,提高数据传输效率。例如,DMA(直接存储器访问)方式和I/O通道方式等,都是通过减少CPU的介入来提高数据传输效率。

    2. 中断机制引入:中断机制的引入使得CPU可以在处理I/O请求的同时继续执行其他任务,提高了系统的并行处理能力。随着中断机制的不断完善和优化,I/O控制方式也得到了进一步的发展。

    二、市场需求

    1. 物联网和工业自动化的发展:随着物联网和工业自动化等领域的快速发展,对I/O控制方式提出了更高的要求。例如,在工业自动化中,分布式I/O控制方式的应用越来越广泛,因为它能够实现设备的分布式控制和监测,提高生产效率、降低能耗和减少故障率。

    2. 高性能计算需求:在高性能计算领域,对数据传输速度和处理能力的需求不断增加。这推动了I/O控制方式向更高效、更灵活的方向发展,以满足高性能计算的需求。

    三、行业标准与规范

    1. 统一通信协议与接口标准:为了确保不同设备之间的兼容性和互操作性,行业标准和规范逐渐建立并完善。例如,在物联网生态系统中,智能I/O模块需要遵循统一的通信协议与接口标准,以实现与不同厂商、不同型号设备的无缝集成。这种标准化和规范化的要求促使I/O控制方式不断向更加统一、更加标准化的方向发展。

    2. 技术发展推动标准更新:随着技术的不断进步,新的I/O控制方式层出不穷。为了保持技术的先进性和竞争力,行业标准和规范也需要不断更新和完善,以适应新的技术发展趋势。

    四、软硬件协同发展

    1. 硬件性能提升与软件优化:随着计算机硬件和软件的不断发展,它们之间的协同工作变得越来越紧密。为了充分发挥硬件的性能,需要相应的软件支持;同样,为了充分发挥软件的功能,也需要相应的硬件支持。因此,I/O控制方式的发展必须考虑软硬件之间的协同工作。

    2. 边缘计算技术的推动:在边缘计算技术的推动下,智能I/O模块具备了更强的本地处理能力,可以在数据源头进行实时分析与决策。这要求I/O控制方式必须更加灵活、更加高效,以适应边缘计算的应用场景。

    五、成本控制与效率提升

    1. 降低资源消耗:传统的I/O控制方式往往存在资源利用率低、响应速度慢等问题,无法满足高效生产的需求。因此,新的I/O控制方式必须更加注重成本控制和效率提升,以降低资源消耗并提高生产效率。

    2. 提高系统吞吐量:通过优化I/O控制方式,可以提高系统的吞吐量,使得系统能够处理更多的I/O请求。这不仅可以提高系统的性能,还可以降低系统的响应时间,提高用户体验。

    综上所述,推动I/O控制发展的主要因素包括技术进步、市场需求、行业标准与规范、软硬件协同发展以及成本控制与效率提升等多个方面。这些因素相互作用、相互促进,共同推动了I/O控制方式的发展。

  • 有哪几种I/O控制方式? 各适用于何种场合?

    I/O控制方式主要有以下几种,它们各自适用于不同的场合:

    一、程序直接控制方式

    • 工作原理:CPU向I/O模块发出读写指令,并从状态寄存器中读取I/O设备的状态。如果设备处于忙碌状态,CPU会继续轮询检查状态;如果设备已就绪,CPU就可以从中读取数据到CPU寄存器中,或者将数据从CPU寄存器写入到存储器(内存)中。完成这些操作后,CPU再执行下一套指令。

    • 适用场合:这种方式实现简单,在读写指令之后加上实现轮询检查的一系列指令即可。但它只适用于结构简单、只需少量硬件的电路,以及早期的计算机系统中。由于CPU和I/O设备只能串行化工作,CPU需要一直轮询检查,因此CPU利用率很低。

    二、中断驱动方式

    • 工作原理:当I/O设备需要服务时,它会主动打断CPU的运行并请求服务。CPU向I/O控制器发送读命令后,可以继续做其他有用的工作。I/O控制器从CPU接收读命令后,从外围设备读数据。一旦数据读入到I/O控制器的数据寄存器,就通过控制线给CPU发出一个中断信号,表示数据已准备好。然后等待CPU请求该数据,并将其放到数据总线上,传到CPU的寄存器中。至此,本次I/O操作完成,I/O控制器又可开始下一次I/O操作。

    • 适用场合:这种方式适用于高效场合,特别是需要处理大量字符设备的场景。与程序直接控制方式相比,中断驱动方式中CPU不再需要不停轮询,CPU和I/O设备可以并行工作,CPU利用率得到明显提升。然而,由于数据中的每个字在存储器与I/O控制器之间的传输都必须经过CPU,这仍然会消耗较多的CPU时间。

    三、DMA(直接存储方式)

    • 工作原理:DMA方式的数据流向是从设备直接放入内存(设备→内存),或者从内存直接到设备(内存→设备),不再使用CPU作为中间者。CPU在读写数据前需要指明要读入多少数据、数据要存放在内存中的什么位置、数据放在外部磁盘的什么位置等问题。然后DMA控制器会根据CPU提出的要求完成数据的读写操作。

    • 适用场合:DMA方式主要用于对块设备的控制,特别适用于无须CPU介入的控制器来控制内存与外设之间的数据交流的场合。这种方式以数据块为单位进行传输,仅仅在传送一个或多个数据块的开始和结束时,才需要CPU的干预,因此CPU的介入性进一步降低。但如果读写的数据块不是连续存放的,而是离散的,那么CPU仍然需要分别发出多条I/O指令,进行多次中断处理才能完成。

    四、I/O通道控制方式

    • 工作原理:通道是一个用来控制外部设备工作的硬件机制,相当于一个功能简单的处理机。它是独立于CPU的、专门负责数据的输入输出传输工作的处理器。通道对外部设备实行统一管理,代替CPU对I/O操作进行控制,从而使I/O操作可以与CPU并行工作。

    • 适用场合:通道控制方式主要用于I/O设备比较多、服务比较繁忙且互相之间需要并行处理的场合。这种方式下,CPU干涉频率极低,通道会根据CPU的指令执行响应程序,只有完成一组数据块的读写后才需要发出中断信号让CPU干预。因此,它能够实现CPU、通道和I/O设备三者的并行工作,资源利用率极高。但这种方式实现复杂,需要专门的通道硬件支持。

    综上所述,不同的I/O控制方式各有其优缺点和适用场合。在实际应用中,需要根据具体需求和场景选择合适的I/O控制方式。

  • 试说明DMA的工作流程。

    DMA(Direct Memory Access,直接内存访问)是一种重要的计算机系统中用于在设备和内存之间直接传输数据的技术,而不需要经过中央处理器(CPU)的参与。DMA的工作流程通常包括以下几个步骤:

    一、DMA预处理(初始化阶段)

    1. CPU执行I/O指令:在DMA传送之前,CPU需要执行几条I/O指令来初始化DMA控制器。这些指令通常用于测试外设的状态、向DMA控制器的相关寄存器设置初值、设置传送方向以及启动外部设备等。

    2. 设置参数:CPU会向DMA控制器的地址寄存器送入设备号,向内存地址计数器中送入起始地址,向字计数器中送入要传送的数据字个数等参数。

    3. 启动外设:完成参数设置后,CPU会发出命令启动外部设备,使其准备好进行数据传输。

    二、DMA请求与授权

    1. 外设发出DMA请求:当外部设备准备好数据传输时,它会向DMA控制器发出一个DMA请求信号(DRQ)。这个请求包含了数据的来源(设备或内存)、目标地址以及数据块的大小等信息。

    2. CPU暂停并授权:CPU在接收到设备的DMA请求后,会暂时停止当前的任务,并向DMA控制器发出授权信号(DACK),表示允许DMA控制器接管内存总线的控制权。

    三、DMA数据传输

    1. DMA控制器接管总线:获得授权后,DMA控制器会接管数据总线和地址总线的控制,成为总线的主导者。

    2. 数据传输过程

    • 地址阶段:DMA控制器会将内存地址发送到总线,指定数据要传输到的目标地址或从哪个内存地址开始读取数据。

    • 数据阶段:在这个阶段,实际的数据传输会发生。数据会从设备被读取到内存,或从内存被写入到设备。这是DMA占用总线的主要阶段。

    DMA控制器会根据设备请求的信息进行一次或多次数据搬运,每次数据传输都伴随着总线周期的占用。

    四、DMA后处理(中断与总线释放)

    1. 数据传输完成:当传送长度计数器计到0时,表示数据已经传输完成。

    2. DMA控制器发送中断请求:DMA控制器会向CPU发送一个中断信号(IRQ),通知CPU数据传输已经结束。

    3. CPU处理中断:CPU在接收到DMA的中断请求后,会停止当前程序的执行,转去执行中断服务程序进行DMA结束处理工作。这些工作可能包括数据校验、数据缓冲区的处理等。

    4. 释放总线控制权:在处理完中断服务程序后,DMA控制器会释放总线控制权,CPU恢复对系统资源的控制,继续执行其他任务。

    通过DMA技术,设备能够直接与内存进行批量数据的传输,仅在传输的开始和结束时才需要中断CPU的干预。这种方式大大减少了CPU对I/O控制的干预,提高了CPU与设备的并行化程度,从而提升了系统的整体性能。

  • 为何要引入与设备的无关性? 如何实现设备的独立性?

    引入与设备的无关性(设备独立性或设备无关性)的主要原因及其实现方式如下:

    一、为何要引入与设备的无关性

    1. 方便用户:设备独立性使得用户在编写程序时无需关心具体的物理设备,只需通过逻辑设备名来请求使用某类设备。这大大降低了用户编写程序的复杂性,提高了编程效率。

    2. 提高操作系统的可适应性和可扩展性:随着计算机技术的不断发展,新的I/O设备不断涌现。如果操作系统直接依赖于具体的物理设备,那么每当有新的设备出现时,都需要对操作系统进行大量的修改。而引入设备独立性后,只需在设备独立性软件层添加对新设备的支持,无需修改应用程序和操作系统的其他部分,从而提高了系统的可适应性和可扩展性。

    3. 实现资源的灵活分配:在实现了设备独立性的系统中,设备分配更加灵活。系统可以根据当前设备的状态和作业的需求,动态地将逻辑设备名映射到物理设备名,从而实现设备的动态分配和负载均衡。

    4. 易于实现I/O重定向:I/O重定向是指在不改变应用程序的情况下,将用于I/O操作的设备更换为其他设备。在实现了设备独立性的系统中,由于应用程序是通过逻辑设备名来请求使用设备的,因此只需更改逻辑设备名到物理设备名的映射关系,就可以实现I/O重定向,而无需修改应用程序。

    二、如何实现设备的独立性

    1. 引入逻辑设备和物理设备两个概念:逻辑设备是用户在编写程序时使用的设备名,它是抽象的、不依赖于具体的物理设备。而物理设备是实际存在的、具体的硬件设备。为了实现设备独立性,需要在系统中同时引入逻辑设备和物理设备两个概念。

    2. 设置设备独立性软件:设备独立性软件是介于用户程序和驱动程序之间的一层软件。它的主要功能是执行所有设备的公有操作、完成逻辑设备名到物理设备名的转换,并向用户层(或文件层)软件提供统一接口。通过设置设备独立性软件,可以在不改变应用程序的情况下,实现对不同物理设备的支持。

    3. 使用逻辑设备名进行I/O请求:在应用程序中,使用逻辑设备名来请求使用某类设备。系统在实际执行时,会根据逻辑设备名到物理设备名的映射关系,将逻辑设备名转换为对应的物理设备名,并调用相应的驱动程序进行数据传输。

    4. 动态映射和重定向:设备独立性软件还负责维护逻辑设备名到物理设备名的映射关系。这个映射关系可以是静态的,也可以是动态的。在动态映射中,系统可以根据当前设备的状态和作业的需求,动态地调整映射关系,从而实现设备的动态分配和负载均衡。同时,通过更改映射关系,还可以实现I/O重定向。

    综上所述,引入与设备的无关性可以带来诸多好处,而实现设备的独立性则需要通过引入逻辑设备和物理设备两个概念、设置设备独立性软件、使用逻辑设备名进行I/O请求以及动态映射和重定向等方式来实现。

  • 与设备的无关的软件中,包括了哪些公有操作的软件?

    与设备的无关的软件中,包括了执行所有设备的公有操作的软件。这些软件主要实现设备独立性,即在应用程序中使用设备时,不依赖于具体的物理设备。以下是这些公有操作软件的主要组成部分:

    1. 设备驱动程序的统一接口

    • 该接口为各种设备驱动程序提供了一个标准的访问方式,使得系统可以方便地添加、删除或更新设备驱动程序。

    • 通过这一接口,系统能够实现对不同设备的统一管理和控制。

    1. 缓冲管理

    • 缓冲管理负责在内存和外部设备之间设置缓冲区,以暂存数据。

    • 这样可以减少CPU与外部设备之间的直接交互次数,提高数据传输效率。

    • 缓冲管理还负责缓冲区的分配、回收和调度等工作。

    1. 差错控制

    • 差错控制负责检测和处理数据传输过程中的错误。

    • 它包括两类错误处理:暂时性错误(如通信故障)和永久性错误(如设备损坏)。

    • 对于暂时性错误,系统通常会尝试重新传输数据;而对于永久性错误,系统可能需要采取其他措施,如通知用户或记录错误信息。

    1. 对独立设备的分配与回收

    • 该功能负责在多个进程或作业之间分配和回收独立的I/O设备。

    • 系统通常采用一定的分配策略(如先来先服务、优先级高者优先等)来确保设备的公平和高效利用。

    • 当进程或作业完成后,系统会回收分配给它们的设备资源。

    1. 独立于设备的逻辑数据块

    • 该功能隐藏了不同设备的物理数据块大小的差异,向高层软件提供大小统一的逻辑数据块。

    • 这样可以简化高层软件对设备数据的处理过程,提高数据处理的效率和灵活性。

    综上所述,与设备的无关的软件中包括了设备驱动程序的统一接口、缓冲管理、差错控制、对独立设备的分配与回收以及独立于设备的逻辑数据块等公有操作的软件。这些软件共同实现了设备独立性,使得应用程序可以更加灵活、高效地利用外部设备资源。

  • 在考虑到设备的独立性时,应如何分配独占设备?

    在考虑到设备的独立性时,分配独占设备需要遵循一定的步骤和原则,以确保设备资源的合理利用和系统的稳定运行。以下是在设备独立性前提下分配独占设备的具体步骤:

    1. 进程提出I/O请求

    • 进程以逻辑设备名向系统提出I/O请求。逻辑设备名是用户在编写程序时使用的设备名,它是抽象的、不依赖于具体的物理设备。

    1. 查找逻辑设备表

    • 系统根据逻辑设备名在逻辑设备表(LUT)中查找对应的物理设备。逻辑设备表记录了逻辑设备名与物理设备名之间的映射关系,以及设备驱动程序的入口地址。

    1. 检索系统设备表

    • 系统从逻辑设备表相应表项获得I/O请求的逻辑设备对应类型的物理设备在系统设备表(SDT)中的指针。然后,从指针所指位置起顺序检索系统设备表,直到找到一个属于对应I/O请求所用类型、空闲可用且基于设备分配安全性算法验证为安全分配的设备的设备控制表(DCT)。

    1. 分配设备

    • 如果找到了满足条件的设备,系统将该设备分配给请求进程,并在设备控制表中更新设备的状态为“已分配”。同时,系统还需要将设备的绝对号与相对号的对应关系通知用户,以便用户在分配到的设备上装上存储介质。

    • 如果未找到安全可用的空闲设备,则把请求进程的进程控制块挂到相应类型设备的等待队列上等待唤醒和分配。

    1. 分配控制器和通道

    • 在设备分配成功后,系统还需要为该设备分配相应的控制器和通道。这包括查找控制器控制表(COCT)和通道控制表(CHCT),判断控制器和通道是否忙碌,若忙则等待,否则将其分配给进程。

    1. 启动设备

    • 只有在设备、控制器和通道三者都分配成功时,这次的设备分配才算成功。然后,系统可以启动设备进行数据传送。

    1. 设备回收

    • 当进程执行结束或不再需要该设备时,系统应回收所分配的设备资源。这包括将设备的状态更新为“未分配”,并将其从进程的等待队列中移除。同时,系统还需要回收控制器和通道资源。

    通过以上步骤,系统可以在考虑设备独立性的前提下,有效地分配和回收独占设备资源。这不仅可以提高设备的利用率和系统的性能,还可以增强系统的灵活性和可扩展性。

  • 何谓设备虚拟? 实现设备虚拟时所依赖的关键技术是什么?

    设备虚拟是指把独占设备通过某种技术处理改造成虚拟设备。具体而言,一台物理设备在采用虚拟技术后,可以变成多台逻辑上的虚拟设备。这些虚拟设备是可共享的设备,可以同时分配给多个进程使用,并对这些访问该物理设备的先后次序进行控制。

    实现设备虚拟时所依赖的关键技术主要包括:

    1. SPOOLING技术(Simultaneous Peripheral Operations On-Line,即同时外围操作在线):

    • 该技术是一种典型的虚拟设备技术,它用一类物理设备模拟另一类物理设备的功能,使独占设备变成可共享的虚拟设备。

    • 通过在内存中设立输入/输出缓冲区,SPOOLING技术可以预先将磁盘上的数据输入到缓冲区中,供多个进程共享。同时,它也可以将输出数据先写入缓冲区,然后再统一输出到磁盘或其他设备上。

    • 这样,多个进程就可以同时访问同一个物理设备,而不会出现冲突和等待的情况。

    1. 分时技术

    • 分时技术是实现设备虚拟的另一种重要技术。它允许多个用户(进程)通过分时的方式,使用同一台物理设备。

    • 在宏观上,多个进程似乎同时在执行I/O操作;而在微观上,实际上是一台物理设备依次、分时地为每一个进程执行I/O操作。

    • 通过分时技术,每个用户(进程)都会感觉到系统中有一台这类设备在专门为他服务,从而实现了设备的虚拟化和共享。

    综上所述,设备虚拟是一种重要的计算机技术,它通过将独占设备改造成虚拟设备,实现了设备的共享和高效利用。而实现设备虚拟所依赖的关键技术主要包括SPOOLING技术和分时技术。这些技术的应用不仅提高了设备的利用率和系统的性能,还增强了系统的灵活性和可扩展性。

  • 在实现后台打印时,SPOOLing系统应为请求I/O的进程提供哪些服务?

    在实现后台打印时,SPOOLing(Simultaneous Peripheral Operations On-Line,即联机情况下同时进行的外围设备操作,通常称为假脱机操作)系统为请求I/O的进程提供以下关键服务:

    1. 输出井的申请与数据传送

    • SPOOLing系统由输出进程在输出井(即磁盘或磁鼓上的一个区域,用于暂存输出数据)中为用户申请一个空闲的盘块区。

    • 将用户要打印的数据送入该盘块区中,以便后续处理和打印。

    1. 请求打印表的生成与挂队

    • 输出进程为用户进程申请一个空白的用户打印表。

    • 将用户的打印要求(如打印份数、打印格式等)填入该表中。

    • 将填写好的请求打印表挂到请求打印队列上,等待打印机空闲时进行打印。

    1. 打印队列的管理与调度

    • 一旦打印机空闲,输出进程会从请求打印队列的队首取出一个请求打印表。

    • 根据表中的要求,将要打印的数据从输出井传送到内存缓冲区中。

    • 再由打印机从内存缓冲区中读取数据进行打印。

    • 重复此过程,直到打印队列为空。

    通过这些服务,SPOOLing系统能够将独占的打印机设备改造成可共享的虚拟设备,允许多个进程同时向打印机发送打印请求,并按照请求的顺序依次进行打印。这大大提高了打印机的利用率和系统的整体性能。同时,SPOOLing系统还减少了进程等待打印机的时间,提高了系统的响应速度和用户的满意度。

  • 假脱机系统向用户提供共享打印机的基本思想是什么?

    假脱机系统(SPOOLing系统)向用户提供共享打印机的基本思想主要体现在以下几个方面:

    一、数据缓冲与预处理

    1. 即时数据输出到缓冲区

    • 当用户提交打印请求时,系统并非立即执行真实的打印操作,而是将数据输出到缓冲区(通常是内存或磁盘的一部分)。这个过程对用户是透明的,用户会感觉系统已经为其开始打印。

    1. 数据暂存与等待

    • 输出的数据在缓冲区中暂存,等待打印机空闲。此时,数据并未真正被打印出来,只是被系统保存起来以备后续处理。

    二、打印队列与调度

    1. 打印请求挂队

    • 用户的打印请求被系统记录下来,并形成一个打印请求队列。每个打印请求都包含打印数据的相关信息,如打印内容、格式、份数等。

    1. 按顺序打印

    • 当打印机空闲时,系统按照打印请求队列中的顺序,依次取出请求进行打印。这种机制确保了公平性,即先提交的请求先被处理。

    三、设备虚拟化与共享

    1. 设备虚拟化

    • 通过SPOOLing技术,打印机这种独占设备被改造成可共享的虚拟设备。多个用户可以同时向系统提交打印请求,而无需担心设备冲突。

    1. 资源高效利用

    • 虚拟化技术使得系统能够更高效地利用打印机资源。即使打印机正在为某个用户打印,其他用户的请求也可以被系统接收并排队等待,从而提高了设备的利用率。

    四、对用户屏蔽复杂过程

    1. 过程对用户不可见

    • 上述的缓冲、排队、调度等复杂过程对用户是完全屏蔽的。用户只需提交打印请求并等待结果即可,无需关心系统内部的实现细节。

    1. 简化用户操作

    • 这种屏蔽简化了用户的操作过程,提高了系统的易用性和用户体验。

    综上所述,假脱机系统向用户提供共享打印机的基本思想是通过数据缓冲与预处理、打印队列与调度、设备虚拟化与共享以及对用户屏蔽复杂过程等手段,实现打印机资源的共享和高效利用。

  • 引入缓冲的主要原因是什么?

    引入缓冲的主要原因可以归结为以下几点:

    1. 缓和CPU与I/O设备间速度不匹配的矛盾

    • 一般情况下,CPU的工作速度快,而I/O设备(如磁盘、打印机等)的工作速度相对较慢。如果CPU和I/O设备直接进行数据传输,很可能会因为I/O设备的速度跟不上CPU的速度而导致数据大量积压在I/O设备处,从而影响CPU的工作效率。通过引入缓冲区,CPU可以将处理好的数据先传送到缓冲区,而I/O设备则从缓冲区中读取数据进行处理。这样,CPU和I/O设备可以各自以最适合自己的速度进行工作,从而提高整个系统的效率。

    1. 减少对CPU的中断频率

    • 在没有缓冲区的情况下,每次CPU需要读取或写入数据时,都需要中断当前的执行流程去处理I/O操作。这会导致CPU的中断频率非常高,影响系统的稳定性和响应速度。而引入缓冲区后,CPU可以将数据先写入缓冲区,然后在缓冲区满或需要读取数据时再进行中断处理。这样可以大大减少CPU的中断频率,放宽对中断响应时间的限制,提高系统的性能。

    1. 提高CPU与I/O设备间的并行性

    • 引入缓冲区后,CPU和I/O设备可以并行地工作。例如,在CPU处理数据的同时,I/O设备可以从缓冲区中读取数据进行处理或输出。这样,CPU和I/O设备可以充分利用各自的处理能力,提高系统的吞吐量和设备的利用率。

    1. 协调逻辑记录大小和物理记录大小不一致的问题

    • 在某些情况下,逻辑记录的大小和物理记录的大小可能不一致。例如,一个逻辑记录可能包含多个物理记录。通过引入缓冲区,系统可以在内存中暂存这些逻辑记录,并根据物理记录的大小进行拆分或合并,从而协调逻辑记录大小和物理记录大小不一致的问题。

    综上所述,引入缓冲的主要原因是为了缓和CPU与I/O设备间速度不匹配的矛盾、减少对CPU的中断频率、提高CPU与I/O设备间的并行性以及协调逻辑记录大小和物理记录大小不一致的问题。这些措施可以显著提高系统的性能和稳定性。

  • 在单缓冲情况下,为什么系统对一块数据的处理时间为max(C, T) + M?

    在单缓冲情况下,系统对一块数据的处理时间为max(C, T) + M,这一结论可以从以下几个方面进行解释:

    一、处理时间构成

    1. 数据输入时间(T)

    • 这是指从磁盘或其他外部存储设备将一块数据输入到缓冲区所需的时间。

    1. CPU计算时间(C)

    • 这是指CPU对缓冲区中的数据进行处理(如计算、分析等)所需的时间。

    1. 数据传送时间(M)

    • 这是指将缓冲区中的数据传送到用户区(或进程区)所需的时间。

    二、并行与串行操作

    1. 并行操作

    • 在单缓冲情况下,数据的输入操作(T)和CPU的计算操作(C)可以并行进行。

    • 这意味着,当数据正在被输入到缓冲区时,CPU可以开始处理缓冲区中之前已经输入的数据。

    1. 串行操作

    • 数据从缓冲区传送到用户区的操作(M)必须与CPU读取用户区数据进行处理的操作串行进行。

    • 即,CPU必须等待缓冲区中的数据被传送到用户区后,才能开始处理用户区中的数据。

    三、处理时间计算

    1. 并行操作阶段

    • 由于数据输入和CPU计算可以并行进行,因此这一阶段的时间取决于两者中所需时间较长的那个,即max(C, T)。

    1. 串行操作阶段

    • 数据传送时间M是这一阶段所需的时间,且这一阶段必须在前一阶段完成后才能进行。

    1. 总处理时间

    • 因此,系统对一块数据的总处理时间为并行操作阶段的时间加上串行操作阶段的时间,即max(C, T) + M。

    四、举例说明

    • 假设有一块数据需要处理,数据输入时间T为2秒,CPU计算时间C为3秒,数据传送时间M为1秒。

    • 在单缓冲情况下,数据输入和CPU计算可以并行进行,所需时间为max(2, 3) = 3秒。

    • 然后,数据需要从缓冲区传送到用户区,所需时间为1秒。

    • 因此,系统对这块数据的总处理时间为3秒(并行操作阶段)+ 1秒(串行操作阶段)= 4秒。

    综上所述,在单缓冲情况下,系统对一块数据的处理时间为max(C, T) + M,这是由于数据的输入操作和CPU的计算操作可以并行进行,而数据传送操作必须与CPU处理操作串行进行所导致的。

  • 为什么在双缓冲情况下,系统对一块数据的处理时间为max(T, C)?

    在双缓冲情况下,系统对一块数据的处理时间为max(T, C),这一结论可以从以下几个方面进行解释:

    一、双缓冲机制

    双缓冲机制是指系统设有两个缓冲区,一个作为输入缓冲区,用于暂存从外部设备(如磁盘)输入的数据;另一个作为输出缓冲区,用于暂存将要输出到用户区或下一个处理阶段的数据。

    二、处理过程分析

    1. 数据输入阶段

    • 写入者(通常是外部设备或输入进程)将数据写入输入缓冲区,耗时为T。在此期间,CPU可以处理输出缓冲区中的数据或执行其他任务。

    1. 数据处理阶段

    • 当输入缓冲区被写满后,写入者会切换到另一个空闲的缓冲区(此时为输出缓冲区)继续写入数据。与此同时,读出者(通常是CPU或输出进程)会从已满的输入缓冲区中读取数据,并将其送到用户区进行处理,耗时为C(这里的C指的是CPU处理数据的时间,不包括数据从缓冲区到用户区的传送时间,该时间通常很短,可以忽略不计)。

    1. 并行与串行操作

    • 在双缓冲机制下,数据的输入和输出(即写入缓冲区和从缓冲区读取数据到用户区)可以并行进行。然而,数据的实际处理(即CPU对用户区数据的处理)必须与从缓冲区读取数据的操作串行进行。

    1. 处理时间计算

    • 由于数据的输入和CPU的处理可以并行进行,因此系统的总处理时间取决于两者中所需时间较长的那个。即,如果数据输入时间T较长,则系统需要等待T时间后才能开始处理数据;如果CPU处理时间C较长,则系统需要等待C时间后才能完成数据处理。

    • 因此,系统对一块数据的处理时间可以近似地表示为max(T, C)。

    三、举例说明

    • 假设有一块数据需要处理,数据输入时间T为3秒,CPU处理时间C为4秒。

    • 在双缓冲情况下,写入者会在3秒内将数据写入输入缓冲区,而CPU则可以在此期间处理输出缓冲区中的数据(如果有的话)或执行其他任务。

    • 当输入缓冲区被写满后,写入者会切换到输出缓冲区继续写入数据(此时输出缓冲区变为新的输入缓冲区,而原来的输入缓冲区变为输出缓冲区)。与此同时,CPU会从已满的输入缓冲区中读取数据并进行处理。

    • 由于CPU处理时间C较长(4秒),因此系统需要等待4秒后才能完成数据处理。

    • 因此,系统对这块数据的处理时间为4秒,即max(3, 4) = 4秒。

    综上所述,在双缓冲情况下,系统对一块数据的处理时间为max(T, C),这是由于数据的输入和CPU的处理可以并行进行,而系统的总处理时间取决于两者中所需时间较长的那个。

  • 试说明收容输入工作缓冲区和提取输出工作缓冲区的工作情况。

    收容输入工作缓冲区和提取输出工作缓冲区是操作系统中用于处理输入输出操作的重要机制。以下是它们各自的工作情况说明:

    收容输入工作缓冲区的工作情况

    1. 需求产生:当输入进程需要输入数据时,会触发对收容输入工作缓冲区的需求。

    2. 获取空缓冲区:输入进程调用GetBuf(EmptyQueue)过程,从空闲队列(EmptyQueue)的队首摘下一个空缓冲区,作为收容输入工作缓冲区(Hin)。

    3. 数据输入:输入的数据被装入这个空缓冲区中。当缓冲区被装满后,表示一次输入操作完成。

    4. 挂入输入队列:输入进程再次调用PutBuf(InputQueue, Hin)过程,将装满数据的缓冲区挂在输入队列(InputQueue)的队尾,等待后续处理。

    提取输出工作缓冲区的工作情况

    1. 需求产生:当输出进程需要输出数据时,会触发对提取输出工作缓冲区的需求。

    2. 获取装满数据的缓冲区:输出进程调用GetBuf(OutputQueue)过程,从输出队列(OutputQueue)的队首取得一个装满输出数据的缓冲区,作为提取输出工作缓冲区(Sout)。

    3. 数据输出:输出进程从这个缓冲区中提取数据,并进行输出操作。当缓冲区中的数据被完全输出后,表示一次输出操作完成。

    4. 挂入空闲队列:输出进程再次调用PutBuf(EmptyQueue, Sout)过程,将已经输出完毕的缓冲区挂回空闲队列(EmptyQueue)的队尾,以便后续重用。

    总结

    收容输入工作缓冲区和提取输出工作缓冲区共同协作,实现了操作系统中数据的输入和输出操作。它们通过有效地管理缓冲区的使用和重用,提高了系统的输入输出效率和性能。在实际应用中,这两个缓冲区通常是在内存中开辟的特定区域,用于暂存输入和输出的数据,以实现数据的平滑流动和高效处理。

  • 何谓安全分配方式和不安全分配方式?

    安全分配方式和不安全分配方式是操作系统中用于管理资源分配的两种策略,它们主要区别在于进程在请求资源时的行为以及系统对资源分配的安全性的考虑。

    安全分配方式

    1. 定义: 安全分配方式是指每当进程发出I/O请求后,便进入阻塞状态,直到其I/O操作完成时才被唤醒。

    2. 特点:

    • 在采用这种分配策略时,一旦进程已经获得某种设备(资源),它便会进入阻塞状态,因此不可能再请求其他资源。

    • 当该进程再次被唤醒并开始运行时,它已不再占有之前请求的资源。

    • 这种分配方式摒弃了造成死锁的“请求和保持”条件,因此分配是安全的。

    1. 优缺点:

    • 优点:由于避免了死锁条件,系统资源分配的安全性得到了保障。

    • 缺点:进程进展缓慢,因为CPU与I/O设备是串行工作的,即当进程等待I/O操作时,CPU可能处于空闲状态。

    不安全分配方式

    1. 定义: 不安全分配方式是指进程发出I/O请求后仍继续执行,并在需要时发出后续的I/O请求。

    2. 特点:

    • 进程在请求资源后不会进入阻塞状态,而是继续执行其他任务。

    • 仅当进程所请求的设备已被另一个进程占有时,该进程才会进入阻塞状态。

    • 这种分配方式可能具有“请求和保持”条件,因此可能造成死锁。

    1. 优缺点:

    • 优点:一个进程可以同时操作多个设备,从而使进程推进迅速。

    • 缺点:分配不安全,因为可能造成死锁。因此,在设备分配程序中需要增加一个功能,用于对本次的设备分配是否会发生死锁进行安全性计算,仅当计算结果表明分配安全的情况下才进行分配。

    总结

    安全分配方式和不安全分配方式各有其特点和适用场景。安全分配方式虽然进程进展缓慢,但保证了系统资源分配的安全性;而不安全分配方式虽然进程推进迅速,但可能带来死锁的风险。在实际应用中,需要根据具体需求和系统环境来选择合适的资源分配策略。

  • 磁盘访问时间由哪几部分组成? 每部分时间应如何计算?

    磁盘访问时间主要由三部分组成:寻道时间(Ts)、旋转延迟时间(Tr)和传输时间(Tt,有时也称为传播时间)。下面是对这三部分时间的详细解释和计算方法:

    1. 寻道时间(Ts)

    寻道时间是指磁头从当前位置移动到目标磁道所需的时间。这个时间由两部分组成:启动磁臂的时间和磁头移动的时间。

    • 计算方法

    :Ts = m × n + s

    • 其中,m 是一个常数,表示磁头移动一条磁道的平均耗时;

    • n 是磁头需要移动的磁道数;

    • s 是启动磁臂的时间。

    2. 旋转延迟时间(Tr)

    旋转延迟时间是指指定扇区从当前位置旋转到磁头下方所需的时间。这个时间取决于磁盘的旋转速度和扇区的位置。

    • 计算方法

    :Tr = 1 / (2r)

    • 其中,r 是磁盘的旋转速度,通常以转/秒(r/s)为单位;

    • 1 / (2r) 表示磁盘旋转半圈所需的时间,因为扇区可能位于磁头的上方或下方,所以取平均值。

    注意:有时旋转延迟时间也会直接给出具体数值,如硬盘15000r/min时Tr为2ms,软盘300或600r/min时Tr为50~100ms。

    3. 传输时间(Tt)

    传输时间是指数据从磁盘读出或向磁盘写入所经历的时间。这个时间取决于每次读/写的字节数和磁盘的旋转速度。

    • 计算方法

    :Tt = b / (rN)

    • 其中,b 是每次读/写的字节数;

    • r 是磁盘的旋转速度,以转/秒(r/s)为单位;

    • N 是一条磁道上的字节数(或称为扇区的容量)。

    总结

    磁盘访问时间 Ta 可以表示为这三部分时间的和:

    Ta = Ts + Tr + Tt

    = (m × n + s) + 1 / (2r) + b / (rN)

    这个公式可以帮助我们估算磁盘访问时间,从而优化磁盘I/O性能。在实际应用中,磁盘的访问时间会受到多种因素的影响,如磁盘的硬件特性、操作系统的调度策略等,因此上述公式只能提供一个大致的估算。

  • 目前常用的磁盘调度算法有哪几种? 每种算法优先考虑的问题是什么?

    目前常用的磁盘调度算法主要有以下几种,每种算法优先考虑的问题也各不相同:

    1. 先来先服务(FCFS,First-Come, First-Served)

    • 优先考虑的问题:进程请求访问磁盘的先后次序。

    • 算法特点:按照请求的顺序进行磁盘访问,当一个请求完成后,才会执行下一个请求。优点是实现简单、公平,但缺点是可能会导致磁盘访问时间不均匀,造成一些请求等待时间过长。

    2. 最短寻道时间优先(SSTF,Shortest Seek Time First)

    • 优先考虑的问题:要求访问的磁道与当前磁头所在磁道距离是否最近。

    • 算法特点:选择离当前磁道最近的请求进行磁盘访问,以减少寻道时间。优点是能够提高磁盘访问效率,但缺点是可能会出现饥饿问题,即某些请求可能会一直等待,无法得到满足。

    3. 扫描算法(SCAN)

    • 优先考虑的问题:欲访问的磁道与当前磁道间的距离,以及磁头当前的移动方向。

    • 算法特点:磁头按照一个方向移动,直到到达最边缘,然后改变方向继续移动,依次访问请求。优点是能够保证每个请求都会被满足,但缺点是可能会出现中间请求等待时间过长的情况。该算法也被称为电梯调度算法,因为磁头移动的规律颇似电梯的运行。

    4. 循环扫描算法(C-SCAN)

    • 优先考虑的问题:与SCAN算法类似,但磁头在到达磁盘一端后会立即返回另一边,继续按照同一方向移动。

    • 算法特点:能够减少中间请求等待时间,但缺点是可能会导致最外侧和最内侧的请求等待时间过长。

    5. 简单电梯算法(LOOK)和循环LOOK算法(C-LOOK)

    • 优先考虑的问题:与SCAN和C-SCAN算法类似,但磁头在到达磁盘一端后会立即返回,继续按照相反(LOOK)或相同(C-LOOK)方向移动。

    • 算法特点:LOOK算法能够减少中间请求等待时间,但缺点是可能会导致最外侧和最内侧的请求等待时间过长;C-LOOK算法则是对LOOK算法的改进,但同样存在类似的问题。

    综上所述,这些磁盘调度算法各有优缺点,适用于不同的磁盘访问场景。选择合适的磁盘调度算法可以提高磁盘访问效率,减少等待时间,从而提高系统性能。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐