I/O特点
设备接口类型
字符设备
以字节为单位顺序访问,每次只能一个字节输入,访问通常由get(),put()执行,使用文件访问接口和语义。
块设备
以均匀的数据块闻单位访问,访问通常使用原始IO或文件系统接口,内存映射文件访问。比如存储设备,磁盘磁带等
网络设备
格式化报文交换,IO命令是send/receive,通过网络接口支持多种网络协议。比如以太网、无线、蓝牙等。
同步和异步I/O
阻塞IO:请求->驱动->硬件(等待)->中断请求->驱动->用户
非阻塞IO:请求->驱动->硬件->驱动->用户 (不管结果)
异步IO:
请求->驱动->硬件->驱动->用户 (通知硬件收发)
硬件->中断请求->驱动->用户 (硬件收发返回结果)
I/O结构
CPU与IO的连接
北桥(高速)与显卡,内存相连,南桥(低速)与PCI总线等IO设备相连。
设备控制器
设备上有IO控制器,提供了CPU和设备的接口
有总线接口、数据与状态寄存器
进行内存映射(设备成为内存的一部分)
CPU和设备的通信方式
轮询:不用中断控制器,CPU直接访问IO端口或内存映射
设备中断:采用中断方式
DMA:外部设备把数据直接放到内存单元
IO的指令与内存映射IO
IO指令是通过IO端口号访问设备寄存器。在CPU执行out、in,对应了读写指令和设备控制。
内存映射IO是把设备的寄存器或存储映射到内存物理地址空间,通过内存load和store指令完成IO操作,由MMU设置映射。
内核IO结构
设备->设备控制器->驱动->IO子系统->内核
IO请求生存周期
I/O数据传输
数据传输方式
程序控制IO
简单但是消耗的CPU时间,适用于简单的小型IO。
DMA
设备控制器直接访问系统总线,CPU参与设置开始结束过程,适用于高吞吐量的IO。
设备通知CPU机制
中断、轮询
中断IO的处理流程
CPU每执行一条指令都会检查中断请求
请求中断→响应中断→关闭中断→保留断点→中断源识别→保护现场→中断服务子程序→恢复现场→中断返回。
磁盘调度
磁盘的工作机制
读取或写入时,磁头被定位到期望的磁道,并从所期望的柱面和扇区开始
寻道时间,定位到期望的磁道。(时间最长,是优化的主要目标)
旋转延迟,磁头到达指定扇区
磁盘IO传输时间:等待设备可用、寻道时间、旋转延时、数据传输的时间。
磁盘调度算法
思路:通过优化磁盘访问的顺序,减少寻到时间
先进先出:公平对待所有进程,接近随机访问的性能。
最短服务时间优先:选择最短寻道时间。
扫描算法:单方向扫,到尾,掉头,接着扫。
循环扫描算法:扫描的改进,不掉头,到尾回起点。
C-Look:循环扫描的改进,到达最后一个请求,就返回
N-step-SCAN:对付磁头黏着(某处有大量的请求,其他的等很久),多队列,FIFO处理队列间,扫描处理队列内
双队列扫描:N-step-SCAN的简化,即N=2
磁盘缓存
单缓存与双缓存
- 单:进、出一个区;
- 双:进、出不同区
访问频率置换算法(LRU与LFU的结合)
把栈分为新、中、久;
新:计数不变(避免密集访问后尾大不掉)
旧:只在旧区中,找计数最小的,置换(避免误杀新人)
中:缓存区