1. I/O设备
计算机中参与I/O的外设可分为三类:
- 人可读 :适用于计算机用户间的交互(打印机、终端)
- 机器可读 :适用于与电子设备的通信(磁盘驱动器、USB密钥、传感器、执行器)
- 通信 :适用于远程设备通信(数字线路驱动器、调制解调器)
各类别设备间有很大的差别,包括:
-
数据传输速率 :不同设备数据传输速率可能会相差几个数量级
-
应用 :设备用途对操作系统及其支撑设施中的软件、策略都有影响
(磁盘:① 存储文件:文件管理应用;② 虚存页面备份:虚存相关应用)
-
控制的复杂性 :打印机仅需要一个相对简单的控制接口,而磁盘的控制接口要复杂得多。
-
传送单位 :数据可按字节流/字符流的形式传送(终端I/O),也可按更大的块传(磁盘I/O)
-
数据表示 :不同设备使用不同的编码方式,这些差别包括字符编码、奇偶校验约定
-
错误条件 :随着设备不同,错误的性质、报告错误的方式、错误造成的后果、有效的响应范围都各不相同
2. I/O功能功能组织
执行I/O的三种技术:
-
程序控制I/O :处理器代表一个进程给I/O模块发送一个I/O命令;该进程进入忙等待,直至操作完成才能继续执行
-
中断驱动I/O :处理器代表一个进程给I/O模块发送一个I/O命令;
有两种可能性:
- 若I/O指令 非阻塞 :处理器继续执行该进程的后续指令
- 若I/O指令 阻塞 :处理器一条来自操作系统的指令,由其将该进程置为阻塞态 并调度其他进程
-
直接存储器访问(DMA) :一个DMA模块控制内存、I/O模块之间的数据交换。为传送一块数据,处理器给DMA模块发送请求,只有在整个数据块传送结束后,它才被中断。
- 设备与主存间交换数据:准备一个数据,向CPU发DMA请求,取得总线控制权。CPU只需要配置好DMA的目标地址,源数据地址,数据长度,配置启动寄存器DMA就可以自动工作了。进行数据传送时,修改字数计数器内且检查其值是否为0,不为0则继续传送,若已为0 则向CPU发中断请求。
- DMA与CPU并行工作
无中断 | 使用中断 | |
---|---|---|
通过处理器实现I/O和内存间的传送 | 程序控制I/O | 中断驱动I/O |
I/O与内存直接传送 | 直接存储器访问(DMA) |
2.1 I/O功能的发展
I/O 功能发展 6个阶段:
- 处理器 直接访问 外围设备。
- 增加 控制器 / I/O模块,采用非中断程序控制I/O。
- 应用 控制器 / I/O模块,采用中断程序控制I/O。
- I/O模块通过 DMA 直接控制 存储器。仅在传送开始、结束时使用到中央处理器。
- DMA + I/O 通道(I/O channel) : I/O模块单独配备处理器(包含为 I/O 服务的指令集)。中央处理器仅需指定I/O,无需干涉操作。执行完成后,中央处理器被中断。
- DMA + I/O 处理器(I/O processor) :I/O模块单独配备处理器 + 局部存储器,相当于迷你计算机。这样可将中央处理器参与部分降到最低。
2.2 直接存储器访问(Direct Memory Access, DMA)
DMA单元能够模拟处理器,并可获得系统总线控制权。
这样能利用系统总线、存储器进行双向数据传送。
DMA 工作流程:
- 处理器向DMA模块发送信息想要读/写一块数据
- 通过 读写控制线 在 处理器、DMA 间 传输 请求 读操作/写操作 信号
- 通过 数据线 传输 相关 I/O设备地址
- 通过 数据线 传输 从处理器中 读/写 的 起始地址,并保存在 DMA模块的 地址寄存器中
- 通过 数据线 传输 读/写的字数,并保存在 DMA模块的 数据计数寄存器 中
此后,处理器已提交委托,继续执行其他操作,DMA则执行以下步骤:
- 直接 从/向 存储器 整块 传送数据,此时数据无需通过处理器
- 传输完成,DMA模块向处理器发送中断信号
此外,通过集成 DMA 和 I/O 功能,可大大降低所需总线周期数量:
3. 操作系统设计
3.1 设计目标
设计I/O机制,两个重要目标:
-
效率(efficiency)
-
通用性(generality)
3.2 I/O 功能逻辑结构
下面给出三个最重要的逻辑结构的基本原则:
解释说明:
-
逻辑 I/O
-
抽象:逻辑资源
-
处理方式:(进程)打开、关闭、读、写
-
-
设备 I/O
- 抽象:操作、数据
- 处理方式:I/O指令序列、通道命令、控制器指令 + 缓冲(提高利用率)
-
调度 & 控制
- 用途:I/O 操作 排队、调度,并处理中断、收集+报告状态
目录管理(文件组织)、文件系统(用户操作 + 权限)、物理组织(物理存储) 属于文件系统部分。
4. I/O缓冲
未采用缓冲可能会出现的问题:
- 程序挂起,等待I/O,传送期间,被传送的内存块将被锁死
- 单进程死锁:
- 进程发出I/O指令、被挂起后,换出内存,进程阻塞
- I/O事件发生,I/O操作阻塞,等待进程换入内存
两类I/O设备:
- 面向块的I/O设备(block - oriented) :拥有大小固定的块结构(eg. 磁盘、存储卡 等)
- 面向流的I/O设备(stream - oriented) :以字节流的方式 I/O 数据,没有块结构(eg. 终端、打印机、鼠标 等)
4.1 单缓冲
单缓冲:当用户进程发出I/O请求时,操作系统为该操作分配一个位于内存中的系统部分的缓冲区。
预读 :
- 面向块 I/O设备:输入传送的数据被放到系统缓冲区,当传送完成时,进程把该块移到用户空间,并立即请求另一块
- 面向流 I/O设备:
- 一次传送一行:行缓冲(哑终端、行式打印机)
- 一次传送一字节:生产者/消费者模型
相比于无系统缓冲的情况,这种方法通常会提高系统速度,用户进程可在下一数据块读取的同时,处理已读入的数据块(面向块 I/O设备)
假设T是输入一个数据块所需时间,C是两次输入请求间所需的计算时间:
无缓冲区 :
执
行
时
间
=
T
+
C
执行时间 = T+C
执行时间=T+C
假设M是将数据从系统缓冲区复制到用户内存所需时间:
有缓冲区:
执
行
时
间
=
m
a
x
[
C
,
T
]
+
M
执行时间 = max[C,T] + M
执行时间=max[C,T]+M
4.2 双缓冲
双缓冲(double buffering)/ 缓冲交换(buffer swapping):在一个进程向一个缓冲区传送(读取)数据时,操作系统正在操作(填充 / 清空)另一个缓冲区。
双缓冲 :
- 面向块 I/O设备:双缓冲确保进程无需等待I/O,效率提升、复杂度增加
- 面向流 I/O设备:生产者/消费者模型
4.3 循环缓冲
循环缓冲:面对大量I/O操作时,扩充双缓冲弥补需求不足,这组缓冲区被视为循环缓冲区,缓冲区为组内一个缓冲单元。
※ 缓冲的作用
- 平滑I/O需求的峰值
- 存在多种I/O活动、多种进程活动时,用以提高操作系统效率、单个进程性能
缓冲也有被填满的情况,进程平均需求 > I/O设备服务能力时,缓冲区再多无法保证 I/O设备、进程 并驾齐驱。