banner
NEWS LETTER

第13章:IO 系统

Scroll down

一、 I/O 硬件基础 (I/O Hardware) —— 连接物理世界的桥梁

随着 I/O 设备种类的爆发式增长,操作系统的设计趋势是标准化(提供统一接口) 。底层的物理连接主要依赖以下三个基本硬件元素:

  • 端口 (Port):设备与计算机的连接点 。

  • 总线 (Bus):数据传输的高速公路(如 PCI、SCSI 总线) 。

  • 控制器 (Controller / Host adapter):具体管理设备的微型大脑,它知道如何指挥设备工作 。

🌟 核心考点:CPU 如何与 I/O 设备交流?

有三种逐渐进化的沟通方式:

  1. 轮询 (Polling) —— “好了没?好了没?”

    • 原理:CPU 不断循环读取设备的状态寄存器,检查设备是处于忙碌(busy)还是就绪(command-ready)状态 。

    • 通俗比喻:就像你烧水时,每隔十秒钟就揭开锅盖看水开了没有(Busy-wait cycle) 。极其浪费 CPU 资源。

  2. 中断 (Interrupts) —— “有事叫我”

    • 原理:CPU 下达任务后去干别的事,设备处理完后,通过硬件的“中断请求线 (Interrupt-request line)”发信号打断 CPU 。

    • 机制:根据中断向量表 (Interrupt vector) 找到对应的中断处理程序 。中断按优先级划分,有些关键中断是不可屏蔽的 (nonmaskable) 。

  3. DMA (直接内存访问, Direct Memory Access) —— “找个助理代劳”

    • 原理:用于避免大批量数据传输时让 CPU 陷入繁重的读写操作。它需要一个专属的 DMA 控制器 。 * 工作流:DMA 控制器直接在 I/O 设备和主存之间传输数据,完全绕过 CPU (Bypasses CPU) 。传输全部完成后,才给 CPU 发一个中断 。

    • 通俗比喻:老板(CPU)要搬 100 箱苹果到仓库(内存)。老板不自己动手,而是雇了个搬运工(DMA 控制器)。搬运工搬完 100 箱后,才来向老板汇报一句“干完了”。


二、 应用层 I/O 接口 (Application I/O Interface) —— 对上层的伪装

操作系统为了对用户隐藏底层成百上千种硬件的怪癖,使用了设备驱动程序 (Device-driver layer)。它为内核提供了一个统一的标准接口 。

I/O 设备千差万别,通常被抽象为以下几类:

  • 块设备 (Block devices):如磁盘。以块为单位传输,支持读取、写入、寻道 (seek),还可以用内存映射文件访问 。

  • 字符设备 (Character devices):如键盘、鼠标、串口。以字符流为单位,支持 get(获取)、put(放置)命令 。

  • 网络设备 (Network Devices):通过套接字 (socket) 接口进行通信,分离了网络协议和网络操作 。

⏳ 阻塞、非阻塞与异步 (Blocking vs Nonblocking vs Asynchronous)

  • 阻塞 (Blocking):进程被挂起,死等 I/O 完成才继续运行(好用但死板) 。

  • 非阻塞 (Nonblocking):I/O 调用立刻返回当前可用的数据(比如返回已经读到的字节数,不干等) 。

  • 异步 (Asynchronous):进程提交请求后立刻去干别的事,I/O 子系统在后台默默执行,彻底完成后才发信号通知进程(效率最高但也最难写) 。


三、 内核 I/O 子系统 (Kernel I/O Subsystem) —— 幕后大管家

操作系统内核在 I/O 方面要干哪些“脏活累活”?

  1. 调度 (Scheduling):通过为每个设备维护一个请求队列,决定先执行哪个 I/O 请求(比如上一章的磁盘调度算法),尽量保证公平 。

  2. 缓冲 (Buffering):在内存中开辟一块区域暂时存放数据 。

    • 作用:解决设备之间速度不匹配(比如高速网卡与慢速硬盘)或传输大小不匹配的问题 。
  3. 高速缓存 (Caching):在快速内存中保留一份经常访问的数据副本(Key to performance) 。

  4. 假脱机 (Spooling):专用于那些只能同时服务一个请求的独占设备(如打印机)。系统拦截所有的打印请求,先存入磁盘队列中,再让打印机挨个慢慢打印 。

  5. 设备预留 (Device reservation):提供对设备的独占访问权,但要小心导致死锁 (deadlock) 。

  6. I/O 保护 (Protection):防止用户胡乱操作导致系统崩溃。所有的 I/O 指令都被定义为特权指令 (privileged),用户必须通过系统调用 (System calls) 才能执行 I/O 。


四、 STREAMS 机制 (流)

这是 UNIX System V 及之后版本引入的一个特性。

  • 定义:在用户级进程和设备之间建立的一个全双工通信通道 (full-duplex communication channel)

  • 结构:由流头 (STREAM head)、一个或多个流模块 (modules) 以及驱动程序端 (driver end) 组成 。

  • 每个模块包含一个读队列和一个写队列,模块之间通过消息传递 (Message passing) 进行通信 。


五、 性能优化 (Performance)

I/O 往往是拖慢整个计算机性能的“罪魁祸首”。

  • 为什么慢? I/O 会消耗大量 CPU 算力来执行驱动代码,频繁的中断会导致严重的上下文切换 (Context switches),并且伴随着大量的数据拷贝 (Data copying) 。

  • 如何提升性能?

    1. 减少上下文切换的次数。

    2. 减少数据在内存中的来回拷贝。

    3. 通过使用大型传输、智能控制器或轮询来减少中断次数

    4. 广泛使用 DMA 控制器

如果您喜欢我的文章,可以考虑打赏以支持我继续创作.

其他文章
目录导航 置顶
  1. 1. 一、 I/O 硬件基础 (I/O Hardware) —— 连接物理世界的桥梁
  2. 2. 二、 应用层 I/O 接口 (Application I/O Interface) —— 对上层的伪装
  3. 3. 三、 内核 I/O 子系统 (Kernel I/O Subsystem) —— 幕后大管家
  4. 4. 四、 STREAMS 机制 (流)
  5. 5. 五、 性能优化 (Performance)
请输入关键词进行搜索