操作系统 - I/O 软件
I/O 软件通常按以下层次组织 −
用户级库 − 它为用户程序提供简单的输入输出接口。例如,stdio 是 C 和 C++ 编程语言提供的库。
内核级模块 − 它提供设备驱动程序来与设备控制器交互,以及设备驱动程序使用的设备无关 I/O 模块。
硬件 − 该层包括实际硬件和硬件控制器,后者与设备驱动程序交互并激活硬件。
I/O 软件设计的一个关键概念是设备无关性,即应该能够编写出无需预先指定设备即可访问任何 I/O 设备的程序。例如,一个将文件作为输入读取的程序应该能够读取软盘、硬盘或 CD-ROM 上的文件,而无需为每个不同设备修改程序。
设备驱动程序
设备驱动程序是可以插入操作系统以处理特定设备的软件模块。操作系统借助设备驱动程序来处理所有 I/O 设备。设备驱动程序封装设备相关代码,并实现标准接口,其中包含设备特定的寄存器读/写操作。设备驱动程序通常由设备制造商编写,并随设备一起以 CD-ROM 形式提供。
设备驱动程序执行以下任务 −
- 接受来自其上方设备无关软件的请求。
- 与设备控制器交互,进行 I/O 收发并执行必要的错误处理。
- 确保请求成功执行。
设备驱动程序处理请求的过程如下:假设有一个读取块 N 的请求。如果驱动程序在请求到达时空闲,它会立即开始执行请求。否则,如果驱动程序正忙于其他请求,它会将新请求放入待处理请求队列中。
中断处理程序
中断处理程序,也称为中断服务例程或 ISR,是操作系统(更具体地说是设备驱动程序)中的一段软件或更具体地说是一个回调函数,其执行由中断的接收触发。
当中断发生时,中断过程会执行必要的操作来处理中断,更新数据结构,并唤醒等待中断发生的进程。
中断机制接受一个地址,该地址是一个数字,用于从一小组中断处理例程/函数中选择特定的中断处理例程。在大多数架构中,此地址是一个偏移量,存储在称为中断向量表的表中。该向量包含专用中断处理程序的内存地址。
设备无关 I/O 软件
设备无关软件的基本功能是为所有设备执行通用 I/O 操作,并为用户级软件提供统一接口。虽然编写完全设备无关的软件很困难,但我们可以编写一些在所有设备中通用的模块。以下是设备无关 I/O 软件的功能列表 −
- 为设备驱动程序提供统一接口
- 设备命名 - 助记名映射到主设备号和次设备号
- 设备保护
- 提供设备无关的块大小
- 缓冲,因为从设备传出的数据无法直接存储到最终目的地。
- 块设备上的存储分配
- 分配和释放专用设备
- 错误报告
用户空间 I/O 软件
这些是提供更丰富和简化的接口来访问内核功能或最终与设备驱动程序交互的库。大多数用户级 I/O 软件由库过程组成,有些例外如 spooling 系统,它是一种在多道程序系统中处理专用 I/O 设备的方式。
I/O 库(例如 stdio)位于用户空间,提供接口访问操作系统驻留的设备无关 I/O 软件。例如 putchar()、getchar()、printf() 和 scanf() 是 C 编程语言中用户级 I/O 库 stdio 的示例。
内核 I/O 子系统
内核 I/O 子系统负责提供与 I/O 相关的多种服务。以下是一些提供的服务。
Scheduling − 内核对一组 I/O 请求进行调度,以确定执行它们的良好顺序。当应用程序发出阻塞 I/O 系统调用时,该请求被放入该设备的队列中。内核 I/O 调度器重新排列队列顺序,以提高整体系统效率和应用程序体验的平均响应时间。
Buffering − 内核 I/O 子系统维护一个称为 buffer 的内存区域,用于在两个设备之间或设备与应用程序操作之间传输数据时存储数据。Buffering 的目的是应对数据流的生产者和消费者之间的速度不匹配,或适应具有不同数据传输大小的设备。
Caching − 内核维护缓存内存,这是快速内存区域,用于保存数据的副本。访问缓存副本比访问原始数据更高效。
Spooling and Device Reservation − Spool 是一个缓冲区,用于为设备(如打印机)保存输出,这些设备无法接受交错数据流。Spooling 系统一次将排队的 spool 文件复制到打印机。在某些操作系统中,spooling 由系统守护进程管理。在其他操作系统中,它由内核线程处理。
Error Handling − 使用保护内存的操作系统可以防范多种硬件和应用程序错误。