1. I/O管理

image.png

1.1 I/O设备

人可读
- 打印机
- 终端:显示器,键盘,鼠标等
机器可读 磁盘,usb密钥,传感器
通信 调制解调器

1.2 I/O功能组织

程序控制I/O 处理器代表进程给IO模块发送IO指令,进程进入忙等待直到IO操作完成
中断驱动I/O 处理器代表进程给IO模块发送IO指令:分为两种情况:
- 进程非阻塞:处理器执行后续指令
- 阻塞进程:处理器被中断并执行操作系统的指令,将当前的进程设为阻塞态,调度其余进程
DMA 专门的DMA模块控制内存和IO模块间的数据交换.为传输数据,处理器给DMA模块发送请求后执行后续指令,只有整个数据库传输结束后,处理器才被中断

小结

无中断 有中断
处理器实现IO和内存间传输 程序控制IO 中断驱动IO
IO和内存直接传输 DMA

1.3 I/O发展

image.png 总结:
1. 处理器直接控制外设
2. IO模块控制外设,处理器非中断式处理IO
3. 处理器可中断处理IO
4. DMA模块
5. IO配置专门处理器
6. IO的存储器独立
总结: IO去处理器化

1.4 I/O缓冲

IO设备 面向块 信息保存在固定大小的块中,每次传输一块 0/1
面向流 设备以字节流输入/输出数据,没有快结构
单缓冲 系统为操作分配一个内存中系统部分的缓冲区
优点
- 用户进程可在下一块读取时处理当前块
- 缓冲区在系统内存中非用户进程内存中,故系统可换出它
缺点
- 系统必须记录给用户进程分配缓冲区的情况
- 交换逻辑有漏洞:当IO和换出磁盘是一块时,若执行IO,再换出可能出问题
面向流
- 一次传送一字节—系统和用户的交互以p/c模型进行
- 一次传送一行—适于哑终端
面向块 无明显提升
双缓冲 面向流
- 一次传送一字节—用户进程无需再为IO挂起,提高性能
- 一次传送一行—对比两倍长单循环无明显提升
面向块 提高复杂性,提升性能
循环缓冲 支持大量IO
缓冲作用 当进程需求远大于IO模块处理请求时,即使再多的缓冲也会被填满;
但在多道环境中,当有多种IO和进程,缓冲能够提高系统效率,提升单个进程性能

2. 磁盘调度

2.1 磁盘结构

磁道(track):存储磁头在某一盘片(platter)某个位置上个访问的所有数据
扇区(sector):每个扇区数据量相同,外长内短,故外层数据密度小;sector是一次I/O的最小数据单位
簇(cluster):多个连续的sector组成簇,簇是文件分配的最小单位
**image.png

2.2 性能参数


image.png
一个磁盘的正常访问顺序为

  1. 寻道:IO磁头定位到包含数据的磁道==>寻道时间
  2. 旋转:磁头等待含有目标数据的扇区转到下方==>旋转延迟
  3. 实现读写:IO==>存取时间 | 寻道时间 | 磁头定位到某磁道image.png | | :—-: | —- | | 旋转延迟 | 抵达磁道后,适当扇区旋转到磁头下image.png | | 传输时间 | 数据传输时间image.png | | 存取时间 | 寻道时间+旋转延迟 | | 总平均存取时间 | 寻道时间+旋转延迟+传输时间
    image.png
    T:传输时间,b:字节数, N:一个磁道字节数, r:旋转速度(r/s) |

2.3 顺序组织&随机组织

  • 顺序读取:读取连续存放在一起的数据,只有在第一次需要寻道
  • 随机读取:读取非连续扇区中的数据,每个扇区都需重新寻道

例题:
一个典型磁盘,平均寻道时间4ms,转速7500rpm,每个磁道500个扇区,每个扇区512字节,假设读取一个包含2500个扇区,大小1.28MB的文件,计算总时间:

顺序组织:文件连续存放在相邻磁道与扇区
顺序组织下,只有第一次需要寻道:

第一个磁道中:
- 寻道时间:4ms
- 旋转延迟=1/21r/7500rpm=30000ms/7500=4ms
- 读500扇区(全读):1/7500rpm=8ms
合计:16ms | 其余每个磁道:
- 旋转延迟:4ms
- 读取时间:8ms
合计4
12=48ms

因此读取完5个磁道共需:64ms | | 随机组织:文件随机分布在不同磁道的扇区 | | | 随机组织下,每个扇区都需要重新寻道:
- 寻道时间:4ms
- 旋转延迟:4ms
- 读取一个扇区:8ms/500=0.016ms
因此读取完2500个扇区共需:25008.016=20040ms | | | 结论**:**完全随机的存取时性能非常差* | |

2.4 调度策略

2.2的内容说明IO性能主要被寻道时间拖累,因此需要在访问磁道时采取策略
当一个磁盘200磁道,磁盘请求队列中的随机请求被磁盘调度程序依次接收:55-58-39-18-90-160-150-38-184(起始磁道100)
FIFO
按顺序处理IO队列中项目
访问记录

image.png image.png

Pri**ority
通常短作业优先级高,长作业优先级低
LIFO
先处理最晚入队的请求
利用局部性原理,先处理最新的请求,可以减少磁臂移动
SSTF(最短服务时间优先)**
优先处理移动到指定磁道耗时最少的请求,同样利用局部性原理

image.png image.png

SCAN
磁臂仅沿一个方向移动,满足途中请求,直到该方向最后一个磁道或没有此方向请求后反向扫描处理请求

  • 不如SSTF和LIFO全面的利用局部性原理,它忽视了刚刚扫描的区域 | image.png | image.png | | —- | —- |

C**-**SCAN
磁臂仅沿一个方向移动,满足途中请求,直到该方向最后一个磁道然后直接返回到起点途中不处理请求,接着重新扫描,即对所有请求的处理只在一个方向

image.png image.png

N**SCAN,FSCAN**
SSTF,SCAN,C-SCAN在进程对某个磁道有较高访问速度时,可能很长时间都不移动(局部性原理),为了避免”黏性”,将请求队列分段,每次只完整处理一段

  • N步SCAN把请求队列分为N个子队列,当N较大,性能接近SCAN,当N等于1,退化为FIFO
  • FSCAN使用两队列,一趟扫描中的新请求放入另一个队列,方便下轮优先处理

本章动画: http://williamstallings.com/OS-Animation/Animations.html