I/O子系统

第13章:I/O子系统

标签(空格分隔): 操作系统


  • I/O特点
    • 设备接口类型
    • 同步和异步I/O
  • I/O结构
  • I/O数据传输
  • 磁盘调度
  • 磁盘缓存

13.1 I/O特点

三种常见设备接口类型

  • 字符设备
    • 如:键盘/鼠标,串口等
  • 块设备
    • 如:磁盘驱动器、磁带驱动器、光驱等
  • 网络设备
    • 如:以太网、802.11无线网、蓝牙等

设备访问特征

  • 字符设备
    • 访问特征
      • 以字节为单位顺序访问
    • I/O命令
      • get(), put()等
      • 通常使用文件访问接口和语义
  • 块设备
    • 访问特征
      • 均匀的数据块访问
    • I/O命令
      • 原始 I/O或文件系统接口
      • 内存映射文件访问
  • 网络设备
    • 访问特征
      • 格式化报文交换
    • I/O命令
      • send/receive网络报文
      • 通过网络接口支持多种网络协议

同步与异步 I/O

(1)阻塞 I/O:”Wait“

  • 读数据时,进程将进入等待状态,直到完成数据读出
  • 写数据时,进程将进入等待状态,直到设备完成数据写入处理
用户 I/O 请求处理过程
内核 设备驱动
内核 中断处理
内核 硬件控制数据传送
  • 用户的请求首先通过系统调用到设备驱动,设备驱动会把用户请求转换成实际的硬件控制命令,绕过中断处理,直接控制硬件进行相应的操作。
  • 操作结束之后,产生中断请求,转到设备驱动,最后通过系统调用的返回到用户态,用户得到相应的结果。

(2)非阻塞 I/O :”Don’t Wait“

  • 立即从read或write系统调用返回,返回值为成功传输字节数
  • read或write的传输字节数可能为0

(3)异步 I/O :”Tell Me Later“

  • 读数据时,使用指针标记好用户缓冲区,立即返回;操作系统内核在完成相应的数据处理并把读到的数据放到缓冲区之后,通知用户
  • 写数据时,使用指针标记好用户缓冲区,立即返回;稍后内核将处理数据并通知用户

  • 先通过系统调用将要写的数据告诉设备驱动,然后设备驱动控制硬件设备进行操作,控制完成之后不等结果直接返回,而设备操作之后通过中断,返回出相应的结果。这一阶段,驱动需要等待,而应用程序不需等待

13.2 I/O 结构

CPU与设备的连接

  • 设备控制器
    • CPU和 I/O 设备间的接口
    • 向CPU提供特殊指令和寄存器
总线接口 提供CPU和 I/O 设备间的接口
硬件控制器
寄存器(读数据、写数据、控制、状态) 进行数据的交互和状态和控制的交互
可寻址存储或队列(内存映射) 映射到内存当中,给一段内存区域,对这段内存区域的访问,对应过来就是I/O设备的访问
  • I/O 地址
    • I/O 地址通过总线连到CPU,总线和实际设备之间有总线适配器
    • CPU用来控制 I/O 硬件
    • 内存地址或端口号
      • I/O 指令
      • 内存映射 I/O

设备到CPU的通道

  • 中断控制器

    • 设备产生中断之后,在中断控制器进行汇总然后送给CPU,CPU就能对外部设备的事件作出响应
  • CPU与外部设备的通信方式

    • 轮询:无需中断控制器,CPU直接访问 I/O 端口,或者说访问设备所对应的内存地址空间
    • 设备中断:外部设备有事件要通知CPU,就要通过中断到CPU
    • DMA:外部设备需要把数据直接放到内存当中,可以通过CPU读,然后放到内存。在DMA控制器的控制下,把数据从 I/O 设备直接到内存单元

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

  • I/O 指令

    • 通过 I/O 端口号访问设备寄存器
    • 特殊的CPU指令
  • 内存映射 I/O

    • 设备的寄存器/存储被映射到内存物理地址空间中
    • 通过内存load/store指令完成 I/O 操作
    • MMU设置映射,硬件跳线或程序在启动时设置地址

内核 I/O 结构

软件 内核
I/O子系统 处理各种设备共同的一些内容,例如I/O请求转换成驱动的I/O请求;缓存设备给出的结果
设备驱动
硬件 设备控制器
设备

I/O请求生存周期

Created with Raphaël 2.1.2 I/O请求 判断是否没有I/O请求结果 向驱动发送I/O请求,并等待结果 处理I/O请求,发送控制命令,并等待中断响应 控制设备操作完成时,产生中断 I/O完成,生成中断请求 接收中断,保存结果,并通知设备驱动 确定I/O操作完成状态,通知I/O子系统 与进程交换数据,并返回完成结果或错误信息 I/O操作完成,输入数据可用或输出完成 yes no

13.3 I/O数据传输

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

  • 程序控制I/O(PIO,Programmed I/O)
    • 通过CPU的in/out或者load/store传输所有数据
    • 特点
      • 硬件简单,编程容易
      • 消耗的CPU时间和数据量成正比
    • 适用于简单的、小型的设备I/O
  • 直接内存访问(DMA)
    • 设备控制器可直接访问系统总线
    • 控制器直接与内存互相传输数据
    • 特点
      • 设备传输数据不影响CPU
      • 需要CPU参与设置

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

Created with Raphaël 2.1.2 CPU 高速缓存 系统总线 DMA总线和中断控制器 PCI总线 IDE磁盘控制器 磁盘 内存地址X(缓存) yes no
1. 设备驱动收到内存地址X
2. 设备驱动控制磁盘控制器从磁盘读取数据
3. 磁盘控制器初始化DMA传送
4. 磁盘控制器传送数据到DMA控制器
5. DMA控制器传送C字节数据到内存地址X
6. DMA控制器完成数据传送后,产生中断请求,通知CPU传送完成

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

  • 操作系统需要了解设备状态
  • I/O操作完成时间
  • I/O操作遇到错误
  • 两种方式
    • CPU主动轮询
    • 设备中断

轮询

  • I/O是设备在特定的状态寄存器中设置状态和错误信息
  • 操作系统定期检测状态寄存器
  • 特点
    • 简单
    • I/O操作频繁或不可预测时,开销大和延时长

设备中断

  • 设备中断处理流程
    • CPU在I/O之前设置任务参数
    • CPU发出I/O请求后,继续执行其他任务
    • I/O设备处理I/O请求
    • I/O设备处理完成时,触发CPU中断请求
    • I/O接收中断,分发到响应中断处理例程
  • 特点
    • 处理不可预测事件效果好
    • 开销相对较高
  • 一些设备可能结合了轮询和设备中断
    • 如:高带宽网络设备
    • 第一个传入数据包到达前采用中断
    • 轮询后面的数据包直到硬件缓存为空

13.4 磁盘调度

磁盘工作机制和性能参数

  • 读取或写入时,磁头必须被定位在期望的磁道,并从所期望的柱面和扇区的开始
  • 寻道时间
    • 定位到期望的磁道所花费的时间
  • 旋转延迟
    • 从零扇区开始处到达目的地所花费的时间
    • 平均旋转延迟时间 = 磁盘旋转一周时间的一半

磁盘I/O传输时间

等待设备可用
等待通道可用 设备忙
寻道时间 设备忙
旋转延迟 设备忙
数据传送 设备忙

- Ta = Ts + 1/2r + b/rN
- Ta : 访问时间
- Ts :寻道时间
- 1/2r : 旋转延迟
- b/rN : 传输时间
- b :传输的比特数
- N :磁道上的比特数
- r :磁盘转数

磁盘调度算法

  • 通过优化磁盘访问请求顺序来提高磁盘访问性能
    • 寻道时间是磁盘访问最耗时的部分
    • 同时会有多个在同一磁盘上的I/O请求
    • 随机处理磁盘访问请求的性能表现很差

(一)先进先出(FIFO)算法

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

(二)最短服务时间优先(SSTF)算法

  • 选择从磁臂当前位置需要移动最少的I/O请求
  • 总是选择最短寻道时间

(三)扫描算法(SSAN)

  • 磁臂在一个方向上移动,访问所有未完成的请求,直到磁臂到达该方向上最后的磁道
  • 调换方向
  • 也称为电梯算法(elevator algorithm)

(四)循环扫描算法(C-SSAN)

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

(五)C-Look算法

  • 磁臂先到达该方向上最后一个请求处,然后立即反转,而不是先到最后点路径上的所有请求

(六)N步扫描算法(N-Step-SCAN)

  • 磁头粘着(Arm Stickness)现象
    • SSTF、SSAN及CSSAN等算法中,可能出现磁头停留在某处不动的情况
    • 如:进程反复请求某一磁道的I/O操作
  • N步扫描算法
    • 将磁盘请求队列分成长度为N的队列
    • 按FIFO算法依次处理所有队列
    • 扫描算法处理每个队列

(七)双队列扫描(FSCAN)算法

  • FSCAN算法是N步扫描算法的简化
    • FSCAN只将磁盘请求队列划分成两个子队列
  • FSCAN算法
    • 把磁盘I/O请求分成两个队列
    • 交替使用扫描算法处理一个队列
    • 新生成的磁盘I/O请求放入另一队列中
    • 所有新请求都被推迟到下一次扫描时处理

13.5 磁盘缓存

  • 放在内存里的磁盘数据的缓存。这些缓存是为了避免对同一块磁盘扇区里的内容进行反复引用时候的多次磁盘访问

  • 缓存

    • 数据传输双方访问速度差异较大时,引入的速度匹配中间层
  • 磁盘缓存是磁盘扇区在内存中的缓存区
    • 磁盘缓存的调度算法很类似虚拟存储调度算法
    • 磁盘的访问频率远低于虚拟存储中的内存访问频率
    • 通常磁盘缓存调度算法会比虚拟从存储复杂

单缓存与双缓存

  • 单缓存(Single Buffer Cache)

    • 设立一个缓存区,设备往缓存区写数据时,CPU不能从操作;当CPU从缓存区读数据时,设备不能写数据
    • 由于任何时刻只有一方能够操作,速度就会很受限制
  • 双缓存(Double Buffer Cache)

    • 设立两个缓存区,当设备往缓存区1写数据时,CPU可以从缓存区2读数据,可以提升交换速度

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

  • 问题

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

    • 考虑磁盘访问的密集特征,对密集引用不计数
    • 在短周期中使用LRU算法,在长周期中使用LFU算法
栈顶 新区域 中间区域 旧区域 栈底
引用计数不变 引用计数加1 引用计数加1
  • 栈中缓存块被访问时移到栈顶;如果该块在新区域,引用计数不变;否则,引用计数加1
    • 在新区域中引用计数不变的目的是避免密集访问时引用计数不利影响
    • 在中间区域和旧区域中引用计数加1是为了使用LFU算法
  • 未缓存数据块读入后放在栈顶,引用计数加1
  • 在旧区域中引用计数最小的缓存块被置换
    • 中间区域的定义是为了避免新读入的缓存块在第一次出新区域时马上被置换,有一个过渡期

猜你喜欢

转载自blog.csdn.net/weixin_42061048/article/details/80594397