目录
- 5.2 I/O软件原理
- 5.2.1 I/O软件的目标
- 5.2.2 程序控制I/O
- 5.2.3 中断驱动I/O
- 5.2.4 使用DMA的I/O
- 5.3 ⭐I/O软件层次
- 5.3.1 中断处理程序
- 5.3.2 ⭐设备驱动程序(Device Driver)
- 5.3.3 ⭐Device-Independent的OS软件
- 5.3.4 功能
- 5.3.5 总结
- 5.4 Disks
- 5.4.1 盘硬件
- 5.4.2 磁盘格式化
- 5.4.3 ⭐磁盘臂调度算法
5.2 I/O软件原理
5.2.1 I/O软件的目标
统一命名
文件或设备名称是字符串或证书,不依赖具体机器
设备独立性
程序可以访问任何I/O设备,无序提前指定
同步和异步传输
同步传输(即阻塞):程序等待I/O操作完成
异步传输(即中断驱动):程序继续执行,I/O完成后通过中断通知
Buffering
设备产生的数据无法直接存放到目标内存,需要暂存到缓冲区
错误处理
尽可能在接近硬件的层面处理
共享设备和独占设备
共享设备:磁盘能同时让多个用户使用
独占设备:磁带机必须由单个用户独占使用
5.2.2 程序控制I/O
CPU直接控制I/O直到I/O完成
适用于单进程系统(MS-DOS、嵌入式系统(Embedded systems)
不适用于多道程序设计和分时系统
轮询/忙等
CPU不断检查设备状态寄存器来检测设备是否准备就绪
三种状态
Ready
Busy
Error
缺点:CPU浪费(CPU需处于忙等来等待I/O)
5.2.3 中断驱动I/O
CPU在发送第一个字符后,不再轮询等待,而是打印机READY时会发送硬件中断,再让CPU处理
缺点:每次字符输入都会发生中断
5.2.4 使用DMA的I/O
DMA控制器会把内核缓冲区的字符串输给打印机控制器,CPU不参与这个过程
传输完整个缓冲区(字符串),CPU才会被再次中断
5.3 ⭐I/O软件层次
5.3.1 中断处理程序
最好隐藏中断处理程序
把启动一个I/O操作的驱动程序阻塞,直至I/O操作完成并产生一个中断
如何阻塞驱动程序
在一个信号量上执行down
在一个条件变量上执行wait
在一个消息上执行receive
中断处理程序的位置由中断向量确定
中断处理流程
硬件
发出中断
处理器执行完当前指令
处理器发出中断确认信号
处理器将PSW和PC推入控制栈
处理器根据中断加载新PC值
软件
保存剩余进程状态信息
进程中断
恢复进程状态信息
恢复旧的PSW和PC
软件中的具体步骤
保存没被中断硬件保存的所有寄存器
为中断服务过程设置上下文,如TLB、MMU和页表
为中断服务过程设置堆栈
确认中断控制器,重启中断
将寄存器从它们被保存的地方复制到进程表
运行中断服务进程
选择下一次运行哪个进程
为下一次要运行的进程设置MMU上下文
装入新进程的寄存器
开始运行新进程
5.3.2 ⭐设备驱动程序(Device Driver)
用来控制I/O设备的特定代码
Device driver的逻辑定位
用户程序 -> 操作系统的其余部分 -> Device driver -> 总线 -> Device controller -> Device
功能
接收OS抽象的读/写请求
初始化设备
发送硬件命令
请求队列管理
错误处理
分类
块设备驱动程序:磁盘
字符设备驱动程序:键盘和打印机
5.3.3 ⭐Device-Independent的OS软件
功能
Device driver的统一接口
好处
驱动开发者知道驱动程序接口是什么样
操作系统开发者能基于接口编写device-independent的I/O功能
解决给I/O设备命名(以Unix为例)
设备被抽象为特殊文件,需要通过系统调用(如read()等)访问
文件名与每个设备关联,并确定一个包含主设备号和次设备号的i节点
主设备号:定位驱动程序
次设备号:作为参数传递给驱动程序,以指定读/写的单元(区分同一驱动的不同设备)
通常的文件保护规则也适用于I/O设备
缓冲
错误报告
处理层级
Device-controller
如校验错误
Device driver
如无法读取磁盘
Device-independent的OS软件层
编程错误(写入只读设备)
实际的I/O错误(摄像头关机)
分配与释放专用设备
不允许并发访问
提供device-independent块大小
不同磁盘扇区大小可能不同,应由device-independent软件隐藏并向高层提供统一块大小
5.3.4 功能
封装系统调用
格式化I/O处理(如printf())
假脱机管理
5.3.5 总结
流程(双向)
I/O请求
用户进程
Device-independent软件
Device driver
中断处理
硬件
响应
5.4 Disks
5.4.1 盘硬件
柱面(cylinder)->磁道(track)->扇区(sector)
扇区通常512B
磁盘可能有多个环带
因为本来每个磁道扇区数相同,越外圈每个扇区越大,会造成浪费。所以在外面的磁道有更多扇区
5.4.2 磁盘格式化
磁盘使用前要先进行低格式化和高格式化
低格式化
将磁盘分为磁盘控制器可读写的扇区
由供应商完成
磁道格式化方式
分为由
inter-sector-gap间隔的扇区扇区格式:
前导码+数据+校验码
⭐柱面斜进(cylinder skew)
当磁盘读取完一个磁道,磁头需要移动到下一个磁道。在移动过程中,盘面一直在旋转,为保证磁头能从本磁道的末尾恰好移动至下一磁道开头,就需要柱面斜进
目的:改进性能,让磁盘在一次连续的操作中读取多个磁道而不丢失数据
例:How much cylinder skew is needed for a 7200-RPM disk with a track-to-track seek time of 1 msec? The disk has 200 sectors of 512 bytes each on each track.
7200转/分钟=0.12转/毫秒,磁道间寻道的这1毫秒期间,盘面会转过200*0.12=24个扇区。所以答案是24
扇区交错(interleaving)
若磁盘控制器只有一个扇区buffer,当一个扇区数据从硬盘传输至buffer后,需要把buffer数据拷贝至内存。此期间磁头将越过下一个扇区起始位置,因此下一个逻辑扇区不应是相邻的物理扇区,所以山区要交错排列
复制快可用单交错,复制慢可用双交错
5.4.3 ⭐磁盘臂调度算法
决定读写磁盘块时间的因素
寻道时间
磁盘臂移动至适当柱面的时间
旋转延迟
等待适当扇区旋转到磁头下所需时间
实际数据传输时间
⭐FCFS
⭐Shortest Seek First(SSF)
⭐Elevator Algorithm