操作系统中I/O编程是怎么实现的?

文章导读
Previous Quiz Next 输入/输出操作(I/O)是操作系统的重要组成部分。I/O 操作实现了 CPU 与其他设备之间的通信。有多种 I/O 技术,如 programmed I/O、中断 I/O 和直接内存访问(DMA),其中 programmed I/O
📋 目录
  1. 什么是 Programmed I/O?
  2. Programmed I/O 如何工作?
  3. Programmed I/O 中的 I/O 命令
  4. Programmed I/O 中的 I/O 寻址方法
  5. Programmed I/O 的优点
  6. Programmed I/O 的缺点
  7. 结论
A A

操作系统 - 程序控制 I/O



Previous
Quiz
Next

输入/输出操作(I/O)是操作系统的重要组成部分。I/O 操作实现了 CPU 与其他设备之间的通信。有多种 I/O 技术,如 programmed I/O、中断 I/O 和直接内存访问(DMA),其中 programmed I/O 是数据传输最简单、最基本的实现方式。

什么是 Programmed I/O?

Programmed I/O 是最简单的 I/O 形式之一,其中 CPU 需要承担所有工作。I/O 指令编写在计算机程序中,每次数据项传输都由程序指令发起。CPU 管理所有设备与内存之间的数据传输。在 programmed I/O 中,CPU 控制数据传输的所有方面,例如发起 I/O 操作、持续监控设备状态、在设备与寄存器之间传输数据、在寄存器与内存之间移动数据,以及判断操作何时完成。

Programmed I/O 可用于各种场景:

  • 在键盘中,持续检查按键。
  • 在鼠标中,持续检查鼠标位置和按钮状态。
  • 在打印机中,持续检查打印机是否就绪。
  • 在磁盘驱动器中,持续检查读/写头是否就位。

Programmed I/O 如何工作?

Programmed I/O 遵循由 CPU 管理的各种步骤的顺序模式。以下是使用打印机打印字符串的示例:

Programmed i/o Example

步骤 1 − 首先通过系统调用打开打印机来发起 I/O 操作。操作系统检查打印机是否可用,如果可用则授予访问权限;如果打印机正忙,则返回错误。

步骤 2 − 然后操作系统将您要传输的数据复制到内核缓冲区,如上图动画所示。

步骤 3 − 然后 CPU 持续检查打印机是否就绪(polling)。在上图动画中,可以看到 CPU 在打印机未就绪时的 polling 过程。

步骤 4 − 一旦打印机就绪,CPU 传输一个字节或字的数据。上图动画演示了每次打印机就绪时传输单个字母。

步骤 5 − 上述步骤 3 和 4 由 CPU 重复执行,直到完整字符串被打印。CPU 检查状态,然后逐字节/字符打印字符串。

Polling 是一种方法,其中 CPU 持续检查设备是否准备好进行下一次操作。它在循环中不断检查设备状态。因此,CPU 在设备响应之前一直处于忙碌状态。这也被称为 busy waiting。

Programmed I/O 中的 I/O 命令

Programmed I/O 中的主要命令如下所述:

  • 控制命令 − 控制命令用于初始化 I/O 设备。它设置传输模式、数据格式或设备特定设置等参数。

    示例 RESET_DEVICE, SET_PARITY EVEN, ENABLE_FLOW_CONTROL, SPIN_UP 等。

  • 测试命令 − 测试命令检查 I/O 组件和设备的状态条件。它检查设备是否已开启、是否可用、先前操作是否成功完成,以及是否发生任何错误。

    示例 − TEST_READY, TEST_BUSY, TEST_DEVICE_PRESENT, TEST_SEEK_COMPLETE, TEST_DRIVE_READY 等。

  • 读命令 − 读命令要求 I/O 组件从设备检索数据到内部缓冲区。输入缓冲区中的数据通过数据总线由处理器访问。

    示例 READ_CHAR, READ_DATA_REGISTER, READ_SECTOR, READ_MOUSE_DATA 等。

  • 写命令 − 写命令指示 I/O 组件从数据总线获取数据。此数据传输到输出设备。

    示例 − WRITE_STRING, WRITE_BYTE, WRITE_PIXEL, WRITE_SECTOR 等。

Programmed I/O 中的 I/O 寻址方法

In Programmed I/O 中,CPU 直接访问寄存器和数据端口来管理输入/输出操作。它可以使用两种寻址方法实现 −

  • Memory-mapped I/O (MMIO)
  • Port-mapped I/O (PMIO)

Memory-mapped I/O (MMIO)

Memory-mapped I/O 将寄存器映射到内存地址空间中。程序使用读写指令来访问设备。CPU 使用常规的 load/store 指令来访问 I/O。它允许使用标准的内存操作指令进行 I/O 操作。例如:*(volatile int*)0xFFFF0000 = 1;

Port-mapped I/O (PMIO)

In port-mapped I/O 中,设备通过与主内存分离的独立地址空间进行访问。x86 架构中的特殊 CPU 指令(IN 和 OUT)分别用于从这些 I/O 端口读取和写入数据。它在早期的微处理器中很有用,因为它们具有有限的地址空间,并且它保留了主内存地址范围用于实际内存。

Memory-mapped I/O 和 Port-mapped I/O 的区别

以下是 Memory-mapped I/O (MMIO) 和 Port-mapped I/O (PMIO) 之间的区别 −

Memory-mapped I/O Port-mapped I/O
它共享内存地址空间。 它具有独立的 I/O 地址空间。
它具有标准的 load/store 指令。 它具有特殊的 I/O 指令 (IN, OUT)。
它用于现代系统、ARM、RISC-V。 它用于 x86 系统、遗留设备。

Programmed I/O 的优点

Programmed I/O 的优点如下 −

  • 它易于理解和实现。
  • 程序流程是线性的且确定的。这使得调试更容易。
  • 不需要像 DMA 控制器或高级中断系统这样的硬件。
  • 当传输数据量较少时,它很有用。

Programmed I/O 的缺点

以下是 Programmed I/O 的缺点:

  • In Programmed I/O 中,由于轮询,CPU 在整个 I/O 操作过程中保持忙碌。因此,对于大数据传输它是低效的,正如动画中所见。
  • 高延迟。
  • 由于 CPU 忙于轮询,并发性有限。
  • 资源利用低效。
  • 吞吐量较低。

结论

Programmed I/O 是计算机系统中 I/O 操作的最简单和最基本的方法。它简单易用,但由于轮询导致 CPU 浪费,因为 CPU 持续忙于检查设备状态。本章详细解释了 programmed I/O、实际示例、其工作原理、命令、寻址方法,以及 programmed I/O 的优点和缺点。