与外设打交道 的部分。
I/O特征
三种常见设备
- 字符设备
串口,鼠标/键盘等
访问特征:以字节为单位顺序访问 i/o命令:get()、put()等,通常使用文件访问接口和语义
- 块设备
- 存储设备 如磁盘驱动器、磁带驱动器、光驱等
- 访问特征
- 数据块为单位,均匀 数据量大
- I/O命令
- 文件系统接口/原始I/O( 提高性能)
- 内存 映射文件访问
- 网络设备
- 与外界打交道 以太网 无线 蓝牙
- 访问特征
- 交互复杂 格式化报文交换 协议
- I/O命令
- send/receive 网络报文
- 通过网络接口支持多种网络协议 封装
同步/异步 I/O
cpu 与设备 的交互
- 阻塞i/o:wait
- 读数据时,进程将进入等待状态 直到数据读出
- 写数据,进程进入等待状态 直到设备完成数据写入处理 中断只是在返回的时候处理 图
- 非阻塞 i/o:don’t wait
- 立即从read或write系统调用返回,返回值为成功传输字节数。写了后 直接返回
- read或write的传输字节数可能为0
- 异步i/o 结合两者 tell me later
- 读数据时 使用指针标记好用户缓冲区,立即返回;稍后内核将填充缓冲区并通知用户
- 写数据时,使用指针标记好用户缓冲区,立即返回;稍后内核将处理数据并通知用户
I/O 结构
一个例子
- 北桥
- 高速
- 内存
- 显卡
- 南桥
- i/o设备
- 各种设备相连
- 磁盘 网络
cpu 与设备的链接
- 设备控制器
- cpu与I/o设备间的接口
- 向cpu提供特殊指令和寄存器
- i/o地址
- cpu用来控制i/o硬件
- 内存地址或段口号
- i/o指令
- 内存映射i/o
- cpu与设备的三种通信方式
- 轮询、设备中断和DMA
I/O 指令和内存映射I/O
- I/O 指令
- 通过I/O端口号访问设备寄存器
- 特殊的cpu指令
out 0x21
- 内存映射I/O
- 设备的寄存器/存储被映射到内存物理地址空间中
- 通过内存load/store指令完成I/O操作
- MMU设置映射,硬件跳线或程序在启动时设置地址
i/o系统内核结构
图
i/o请求生存周期
I/O 数据传输
性能 关注的问题
cpu 与设备控制器的数据传输
- 程序控制I/O pio - 通过cpu的in/out或load/store传输所有数据
- 特点
- 硬件简单,编程容易
- 消耗的cpu时间和数据量成正比
- 适用于简单的 小型的设备I/O
- 特点
- DMA 直接内存访问
- 设备控制器可直接访问系统总线
- 控制器直接与内存互相传输数据
- 特点
- 设备传输数据不影响cpu
- 需要cpu参与设置 开始 结束
- 适用于高吞吐量i/o
细化到磁盘
设备通知操作系统的机制
操作系统需要了解设备的状态 i/o操作完成时间 I/o操作遇到错误 两种方式 cpu主动轮询 设备中断
轮询
- i/o设备在特定的状态寄存器中放置状态和错误信息
- 操作系统定期检测状态寄存器
- 特点
- 简单
- i/o操作频繁或不可预测时,开销大和延时长
设备中断
- 交互过程
- 特点
- 处理不可预测事件效果好
设备中断I/O处理流程
在执行一条指令后检查中断请求
具体的例子 磁盘;提高性能 访问效率 调度和缓存;
磁盘调度
磁盘工作机制和性能参数。
- 读取或写入时,磁头必须被定位在期望的磁道。并从期望的柱面和扇区的开始
- 寻道时间
- 定位到期望磁道所花费的时间
- 旋转延迟
- 从零扇区开始处到达目的地花费的时间
- 平均延迟 转半圈的时间
磁盘 I/O传输时间
寻道+旋转延时+数据传输,主要优化寻道时间,
磁盘调度算法
- 通过优化磁盘访问请求顺序来提高磁盘访问性能
- 寻道时间是磁盘访问最耗时的部分
- 同时会有多个在同一磁盘上的I/O请求
- 随机处理访问请求性能差
fifo
公平对待所有进程 按顺序处理请求 接近随机访问调度
sstf 最短服务时间优先
- 选择从磁臂当前位置需要移动最少的I/O请求
- 总时选择最短寻道时间
scan
- 磁臂在一个方向移动,访问所有未完成的请求,直到磁臂到达该方向上最后的磁道
- 调换方向
- aka 电梯算法 最底到最顶
cscan
循环扫描
- 仅在一个方向扫描
- 提高公平性
- 当最后一个磁道也被访问过了后,磁臂返回到磁盘的另外一端再次进行
clook
- 只是走到最后一个请求的位置 不是走到头
Nstepscan
n步扫描
- 磁头粘着现象
- sstf scan以及cscan等算法中,可能出现磁头停留在某处不动的情况
- 如:进程反复请求对某一磁道的I/O操作
- n步扫描算法
- 将磁盘请求队列分成长度为N的子队列
- 按FIFO算法依次处理所有子队列
- 每个队列内部使用扫描算法
fscan
上一个的简化
- 双队列扫描算法
- 将磁盘请求队列分成两个子队列
- 交替使用扫描算法处理一个队列。新生成的磁盘I/O请求放入另一队列中,所有新请求都将被推迟到下一次扫描时处理
磁盘缓存
- 缓存
- 数据传输双方访问速度差异较大时,引入的速度匹配中间层
- 磁盘缓存是磁盘扇区在内存中的缓存区
- 磁盘缓存的调度算法很类似虚拟存储调度算法倒过来 (利用磁盘存储内存放不下的数据)
- 磁盘访问频率远低于虚拟存储内存频率
- 磁盘缓存调度算法会比虚拟存储复杂
单缓存和双缓存
缓冲区1 io设备;缓冲区2 cpu读
访问频率置换算法
思路: