【操作系统】Operation System-第14章-I/O子系统

操作系统—I/O子系统

image-20220606112444382

I/O特点

设备接口类型

三种常见设备接口类型

  • 字符设备

    ➢ 如:键盘 / 鼠标,串口等

  • 块设备

    ➢ 如:磁盘驱动器、磁带驱动器、光驱等

  • 网络设备

    ➢ 如:以太网、无线、蓝牙等

设备访问特征

  • 字符设备

    ➢ 访问特征

    ​ √ 以字节为单位顺序访问

    ➢ I/O命令

    ​ √ get()put()

    ​ √ 通常使用文件访问接口和语义

  • 块设备

    ➢ 访问特征

    ​ √ 均匀的数据块访问

    ➢ I/O命令

    ​ √ 原始I/O或文件系统接口

    ​ √ 内存映射文件访问

  • 网络设备

    ➢ 访问特征

    ​ √ 格式化报文交换

    ➢ I/O命令

    ​ √ s e n d / r e c e i v e send/receive send/receive 网络报文

    ​ √ 通过网络接口支持多种网络协议

同步与异步I/O

  • 阻塞I/O:“Wait”

    ➢ 读数据(read)时,进程将进入等待状态,直到完成数据读出

    ➢ 写数据(write)时,进程将进入等待状态,直到设备完成数据写入处理

  • 非阻塞I/O:“Don’t Wait”

    ➢ 立即从read或write系统调用返回,返回值为成功传输字节数

    ➢ read或write的传输字节数可能为零

image-20220606115217985

  • 异步I/O:“Tell Me Later”

    ➢ 读数据时,使用指针标记好用户缓冲区,立即返回;稍后内核将填充缓冲区并通知用户

    ➢ 写数据时,使用指针标记好用户缓冲区,立即返回;稍后内核将处理数据并通知用户

image-20220606115256139

I/O结构

一个实际例子

image-20220606120800239

CPU与设备的连接

  • 设备控制器

    ➢ CPU和I/O设备间的接口

    ➢ 向CPU提供特殊指令和寄存器

  • I/O地址

    ➢ CPU用来控制I/O硬件

    ➢ 内存地址或端口号

    ​ √ I/O指令

    ​ √ 内存映射I/O

  • CPU与设备的通信方式

    ➢ 轮询、设备中断和DMA

image-20220606121055989

I/O指令和内存映射I/O

  • I/O指令

    ➢ 通过I/O端口号访问设备寄存器

    ➢ 特殊的CPU指令

    ​ √ out 0x21,AL

  • 内存映射I/O

    ➢ 设备的寄存器/存储被映射到内存物理地址空间中

    ➢ 通过内存 l o a d / s t o r e load/store load/store 指令完成I/O操作

    ➢ MMU设置映射,硬件跳线或程序在启动时设置地址

内核I/O结构

image-20220606122736905

I/O请求生存周期

image-20220606122827251

I/O数据传输

CPU与设备控制器的数据传输

  • 程序控制I/O(PIO,Programmed I/O)

    ➢ 通过CPU的 i n / o u t in/out in/out 或者 l o a d / s t o r e load/store load/store 传输所有数据

    ➢ 特点

    ​ √ 硬件简单,编程容易

    ​ √ 消耗的CPU时间和数据量成正比

    ➢ 适用于简单的、小型的设备I/O

  • 直接内存访问(DMA)

    ➢ 设备控制器可直接访问系统总线

    ➢ 控制器直接与内存互相传输数据

    ➢ 特点

    ​ √ 设备传输数据不影响CPU

    ​ √ 需要CPU参与设置

    ➢ 适用于高吞吐量I/O

通过直接I/O寻址读取磁盘数据的步骤

image-20220606123609020

I/O设备通知操作系统的机制

  • 操作系统需要了解设备状态

    ➢ I/O操作完成时间

    ➢ I/O操作遇到错误

  • 两种方式

    ➢ CPU主动轮询

    ➢ 设备中断

轮询

  • I/O 设备在特定的状态寄存器中放置状态和错误信息

  • 操作系统定期检测状态寄存器

  • 特点

    ➢ 简单

    ➢ I/O操作频繁或不可预测时,开销大和延时长

设备中断

  • 设备中断处理流程

    ➢ CPU在I/O之前设置任务参数

    ➢ CPU发出I/O请求后,继续执行其他任务

    ➢ I/O设备处理I/O请求

    ➢ I/O设备处理完成时,触发CPU中断请求

    ➢ CPU接收中断,分发到相应中断处理例程

  • 特点

    ➢ 处理不可预测事件效果好

    ➢ 开销相对较高

  • 一些设备可能结合了轮询和设备中断

    ➢ 如:高带宽网络设备

    ​ √ 第一个传入数据包到达前采用中断

    ​ √ 轮询后面的数据包直到硬件缓存为空

设备中断I/O处理流程

image-20220606124354807

磁盘调度

磁盘的旋转、前后移动都是机械运动操作,速度对于内存中的电子单元 慢了几个数量级,所以优化机械访问的开销是很重要提升性能的因素。

  • 读取或写入时,磁头必须被定位在期望的磁道,并从所期望的扇区开始

  • 寻道时间

    ➢ 定位到期望的磁道所花费的时间

  • 旋转延迟

    ➢ 从扇区的开始处到到达目的处花费的时间

image-20220605184743452

把磁盘的I/O传输时间分类,得到访问时间的计算公式:

image-20220605184904843

磁盘调度算法

  • 通过优化磁盘访问请求顺序来提高磁盘访问性能

    ➢ 寻道时间是性能上区别的原因

    ➢ 对单个磁盘,会有一个I/O请求数目

    ➢ 如果请求是随机的,那么会表现很差

先来先服务算法(FITO)

  • 按顺序处理请求
  • 公平对待所有进程
  • 在有很多进程的情况下,接近随机调度的性能

image-20220605201810716

这种方法随机性很大,磁盘指针来回的跳,总磁头移动距离很长,开销很大:

image-20220605201854461

FIFO算法示例

image-20220605203942156

FIFO简单但不高效。

最短服务优先算法(SSTF)

最短寻找时间算法

  • 选择从磁臂当前位置需要移动最少的I/O请求

  • 总是选择最短寻道时间

image-20220605202246205

SSTF算法示例

image-20220605204037715

虽然移动磁头开销会比较小,但会产生饥饿。

扫描算法(SCAN)

电梯算法(elevator algorithm)

  • 磁臂在一个方向上移动,满足所有为完成的请求,直到磁臂到达该方向上最后的磁道

  • 调换方向

image-20220605202726059

SCAN算法示例

image-20220605204135247

从一端到另一端,再从另一端回到起始端,会比较公平的让所有的请求都能得到访问。

循环扫描算法(C-SCAN)

单向扫描算法

  • 限制了仅在一个方向上扫描

  • 当最后一个磁道也被访问过了后,磁臂返回到磁盘的另外一端再次进行扫描

image-20220605203013751

这种单方向的方式对于某些访问请求更加公平,而且效率会更高。

C-LOOK算法

  • C-SCAN的改进版本

  • 磁臂先到达该方向上最后一个请求处,然后立即反转

image-20220605205903052

对比C-SCAN会更加公平。

N步扫描算法(N-step-SCAN)

  • 磁头粘着(Arm Stickiness)现象

    ➢ SSTF、SCAN及CSCAN等算法中,都可能出现磁头停留在某处不动的情况

    ➢ 如:进程反复请求对某一磁道的I/O操作

  • N N N 步扫描算法

    ➢ 将磁盘请求队列分成长度为 N N N 的子队列

    ➢ 按FIFO算法依次处理所有子队列

    ➢ 扫描算法处理每个队列

  • 当正在处理某子队列时,如果又出现新的磁盘I/O请求,便将新请求进程放入其他队列,这样就可避免出现粘着现象。

双队列扫描算法(FSCAN)

为了更加实用,我们把上方的划分的队列数 N N N 规定为 2 2 2

  • FSCAN算法实质上是N步SCAN算法的简化

    ➢ FSCAN只将磁盘请求队列分成两个子队列

  • FSCAN算法

    ➢ 把磁盘I/O请求分成两个队列,交替使用扫描算法处理一个队列

    ➢ 一个是由当前所有请求磁盘I/O的进程形成的队列,由磁盘调度按SCAN算法进行处理

    ➢ 在处理某队列期间,将新出现的所有请求磁盘I/O的进程,放入另一个等待处理的请求队列

    ➢ 这样,所有的新请求都将被推迟到下一次扫描时处理

磁盘缓存

  • 缓存

    ➢ 数据传输双方访问速度差异较大时,引入的速度匹配中间层

  • 磁盘缓存是磁盘扇区在内存中的缓存区

    ➢ 磁盘缓存的调度算法很类似虚拟存储调度算法

    ➢ 磁盘的访问频率远低于虚拟存储中的内存访问频率

    ➢ 通常磁盘缓存调度算法会比虚拟存储复杂

单缓存与双缓存

  • 单缓存(Single Buffer Cache)

image-20220606124940059

  • 双缓存(Double Buffer Cache)

image-20220606125008828

访问频率置换算法(Frequency-based Replacement)

  • 问题

    ➢ 在一段密集磁盘访问后,LFU算法的引用计数变化无法反映当前的引用情况

  • 算法思路

    ➢ 考虑磁盘访问的密集特征,对密集引用不计数

    ➢ 在短周期中使用LRU算法,而在长周期中使用LFU算法

实现

  • 把LRU算法中的特殊栈分成三部分,并在每个缓存块增加一个引用计数

    ➢ 新区域(New Section)

    ➢ 中间区域(Middle Section)

    ➢ 旧区域(Old Section)

image-20220606125350309

  • 栈中缓存块被访问时移到栈顶;如果该块在新区域,引用计数不变;否则,引用计数加1

    ➢ 在新区域中引用计数不变的目的是避免密集访问对引用计数不利影响

    ➢ 在中间区域和旧区域中引用计数加1是为了使用LFU算法

image-20220606125422170

  • 未缓存数据块读入后放在栈顶,引用计数为1

  • 在旧区域中引用计数最小的缓存块被置换

    ➢ 中间区域的定义是为了避免新读入的缓存块在第一次出新区域时马上被置换,有一个过渡期

image-20220606125621375

整理自 【清华大学】 操作系统

猜你喜欢

转载自blog.csdn.net/weixin_53407527/article/details/125184729
今日推荐