一、引言
在计算机操作系统中,输入 / 输出(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 利用率低,因为在等待设备完成操作的过程中,CPU 处于空闲状态,不能执行其他任务。
- 中断驱动 I/O 模型:当设备完成数据传输或发生特定事件时,向 CPU 发送中断信号。CPU 在收到中断后,暂停当前任务,转而处理中断服务程序来处理设备相关事务,如读取数据或处理错误。与程序控制 I/O 模型相比,它提高了 CPU 的利用率,因为 CPU 在设备操作期间可以执行其他任务,只有在中断发生时才介入处理。
- 直接内存访问(DMA)模型:对于一些高速设备,如磁盘驱动器,为了进一步减轻 CPU 的负担,采用 DMA 方式。DMA 控制器可以直接在设备和内存之间传输数据,不需要 CPU 频繁地参与数据传输的每一个步骤。CPU 只需在数据传输开始和结束时进行一些必要的初始化和收尾工作,大大提高了系统的数据传输效率。
- 通道 I/O 模型:通道是一种特殊的处理机,它可以独立执行通道程序来控制设备的操作。通道可以同时管理多个设备的 I/O 操作,进一步提高了系统的并行处理能力和整体性能。它与 DMA 相比,功能更强大,能处理更复杂的 I/O 任务。
- I/O 接口
- 命令接口:提供给用户或程序用于向操作系统请求 I/O 操作的命令。例如,在命令行界面中,用户可以输入 “cp file1 file2” 命令,其中涉及到从硬盘读取文件和写入文件的 I/O 操作,操作系统通过命令接口解析并执行相应的 I/O 任务。
- 程序接口:也称为系统调用接口。程序员可以在程序中使用系统调用函数来实现 I/O 操作。例如,在 C 语言中,使用 “open ()”“read ()”“write ()” 等函数来打开文件、读取文件内容和写入文件内容,这些函数最终会通过系统调用陷入内核态,由操作系统的 I/O 系统完成实际的操作。
四、I/O 设备和设备控制器
- I/O 设备分类
- 按传输速率分类:
- 低速设备:如键盘、鼠标等,数据传输速率相对较低,通常以字节为单位进行数据传输。例如,键盘输入字符的速度一般在每秒几个字符到几十个字符之间。
- 中速设备:像打印机、扫描仪等,其传输速率介于低速和高速设备之间。例如,普通喷墨打印机的打印速度大约在每分钟几页到几十页不等。
- 高速设备:如磁盘驱动器、网络接口卡等,数据传输速率很高。例如,现代高速硬盘的内部传输速率可以达到每秒几百兆字节甚至更高。
- 按信息交换单位分类:
- 字符设备:以字符为单位进行数据传输,如终端设备、打印机等。每次传输一个字符或一组字符。
- 块设备:以数据块为单位进行传输,如磁盘、磁带等。数据块的大小通常是固定的,如 512 字节或 4KB 等。
- 按传输速率分类:
- 设备控制器
- 设备控制器是连接 I/O 设备与计算机系统总线的硬件部件。它的主要功能包括:
- 接收和解析 CPU 发来的命令,并将其转换为设备能够理解的控制信号,控制设备的操作。例如,当 CPU 发送读取磁盘某个扇区数据的命令时,设备控制器将该命令转换为磁盘驱动器的磁头移动、数据读取等操作信号。
- 对设备的状态进行监测和反馈。如监测打印机是否缺纸、磁盘是否处于就绪状态等,并将这些状态信息通过状态寄存器反馈给 CPU,以便 CPU 做出相应的决策。
- 数据缓冲。设备控制器通常包含数据缓冲区,用于暂存设备与内存之间传输的数据,以协调设备与 CPU 之间不同的数据传输速率。例如,从磁盘读取的数据先暂存在设备控制器的缓冲区,然后再逐步传输到内存中。
- 设备控制器是连接 I/O 设备与计算机系统总线的硬件部件。它的主要功能包括:
五、中断和中断处理程序
- 中断的概念与类型
- 中断是指计算机在执行程序过程中,遇到某些特殊事件或外部请求时,暂停当前程序的执行,转而执行相应的中断处理程序,处理完中断事件后再返回原来程序继续执行的过程。
- 硬件中断:由硬件设备产生,如设备完成数据传输、设备故障等。例如,当磁盘完成一次数据读取操作后,会向 CPU 发送一个硬件中断信号,通知 CPU 数据已准备好。
- 软件中断:由程序中的特定指令或操作系统内核产生。例如,系统调用在执行时会产生软件中断,将 CPU 从用户态切换到内核态,以便操作系统执行相应的系统服务。
- 中断处理程序
- 中断处理程序是操作系统内核中的一段代码,用于处理特定的中断事件。其主要任务包括:
- 保存当前程序的上下文信息,如程序计数器、寄存器内容等,以便在中断处理完成后能够正确地恢复程序执行。
- 对中断事件进行处理,如读取设备数据、处理设备错误等。例如,如果是磁盘读取中断,中断处理程序会将设备控制器缓冲区中的数据复制到内存指定位置。
- 恢复被中断程序的上下文信息,然后返回被中断的程序继续执行。
- 中断处理程序是操作系统内核中的一段代码,用于处理特定的中断事件。其主要任务包括:
六、设备驱动程序
- 设备驱动程序的作用
- 设备驱动程序是操作系统内核与设备控制器之间的桥梁。它负责将操作系统的通用 I/O 操作请求转换为设备控制器能够理解的特定命令和参数,控制设备的具体操作。例如,对于不同型号的打印机,设备驱动程序会根据打印机的特性,将操作系统的打印请求转换为打印机能够识别的打印指令序列,如控制打印头移动、喷墨或激光打印等操作。
- 设备驱动程序还负责处理设备的中断请求,将中断信号转换为操作系统能够理解的事件通知,并调用相应的中断处理程序进行处理。
- 设备驱动程序的特点
- 设备驱动程序通常与特定的设备紧密相关,不同类型的设备需要不同的驱动程序。例如,显卡驱动程序用于控制显卡的显示功能,而声卡驱动程序则负责声卡的音频处理。
- 设备驱动程序运行在内核态,因为它需要直接访问硬件设备和内核资源。这就要求设备驱动程序具有较高的稳定性和安全性,否则可能导致系统崩溃或安全漏洞。
七、与设备无关的 I/O 软件
- 功能概述
- 与设备无关的 I/O 软件位于设备驱动程序之上,为应用程序提供统一的 I/O 操作接口。它的主要功能包括:
- 设备命名与映射。为不同的设备提供统一的命名方式,并且将设备名映射到相应的设备驱动程序和物理设备。例如,在操作系统中,无论使用何种硬盘型号,应用程序都可以通过统一的文件路径名(如 “/dev/sda1”)来访问硬盘分区,与设备无关的 I/O 软件负责将这个文件名转换为对应的硬盘设备驱动程序的调用。
- 设备保护。根据用户的权限和设备的访问策略,限制对设备的访问。例如,普通用户可能只有读取某些设备的权限,而管理员用户则具有读写权限,与设备无关的 I/O 软件负责检查和执行这些访问权限控制。
- 提供与设备无关的逻辑块大小。不同的块设备可能有不同的物理块大小,但与设备无关的 I/O 软件向应用程序提供统一的逻辑块大小概念,方便应用程序进行数据读写操作,而不必关心底层设备的物理块细节。
- 与设备无关的 I/O 软件位于设备驱动程序之上,为应用程序提供统一的 I/O 操作接口。它的主要功能包括:
- 缓冲与缓存
- 缓冲是在设备控制器或内存中开辟的一块临时存储区域,用于暂存设备与内存之间传输的数据,以减少数据传输次数和提高系统性能。例如,在网络通信中,接收缓冲区用于暂存从网络接收到的数据,然后应用程序再从缓冲区读取数据,而不是每次接收一个数据包就直接交给应用程序。
- 缓存则是将经常访问的数据或程序代码存储在高速缓存存储器(如 CPU 缓存或内存中的缓存区域)中,以加快数据访问速度。例如,操作系统会将磁盘上经常访问的文件数据缓存到内存中,当再次访问这些文件时,可以直接从内存缓存中读取,而不必从磁盘重新读取,大大提高了文件访问速度。
八、用户层的 I/O 软件
- 库函数
- 用户层的 I/O 软件包括各种库函数,如 C 语言中的标准 I/O 库函数(stdio.h 中的函数)。这些库函数提供了比系统调用更方便、更高级的 I/O 操作接口。例如,“printf ()” 函数用于格式化输出数据到标准输出设备(通常是终端屏幕),它内部会调用系统调用实现实际的输出操作,但对用户隐藏了系统调用的复杂性,如缓冲区管理、字符编码转换等。
- 库函数还可以提供一些额外的功能,如数据格式化、错误处理等。例如,“fopen ()” 函数不仅可以打开文件,还可以指定文件的打开模式(只读、只写、读写等),并且在文件打开失败时返回相应的错误信息。
- 假脱机系统(SPOOLing)
- 假脱机系统是一种在用户层实现的 I/O 技术,主要用于将独占设备模拟为共享设备。例如,打印机是一种独占设备,在没有假脱机系统时,一个进程占用打印机期间,其他进程无法使用。而假脱机系统在磁盘上开辟一个打印缓冲区(通常称为打印队列),当多个进程有打印请求时,将打印数据先存储到打印队列中,然后由一个专门的后台进程负责从打印队列中取出数据并发送到打印机进行打印。这样,多个进程的打印请求可以并发进行,提高了打印机的利用率和系统的整体性能。
九、缓冲区管理
- 单缓冲区
- 单缓冲区是最简单的缓冲区形式。在数据传输时,例如从设备读取数据到内存,数据先被读入缓冲区,然后 CPU 再从缓冲区读取数据进行处理。这种方式可以在一定程度上缓解设备与 CPU 之间的数据传输速率不匹配问题,但如果 CPU 处理数据的速度比设备读取数据的速度慢很多,可能会导致缓冲区溢出或设备等待时间过长。
- 双缓冲区
- 双缓冲区使用两个缓冲区交替工作。当一个缓冲区正在被 CPU 处理数据时,另一个缓冲区可以进行数据的接收或传输操作。例如,在音频播放中,一个缓冲区用于从音频文件读取音频数据,另一个缓冲区中的数据则被送到音频播放设备进行播放,这样可以提高音频播放的连续性和流畅性,减少卡顿现象。
- 循环缓冲区
- 循环缓冲区是一个由多个缓冲区组成的环形结构。数据在缓冲区中按照顺序依次存储和读取,当读到缓冲区末尾时,又回到缓冲区开头继续操作。例如,在网络数据接收中,循环缓冲区可以不断地接收网络数据包,应用程序从缓冲区中按照顺序取出数据包进行处理,这种方式可以提高缓冲区的利用率,并且能够适应网络数据的突发流量情况。
十、磁盘性能概述和磁盘调度
- 磁盘性能指标
- 寻道时间:磁头从当前位置移动到目标磁道所需要的时间。寻道时间是影响磁盘性能的重要因素之一,一般在几毫秒到十几毫秒之间,并且随着磁盘技术的发展,寻道时间逐渐缩短。
- 旋转延迟:磁盘旋转将目标扇区移动到磁头下方所需要的时间。对于一个转速为 7200 转 / 分钟的磁盘,其平均旋转延迟约为 4.17 毫秒(旋转半圈的时间)。
- 传输时间:数据在磁头和内存之间传输所需要的时间,取决于磁盘的传输速率和数据量大小。例如,一个传输速率为 100MB/s 的磁盘,传输 1MB 的数据大约需要 10 毫秒。
- 磁盘调度算法
- 先来先服务(FCFS):按照磁盘请求的先后顺序进行处理。这种算法简单公平,但可能导致磁头频繁地大幅度移动,尤其是在磁盘请求分布不均匀时,会使平均寻道时间较长,从而降低磁盘性能。
- 最短寻道时间优先(SSTF):优先选择离当前磁头位置最近的磁盘请求进行处理。这种算法可以减少磁头的移动距离,提高磁盘的吞吐量,但可能会导致某些请求长时间得不到服务,产生饥饿现象。
- 扫描算法(SCAN):磁头从磁盘的一端向另一端移动,在移动过程中处理经过磁道上的请求,到达磁盘另一端后,再反向移动继续处理请求。这种算法避免了饥饿现象,并且相对比较公平,但可能存在磁头在磁盘两端来回移动的情况,造成一定的效率损失。
- 循环扫描算法(C-SCAN):与扫描算法类似,但磁头只朝一个方向移动,到达磁盘一端后,直接快速返回到磁盘的起始端,然后继续单向移动处理请求。这种算法减少了磁头反向移动的时间,进一步提高了磁盘性能。
十一、总结
计算机操作系统的 I/O 系统是一个复杂而又关键的组成部分。它涵盖了从设备硬件到软件接口的多个层次,包括设备控制器、设备驱动程序、与设备无关的 I/O 软件、用户层的 I/O 软件等。通过合理的 I/O 模型选择、设备管理与调度、缓冲区管理以及磁盘调度等技术手段,能够提高计算机系统的整体性能,实现高效的数据输入 / 输出操作,满足不同应用程序和用户对计算机系统在数据处理和交互方面的需求。深入理解 I/O 系统的原理和机制对于计算机专业人员在操作系统开发、系统优化以及故障排查等方面都有着极为重要的意义。