1. I/O管理
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发展
总结: 1. 处理器直接控制外设 2. IO模块控制外设,处理器非中断式处理IO 3. 处理器可中断处理IO 4. DMA模块 5. IO配置专门处理器 6. IO的存储器独立 总结: IO去处理器化 |
|
---|---|
1.4 I/O缓冲
IO设备 | 面向块 | 信息保存在固定大小的块中,每次传输一块 | |
---|---|---|---|
面向流 | 设备以字节流输入/输出数据,没有快结构 | ||
单缓冲 | 系统为操作分配一个内存中系统部分的缓冲区 | ||
优点 | - 用户进程可在下一块读取时处理当前块 - 缓冲区在系统内存中非用户进程内存中,故系统可换出它 |
||
缺点 | - 系统必须记录给用户进程分配缓冲区的情况 - 交换逻辑有漏洞:当IO和换出磁盘是一块时,若执行IO,再换出可能出问题 |
||
面向流 | - 一次传送一字节—系统和用户的交互以p/c模型进行 - 一次传送一行—适于哑终端 |
||
面向块 | 无明显提升 | ||
双缓冲 | 面向流 | - 一次传送一字节—用户进程无需再为IO挂起,提高性能 - 一次传送一行—对比两倍长单循环无明显提升 |
|
面向块 | 提高复杂性,提升性能 | ||
循环缓冲 | 支持大量IO | ||
缓冲作用 | 当进程需求远大于IO模块处理请求时,即使再多的缓冲也会被填满; 但在多道环境中,当有多种IO和进程,缓冲能够提高系统效率,提升单个进程性能 |
2. 磁盘调度
2.1 磁盘结构
磁道(track):存储磁头在某一盘片(platter)某个位置上个访问的所有数据
扇区(sector):每个扇区数据量相同,外长内短,故外层数据密度小;sector是一次I/O的最小数据单位
簇(cluster):多个连续的sector组成簇,簇是文件分配的最小单位
**
2.2 性能参数
一个磁盘的正常访问顺序为
- 寻道:IO磁头定位到包含数据的磁道==>寻道时间
- 旋转:磁头等待含有目标数据的扇区转到下方==>旋转延迟
- 实现读写:IO==>存取时间
| 寻道时间 | 磁头定位到某磁道 |
| :—-: | —- |
| 旋转延迟 | 抵达磁道后,适当扇区旋转到磁头下 |
| 传输时间 | 数据传输时间 |
| 存取时间 | 寻道时间+旋转延迟 |
| 总平均存取时间 | 寻道时间+旋转延迟+传输时间
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
合计412=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队列中项目
访问记录
Pri**ority
通常短作业优先级高,长作业优先级低
LIFO
先处理最晚入队的请求
利用局部性原理,先处理最新的请求,可以减少磁臂移动
SSTF(最短服务时间优先)**
优先处理移动到指定磁道耗时最少的请求,同样利用局部性原理
SCAN
磁臂仅沿一个方向移动,满足途中请求,直到该方向最后一个磁道或没有此方向请求后反向扫描处理请求
- 不如SSTF和LIFO全面的利用局部性原理,它忽视了刚刚扫描的区域 | | | | —- | —- |
C**-**SCAN
磁臂仅沿一个方向移动,满足途中请求,直到该方向最后一个磁道然后直接返回到起点途中不处理请求,接着重新扫描,即对所有请求的处理只在一个方向
N**SCAN,FSCAN**
SSTF,SCAN,C-SCAN在进程对某个磁道有较高访问速度时,可能很长时间都不移动(局部性原理),为了避免”黏性”,将请求队列分段,每次只完整处理一段
- N步SCAN把请求队列分为N个子队列,当N较大,性能接近SCAN,当N等于1,退化为FIFO
- FSCAN使用两队列,一趟扫描中的新请求放入另一个队列,方便下轮优先处理
本章动画: http://williamstallings.com/OS-Animation/Animations.html