操作系统 - 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 软件都由库程序组成,但也有一些例外,例如假脱机系统,这是一种在多道程序设计系统中处理专用 I/O 设备的方法。

I/O 库(例如,stdio)位于用户空间中,为操作系统驻留的设备独立 I/O 软件提供接口。例如,putchar()、getchar()、printf() 和 scanf() 是 C 编程中可用的用户级 I/O 库 stdio 的示例。

内核 I/O 子系统

内核I/O子系统负责提供许多与I/O相关的服务。以下是所提供的一些服务。

  • 调度- 内核调度一组 I/O 请求以确定执行它们的良好顺序。当应用程序发出阻塞 I/O 系统调用时,请求将被放入该设备的队列中。内核 I/O 调度程序重新排列队列的顺序,以提高整体系统效率和应用程序经历的平均响应时间。

  • 缓冲- 内核 I/O 子系统维护一个称为缓冲区的内存区域,用于在两个设备之间或具有应用程序操作的设备之间传输数据时存储数据。进行缓冲是为了解决数据流的生产者和消费者之间的速度不匹配问题,或者在具有不同数据传输大小的设备之间进行调整。

  • 缓存- 内核维护缓存内存,这是保存数据副本的快速内存区域。访问缓存副本比访问原始副本更有效。

  • 假脱机和设备预留- 假脱机是一个缓冲区,用于保存无法接受交错数据流的设备(例如打印机)的输出。假脱机系统一次将一个排队的假脱机文件复制到打印机。在某些操作系统中,假脱机由系统守护进程管理。在其他操作系统中,它由内核线程处理。

  • 错误处理- 使用受保护内存的操作系统可以防止多种硬件和应用程序错误。