【计算机操作系统】第六章、操作系统中的输入输出系统
前言
在计算机科学的世界里,操作系统无疑扮演着核心的角色,它就像是计算机的“大脑”,负责协调硬件资源和软件应用之间的交互。而在操作系统的诸多功能中,输入输出(I/O)系统是其中最为复杂且与硬件密切相关的部分。今天,就让我们深入探讨一下 I/O 系统的奥秘,从理论出发,结合实际案例,帮助大家更好地理解和掌握这些知识点。
一、I/O 系统的功能:让设备动起来
I/O 系统是操作系统的四大管理功能之一,它的主要任务是管理各种外部设备。由于计算机外部设备的类型繁多、差异很大,I/O 系统也因此变得极为复杂。那么,I/O 系统究竟有哪些功能呢?
(一)方便使用
I/O 系统的第一个功能是方便用户使用。它通过隐藏物理设备的细节,让用户可以通过简单的几条命令来操作设备。例如,用户可以通过逻辑设备名来访问物理设备,而不需要关心设备的具体物理细节。这种与设备无关性大大简化了用户的操作。
(二)提高 CPU 和 I/O 设备利用率
I/O 系统的第二个功能是提高 CPU 和 I/O 设备的利用率。它通过提高 I/O 访问效率,匹配 CPU 和多种不同处理速度的外设,使得处理器和 I/O 设备能够并行操作。例如,当 CPU 在处理数据时,I/O 设备可以同时进行数据传输,从而提高了系统的整体效率。
(三)共享和错误处理
I/O 系统的第三个功能是对不同类型的设备进行统一管理,协调对设备的并发使用。当发生错误时,I/O 系统会进行处理,尽量避免将错误传递给高层软件。例如,如果一个设备在使用过程中出现故障,I/O 系统会尝试自动恢复,或者将错误记录下来,以便后续分析。
二、I/O 系统的层次结构:分层管理,高效运行
I/O 系统的复杂性不仅体现在其功能上,还体现在其层次结构上。I/O 系统通常分为以下几个层次:
(一)用户进程层
用户进程层是 I/O 系统的最外层,它实现了与用户的交互接口,执行输入输出系统调用,对 I/O 数据进行格式化,并为假脱机(Spooling)输入输出作准备。例如,当用户在终端上输入命令时,用户进程层会将这些命令转换为系统能够理解的形式,并进行相应的处理。
(二)独立于设备的软件
独立于设备的软件是 I/O 系统的核心部分,它实现了用户程序与设备驱动器之间的统一接口。它的主要任务是实现所有设备都需要的功能,并向用户提供一个统一的接口。例如,它负责设备的命名、保护、成块处理、缓冲技术和设备分配等。
(三)设备驱动程序
设备驱动程序是 I/O 系统与硬件直接相关的部分,它对设备发出操作命令,设置设备寄存器,并检查设备的执行状态。每个设备都有一个对应的设备驱动程序,负责与该设备进行通信。例如,当用户请求读取磁盘上的数据时,设备驱动程序会向磁盘控制器发送读取命令,并等待数据返回。
(四)中断处理程序
中断处理程序是 I/O 系统的重要组成部分,它负责处理设备产生的中断信号。当中断发生时,中断处理程序会保护现场,转设备驱动程序进程进行中断处理,I/O 完成后,恢复现场,返回被中断的进程。例如,当磁盘数据读取完成后,磁盘控制器会发出一个中断信号,中断处理程序会响应这个信号,完成数据的传输。
(五)硬件层
硬件层是 I/O 系统的最底层,它实现了物理 I/O 的操作。硬件层包括各种外部设备和设备控制器,负责实际的数据传输和设备操作。例如,磁盘控制器会根据设备驱动程序的命令,从磁盘上读取数据,并将其传输到内存中。
三、I/O 设备和设备控制器:设备的“大脑”和“手脚”
I/O 设备是计算机系统中用于输入和输出数据的硬件设备,而设备控制器则是控制这些设备的“大脑”。设备控制器是一个可编址的设备,它接收 CPU 发来的命令,控制设备进行数据传输,并向 CPU 报告设备的状态。
(一)I/O 设备的分类
I/O 设备可以根据不同的标准进行分类:
按交互对象分类:人机交互设备(如键盘、鼠标)、与计算机或其他电子设备交互的设备(如磁盘、网卡)以及计算机间的通信设备(如网卡、调制解调器)。
按交互方向分类:输入设备(如键盘)、输出设备(如打印机)以及输入/输出设备(如磁盘、网卡)。
按外设特性分类:使用特征(如存储、输入/输出、终端)、数据传输率(如低速、中速、高速)以及信息组织特征(如字符设备、块设备)。
按设备的共享属性分类:独占设备(如打印机)、共享设备(如磁盘)以及虚拟设备(如 SPOOLing 系统中的虚拟打印机)。
(二)设备控制器的功能
设备控制器的主要功能包括:
接收和识别命令:接收 CPU 发来的读写指令,并识别这些指令。
数据交换:在 CPU 与控制器、控制器与设备之间进行数据交换。
设备状态标识和报告:记录设备状态,并向 CPU 报告设备的状态。
地址识别:根据设备地址和寄存器地址,找到相应的设备。
数据缓冲:缓冲外设和内存、CPU 数据交换时速度不匹配带来的问题。
差错控制:在设备传给 CPU 数据时,进行差错检查。
四、中断处理程序:处理设备的“紧急信号”
中断是 CPU 对 I/O 设备发来的中断信号的一种响应。当中断发生时,CPU 会暂停正在执行的程序,保存现场,转去执行相应的中断处理程序,完成后返回断点,继续执行。
(一)中断的类型
中断可以分为内中断和外中断:
内中断:由 CPU 内部事务引起的中断,如非法指令、地址越界等。
外中断:由 I/O 设备引起的中断,如设备完成操作后发出的中断请求。
(二)中断处理过程
中断处理过程包括以下几个步骤:
检查中断信号:CPU 检查是否有中断信号到来。
保护现场:保存当前程序的状态,包括程序计数器、寄存器等。
转中断处理程序:根据中断向量表,找到对应的中断处理程序并执行。
恢复现场:中断处理完成后,恢复被中断程序的状态,返回继续执行。
(三)中断优先级和中断屏蔽
中断优先级:不同的中断请求信号有不同的处理优先级别,系统可以根据紧急程度进行处理。
中断屏蔽:在处理一个中断时,可以屏蔽其他中断信号,以避免中断嵌套。
五、设备驱动程序:设备的“翻译官”
设备驱动程序是 I/O 系统高层进程与控制器之间的通信程序,它负责将上层软件的抽象命令转换为具体的硬件操作命令,并将设备控制器的信号传送给上层软件。
(一)设备驱动程序的功能
接收命令和参数:接收由设备无关软件发来的命令和参数,并将命令中的抽象要求转换为具体要求。
检查请求合法性:检查用户的 I/O 请求是否合法,并了解设备的工作状态。
发出 I/O 命令:如果设备空闲,立即启动 I/O 设备完成操作;如果设备忙碌,则将请求挂在设备队列上等待。
响应中断信号:响应设备控制器发来的中断信号,调用中断处理程序。
(二)设备驱动程序的特点
与硬件密切相关:设备驱动程序与设备控制器和 I/O 设备的硬件特性紧密相关,因此对不同类型的设备需要配置不同的驱动程序。
与 I/O 控制方式相关:设备驱动程序与 I/O 设备所采用的 I/O 控制方式(如中断、DMA)紧密相关。
部分代码用汇编语言编写:由于设备驱动程序与硬件紧密相关,其中的一部分必须用汇编语言书写。
允许可重入:设备驱动程序应允许可重入,即一个正在运行的驱动程序可以在运行完之前再次被调用。
六、对 I/O 设备的控制方式:不同的“指挥棒”
I/O 设备的控制方式决定了 CPU 与 I/O 设备之间的交互方式。常见的控制方式包括:
(一)程序 I/O 方式
程序 I/O 方式是由程序发起 I/O 操作,并等待操作完成。数据的每次读写通过 CPU,CPU 循环测试外设的完成状态。这种方式的缺点是 CPU 在外设进行数据处理时只能等待,效率较低。
(二)中断驱动 I/O 控制方式
中断驱动 I/O 控制方式是由程序发起 I/O 操作,在操作完成时由外设向 CPU 发出中断。数据的每次读写通过 CPU,但 CPU 不必等待外设完成操作,可以继续执行其他程序。这种方式的优点是 CPU 的利用率较高,但缺点是每次处理的数据量较少,只适用于数据传输率较低的设备。
(三)DMA(直接存储器访问)方式
DMA 方式允许数据直接在设备和内存之间传输,而不需要 CPU 的干预。这种方式的传输单位是数据块,数据从设备直接送到内存或相反。DMA 方式的工作流程如下:
设置 AR 和 DC 初值:设置内存地址寄存器和数据计数器的初始值。
启动 DMA 传送命令:启动 DMA 传输。
挪用存储器周期传送:在 CPU 继续执行用户程序的同时,DMA 控制器完成数据传输。
请求中断:传输完成后,DMA 控制器向 CPU 发出中断请求。
(四)I/O 通道控制方式
I/O 通道是一种特殊的处理机,它具有执行 I/O 指令的能力,并通过执行通道程序来控制 I/O 操作。I/O 通道方式是 DMA 方式的发展,它可进一步减少 CPU 的干预,提高系统的效率。常见的通道类型包括:
字节多路通道:允许多个低速设备共享一个通道。
数组选择通道:适用于连接多台高速设备,但每次只能控制一台设备。
数组多路通道:结合了字节多路通道和数组选择通道的特点,具有较高的传输速率和并行操作能力。
七、设备分配:合理使用外设
设备分配是操作系统对进程使用外设过程的管理。设备分配的目标是合理使用外设,提高设备利用率,同时避免死锁。
(一)设备分配中的数据结构
设备分配涉及多个数据结构,包括:
设备控制表(DCT):每个设备一张,描述设备的特性和状态。
控制器控制表(COCT):每个设备控制器一张,描述 I/O 控制器的配置和状态。
通道控制表(CHCT):每个通道一张,描述通道的工作状态。
系统设备表(SDT):系统内一张,反映系统中设备资源的状态。
(二)设备分配原则
设备分配的原则包括:
独占设备:如打印机等,一次只能被一个进程使用。
共享设备:如磁盘、网卡等,可以被多个进程共享。
静态分配:在进程创建时分配,在进程退出时释放,不会出现死锁,但设备利用率较低。
动态分配:在进程执行过程中根据需要分配,使用结束后释放,需要考虑死锁问题,但有利于提高设备利用率。
(三)设备独立性
设备独立性是指应用程序独立于具体使用的物理设备。通过引入逻辑设备和物理设备的概念,应用程序可以使用逻辑设备名称来请求使用某类设备,而系统在实际执行时会将逻辑设备名称转换为物理设备名称。设备独立性的好处包括:
设备分配的灵活性:多台相同设备可以灵活选择,物理设备更新不会对用户程序造成影响。
易于实现 I/O 重定向:使用的设备可以更换,不需要改变应用程序。
(四)SPOOLing 技术
SPOOLing 技术是一种假脱机操作技术,它通过在磁盘上设置输入井和输出井,将独占设备改造为共享设备。SPOOLing 系统的组成包括:
输入进程:将输入设备上的数据传送到输入井。
输出进程:将输出井中的数据传送到输出设备。
输入缓冲区和输出缓冲区:用于暂存数据。
SPOOLing 技术的特点包括:
提高 I/O 速度:数据放入高速的磁盘中作为缓冲。
将独占设备改造为共享设备:对独占设备的操作变成了数据放入磁盘中,排队等待。
实现虚拟设备功能:虽然独占设备变成了共享设备,但从每个使用进程的角度看,还是自己独占使用。
八、缓冲区管理:平滑速度差异
缓冲区管理是 I/O 系统中的一个重要组成部分,它通过设置缓冲区来平滑 CPU 和 I/O 设备之间的速度差异,提高系统的效率。
(一)缓冲的引入
缓冲区可以缓和 CPU 与 I/O 设备之间速度不匹配的矛盾,减少对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制,提高 CPU 和 I/O 设备之间的并行性。
(二)单缓冲和双缓冲
单缓冲:使用一个缓冲区,系统处理数据的时间可以是 M+T 或 M+C。
双缓冲:使用两个缓冲区,系统处理数据的时间可以粗略为 Max(C,T)。
(三)循环缓冲
当输入和输出的速度基本匹配时,双缓冲的效果较好,但当二者速度相差甚远时,双缓冲的效果就不理想了。此时可以增加缓冲区数量,将多个缓冲区组成环形形式,形成循环缓冲。循环缓冲的工作方式包括:
Getbuf 过程:得到需要的缓冲区,并移动相应的指针。
Releasebuf 过程:释放缓冲区,修改缓冲区状态。
(四)缓冲池
缓冲池是公用缓冲区的一种形式,它包含一组缓冲区和对它们进行管理的数据结构及操作函数。缓冲池的工作方式包括:
收容输入:调用 Getbuf(emq)得到空缓冲区,输入数据后调用 Putbuf(inq)。
提取输入:调用 Getbuf(inq)得到装满数据的缓冲区,提取数据后调用 Putbuf(emq)。
收容输出:调用 Getbuf(emq)得到空缓冲区,输出数据后调用 Putbuf(outq)。
提取输出:调用 Getbuf(outq)得到装满数据的缓冲区,提取数据后调用 Putbuf(emq)。
九、磁盘存储器:数据的“仓库”
磁盘存储器是计算机系统中用于存储数据的重要设备。磁盘的性能直接影响系统的数据处理速度,因此磁盘调度算法的选择至关重要。
(一)磁盘性能简述
磁盘的结构:磁盘可以包括一个或多个盘片,每片有两个面,每个面有若干条磁道,每条磁道有若干个扇区。
磁盘的类型:包括固定磁头磁盘和移动磁头磁盘。
磁盘访问时间:包括寻道时间、旋转延迟时间和传输时间。
(二)磁盘调度算法
当多个进程都要访问磁盘时,需要选择一种调度算法,使访问磁盘的时间最小。常见的磁盘调度算法包括:
先来先服务(FCFS):简单、公平,但未对寻道优化,平均寻道时间可能较长。
最短寻道时间优先(SSTF):选择离当前磁头最近的磁道进行访问,但可能导致某些进程发生“饥饿”现象。
扫描(SCAN)算法:磁头沿一个方向移动,到达磁盘的一端后,再沿另一个方向移动,类似于电梯调度。
循环扫描(CSCAN)算法:磁头只按一个方向循环移动,避免了某些进程的“饥饿”现象。
N-Step-SCAN 算法:将磁盘请求队列分成若干个长度为 N 的子队列,按 SCAN 算法处理每个子队列,避免了“磁臂粘着”现象。
FSCAN 算法:将磁盘请求队列分成两个子队列,一个由当前所有请求磁盘 I/O 的进程形成的队列,另一个是新出现的请求队列,避免了新请求的延迟。
十、总结
I/O 系统是操作系统中最复杂且与硬件密切相关的部分,它通过分层管理、设备分配、缓冲区管理和磁盘调度等方式,实现了对各种外部设备的有效管理。通过合理选择 I/O 控制方式和调度算法,可以显著提高系统的效率和性能。
希望这篇文章能够帮助大家更好地理解和掌握 I/O 系统的相关知识,为考试做好充分的准备。如果你对操作系统感兴趣,或者在学习过程中遇到了困难,欢迎随时交流和讨论。让我们一起探索计算机科学的奥秘,共同进步!