计算机操作系统(五)IO设备

GuangYing Lv2

5IO设备

5.1IO组成

5.1.1I/O设备的概念和分类

什么是I/O设备

输入输出设备,向计算机收/发数据的外部设备

UNIX系统将外部设备抽象为特殊的文件

I/O设备的分类

按使用特性

  • 人机交互外部设备(慢)
  • 网络通信(中)
  • 存储设备(快)

按传输速率

  • 低速设备
  • 中速设备
  • 高速设备

按信息交换的单位

  • 块设备
    • 速率高,可寻址,可随机读写
  • 字符设备
    • 速率慢,不可寻址,输入输出时常采用中断驱动方式

5.1.2I/O控制器

机械部件:执行具体I/O操作
电子部件:插入主板扩充槽的印刷电路板

CPU和I/O设备机械部件之间的媒介:I/O控制器(电子部件,设备控制器)

功能

  • 接受和识别CPU发出的命令
    • 控制寄存器,存放CPU发来的命令和参数
  • 向CPU报告设备的状态
    • 状态寄存器。记录I/O设备的当前状态
  • 数据交换
    • 数据寄存器
      • 输出时,暂存CPU发来的数据,之后再由控制器传输设备
      • 输入时,暂存设备发来的数据,之后CPU从数据寄存器中取走数据
  • 地址识别
    • 给各个寄存器设置一个特定的地址
    • I/O控制权通过CPU提供的地址来判断CPU要读/写哪个寄存器

I/O控制器的组成

  • CPU与控制器的接口
    • 实现CPU与控制器的通信
    • CPU通过控制线发出命令
    • 地址线指明操作的设备
    • 通过数据线来读取数据/存放数据
  • I/O逻辑
    • 接受和识别CPU的各种命令,并负责对设备发出命令
  • 控制器与设备的接口(多个)
    • 实现控制器与设备之间的通信
    • 数据:传送输入/输出数据
    • 状态:设备要反馈状态(忙碌/空闲)
    • 控制:控制器向设备发出控制信息

注:

  • 一个I/O控制器可能对应多个设备
  • 数据寄存器、控制寄存器、状态寄存器可能有多个,需要有相应的地址
    • 内存映像I/O:占用内存地址的一部分
      • 寄存器与内存地址统一编址
      • 优点:简化了指令,可以采用对内存的操作指令来对控制器进行操作
    • 寄存器独立编址:使用I/O专用地址
      • 寄存器独立编址
      • 缺点:需要设置专门的指令来实现对控制器的操作
        • 不但要指明控制器地址,还要指明控制器的编号

5.1.3I/O控制方式

  • 完成一次读/写操作的流程
  • CPU干预的频率
  • 数据传送的单位
  • 数据的流向
  • 主要的优缺点

程序直接控制方式

轮询

  • CPU向控制器发出命令
  • 将I/O状态信息读入CPU寄存器
  • 轮询检查控制器的状态
    若准备好了
  • 从I/O模块读入CPU寄存器
    • IO->CPU寄存器
  • 将CPU寄存器中的内容写入内存中
    • CPU->存储器

CPU干预频率:很频繁
在等待I/O完成的过程中需要不断轮询检查

数据传送的单位

  • 每次读/写一个字

数据的流向

  • 读:I/O->CPU->内存
  • 写:内存->CPU->I/O
    每个字的读/写都需要CPU的帮助

优点:实现简单
缺点:CPU和I/O设备只能串行工作

  • CPU需要一直轮询检查,长期处于忙等状态,CPU利用率低

中断驱动方式

中断

CPU发出读/写命令后,可将等待I/O的进程阻塞,切换到别的进程执行

完成后,控制器向CPU发出中断信号
CPU检测到中断信号后,执行中断处理程序

  • 从I/O控制器中读一个字的数据到CPU寄存器中,再写入主存
    CPU恢复等待I/O的进程(或其他进程)的运行环境,然后继续执行

CPU干预的频率:

  • 每次IO操作开始前、完成后都需要CPU接入
  • 等待IO完成的过程中CPU可以切换到别的进程执行

数据传送的单位

  • 每次读/写一个字

数据的流向:

  • 读:IO->CPU->内存
  • 写:内存->CPU->IO设备

优点:CPU和IO设备可以并行工作,CPU利用率明显提升
缺点:每个字在IO设备与内存间传输,都需要经过CPU

  • 频繁的中断处理会消耗较多的CPU时间

DMA方式

直接存储器存取,主要用于块设备的IO控制

  • 数据的传输单位是块
  • 数据流向是从设备直接放入内存/内存到设备
  • 仅在传送一个或多个数据块的开始和结束时,才需要CPU干预

DMA控制器

  • 主机-控制接口
    • DR数据寄存器
    • MAR内存地址寄存器
    • DC数据计数器
    • CR命令/状态寄存器
  • 块设备-控制器接口

注意:每次读写的只能是连续的多个块
且这些块在读入内存后再内存中也必须是连续的

优点:数据以块为单位,CPU介入率进一步降低

  • 数据传输不再需要经过CPU再写入内存
  • 数据传输效率进一步增加
  • CPU和I/O设备的并行性得到提升
    缺点:CPU每发出一条IO指令,只能读/写一个或多个连续的数据块

如果要离散的存储数据,则需要一个块一个块发出多个请求

通道控制方式

通道:一种硬件,可识别执行一系列通道指令

  • CPU向通道发出IO指令
    • 指明通道程序在内存中的位置
  • 通道完成任务后,再中断CPU

CPU干预频率

  • 极低,通道根据CPU的指示执行相应的通道程序,只有完成一组数据块的读/写后才需要发出中断信号,请求CPU干预

数据传送的单位

  • 每次读/写一组数据块

数据的流向(在通道的控制下进行)

  • 读:IO->内存
  • 写:内存->IO

缺点:实现复杂,需要专门的通道硬件支持
优点:CPU、通道、IO设备可并行工作,资源利用率很高

5.1.4I/O软件层次结构

用户部分:

  • 用户层软件
    • 实现了与用户交互的接口
    • 将请求转换为IO请求并调用系统调用
      内核部分:
  • 设备独立性软件
    • 设备无关性软件,实现与设备硬件无关的功能
    • 向上层提供统一的调用接口
    • 设备的保护
    • 差错处理
    • 设备的分配与回收
    • 数据缓冲区管理
    • 建立逻辑设备名到物理设备名的映射关系
      • 逻辑设备表LUT
      • 根据设备类型选择调用相应的驱动程序
  • 设备驱动程序
    • 负责对硬件设备的具体控制
    • 将上层的指令转化为特定设备的一系列操作
    • 不同设备的硬件特性不同,需要设计相应的驱动程序
  • 中断处理程序
    • IO任务完成时,IO控制器发送一个中断信号
    • OS根据中断信号类型找到相应的中断处理程序并执行
      硬件

直接涉及硬件具体细节、且与中断无关的操作:设备驱动程序层完成

没有涉及硬件的、对各种设备都需要进行管理的工作:在设备独立性软件层完成

5.1.5输入输出应用程序接口 和 设备驱动程序接口

输入/输出应用程序接口

用户层的应用程序无法通过一个统一的系统调用接口来完成所有类型的I/O

字符设备接口:不可寻址,一次读1字符

  • get/put:读/写一个字符

块设备接口:可寻址,每次读/写1个块

  • read/write:向块设备的读写指针位读/写多个字符
  • seek:修改读写指针位置

网络设备接口:网络套接字接口,数据给谁

  • socket:创建一个网络套接字
  • bind:绑定套接字到端口
  • connect:将套接字连接到远程地址
  • read/write:从套接字读/写数据

阻塞/非阻塞I/O

阻塞I/O:应用程序发出I/O调用,进程需要转为阻塞态等待

非阻塞I/O:应用程序发出I/O系统调用,系统调用可迅速返回,进程无需阻塞等待

设备驱动接口

若驱动程序接口不统一,则OS很难调用不同设备的程序

要按照OS规定的设备驱动程序的接口标准,开发设备驱动程序

5.2IO子系统

5.2.1IO核心子系统

I/O软件层次中属于OS内核的部分:I/O系统(I/O核心子系统)

用户层软件:假脱机技术(SPOOLing技术)
设备独立性软件:I/O调度、设备保护、设备分配与回收、缓冲区管理(缓冲与高速缓存管理)

I/O调度:用某种算法确定一个好的顺序来处理各个I/O请求

文件保护:设备看做特殊的文件,每个设备也有对应的FCB

5.2.2假脱机技术

批处理阶段引入了脱机输入/输出技术(用磁带完成)

脱离主机的控制进行的输入/输出操作

缓解了CPU与慢速IO设备的速度矛盾
即使CPU在忙碌,也可以先提前把数据输入到磁带
即使慢速的输出设备在忙碌,也可以提前将数据输出到磁带

假脱机技术:输入井和输出井

用软件的方式模拟脱机技术

SPOOLing系统的组成:

  • 输入井:模拟脱机输入时的磁带,用于收容I/O设备输入的数据
  • 输出井:模拟脱机输出时的磁带,用于收容用户进程输出的数据
  • 输入进程:模拟输入时的外围控制机
  • 输出进程:模拟输出时的外围控制机

在磁盘上开辟出两个存储区域:输入井和输出井

SPOOLing技术,必须要有多道程序技术的支持

SPOOLing技术可以把一台物理设备虚拟成逻辑上的多台设备

  • 可将独占式设备改造成共享设备

5.2.3设备的分配与回收

设备分配时应考虑的因素

  • 设备的固有属性
  • 设备的分配算法
  • 设备分配中的安全性

设备的固有属性:

  • 独占设备:一个时段只能分配给一个进程
  • 共享设备:可同时分配给多个设备,各个进程宏观上同时共享,微观交替
  • 虚拟设备:采用SPOOLing技术将独占设备改造为虚拟设备

进程运行安全性上:

  • 安全分配方式:为进程分配一个进程后就将其阻塞,本次I/O完成后才将进程唤醒
    • 一个时间段内每个进程只能使用一个设备
    • 优点:破坏了请求和保持条件,不会死锁
    • 缺点:对于一个进程,CPU和I/O设备只能串行工作
  • 不安全分配方式:进程发出I/O请求后,系统为其分配I/O设备
    • 进程可继续执行,之后还可发出新的I/O请求
    • 只有某个I/O请求得不到满足时才将进程阻塞
    • 一个进程可以同时使用多个设备
    • 优点:进程的计算任务和I/O任务可以并行处理,迅速推进进程
    • 缺点:可能发生死锁

静态分配和动态分配
静态分配:运行前分配全部所需资源,运行结束后归还

  • 破坏了请求和保持条件

动态分配:运行过程中动态申请设备资源

设备分配管理中的数据结构
设备控制表DCT:OS为每个设备配置一张DCT,用于记录设备情况

  • 设备类型
  • 设备标识符:物理设备名,系统中唯一
  • 设备状态
  • 指向控制器表的指针
  • 重复执行次数或事件:当重复执行多次I/O后仍不成功,才会认为本次I/O失败
  • 设备队列的队首指针:等待该设备的进程队列

控制器控制表COCT:每个设备控制器对应一张,OS根据COCT队控制器进行操作和管理

  • 控制器标识符
  • 控制器状态
  • 指向通道表的指针
  • 控制器队列的队首指针
  • 控制器队列的队尾指针

通道控制表CHCT:每个通道一张

  • 通道标识符
  • 通道状态
  • 与通道连接的控制器表首址
  • 通道队列的队首指针
  • 通道队列的队尾指针

系统设备表SDT:记录系统中全部设备的情况,每个设备对应一个表目
表目:

  • 设备类型
  • 设备标识符
  • DCT
  • 驱动程序入口

设备分配的步骤

  • 根据物理设备名查找SDT
  • 根据SDT找到DCT
    • 若设备忙碌,则PCB挂到设备等待队列
    • 不忙碌,则将设备分配给进程
  • 根据DCT找到COCT
    • 若控制器忙碌,PCB挂到控制器等待队列
    • 不忙碌,则将控制器分配给进程
  • 根据COCT找到CHCT
    • 若通道忙碌,PCB挂到通道等待队列
    • 不忙碌,将通道分配给进程

三者都分配成功时,才算分配成功

缺点:

  • 用户必须使用物理设备名,暴露了底层细节,不方便
  • 若换了一个物理设备,则程序无法运行
  • 若进程请求的物理设备正在忙碌,则即使系统中还有同类设备,也必须阻塞等待

改进方法:建立逻辑设备名到物理设备名的映射

根据逻辑设备名查找SDT
更新逻辑设备表LUT:添加相应表项

  • 逻辑设备名
  • 物理设备名
  • 驱动程序入口地址

如果用户进程再次通过相同的逻辑设备名请求使用设备
则OS通过LUT表即可知道实际要使用哪个物理设备
也能知道该设备的驱动程序入口地址

5.2.4缓冲区管理

缓冲区:一个存储区域

使用硬件作为缓冲区成本高,容量小,一般仅用在对速度要求非常高的场合

一般使用内存作为缓冲区

CPU将要输出的数据快速放在缓冲区后,就可做别的事
慢速IO设备可以慢慢从缓冲区中取走数据

缓冲区的作用:

  • 缓和CPU与IO设备之间速度不匹配的矛盾
  • 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
  • 解决数据粒度不匹配问题
  • 提高CPU与I/O设备之间的并行性

单缓冲

若进程请求某种块设备读入若干块的数据

若单缓冲:OS在主存中为进程分配一个缓冲区

注:缓冲区非空是,不能往缓冲区冲入数据,只能从缓冲区吧数据传出

  • 当缓冲区为空时,可以往缓冲区中冲入数据,但必须充满后才能从缓冲区中把数据传出

初始状态:工作区满,缓冲区空

  • 设备传输到缓冲区耗时T
  • CPU处理工作区中的内容耗时C
  • 从缓冲区移动到工作区耗时M
    若T > C 则处理一块数据的平均用时 = T+M
    若T < C则平均用时= C + M

结论:采用单缓冲策略,处理一块数据平均耗时Max(C, T) + M

双缓冲

分配两个缓冲区

初始状态:工作区空,一个缓冲区满,另一个缓冲区空

结论:采用双缓冲策略,处理一个数据块的平均耗时为Max(T, C + M)

使用单/双缓冲区在通信时的区别

单缓冲区:同一时刻只能单向传输
双缓冲区:同一时刻可双向传输

循环缓冲区

多个大小相等的缓冲区链接成一个循环队列

缓冲池

由OS中共用的缓冲区组成

可分为:空缓冲区队列,装满输入缓冲区队列,装满输出缓冲区队列

5.3磁盘

5.3.1磁盘的结构

磁盘:表面有磁性物质,可用来记录二进制数据
磁道:磁盘盘面分为多个同心圆,形成了一个个磁道
扇区:磁道被分为一个个扇区,一个扇区就是一个磁盘块

  • 内侧磁道的扇区面积小,密度大

如何在磁盘中读/写数据

  • 由磁头移动到想读写的扇区所在磁道
  • 磁盘转动,让目标扇区从磁头下划过

盘面:有多个,堆成一个圆柱体

  • 每个盘面对应一个磁头
  • 所有磁头连接在同一个磁臂上,只能共同移动
  • 所有盘面相对位置都相同,相同的磁道组成柱面

可用 (柱面号,盘面号,扇区号) 来定位任意一个磁盘块(xyz)

  • 根据柱面号,移动磁臂,让磁头指向指定柱面
  • 激活指定盘面对应的磁头
  • 磁盘旋转,指定扇区从磁头下划过,完成对指定扇区的读写

磁盘分类

活动头磁盘:磁头可移动
固定头磁盘:磁头不可移动,每个磁道都有一个磁头

可换盘磁盘:盘片可以更换
固定盘磁盘:盘片不可更换

5.3.2磁盘调度算法

一次磁盘读/写操作需要的时间

寻找时间(寻道时间) Ts:读写数据前,将磁头移动到指定磁道所花的时间

  • 启动磁头臂花费时间s
  • 移动磁头花费时间,若跨越一个磁道耗时m,跨越n条磁道
  • 则寻道时间Ts = s + m * n

延迟时间 Tr:通过旋转磁盘,使磁头定位到目标扇区所需的时间

  • 磁盘转速r(转/秒 转/分)
  • 平均所需延迟时间Tr = (1/2) * (1 / r) = 1/2r

传输时间Tt:从磁盘读出或向磁盘写入数据所经历的时间

  • 假设磁盘转速为r
  • 此次读/写的写字节数为b
  • 每个磁道上的字节数为N
  • 传输时间Tt = (1/r) * (b/N) = b/(rN)

总的平均存取时间Ta = Ts + 1/2r + b/(rN)

先来先服务算法(FCFS)

根据进程请求访问磁盘的先后顺序进程调度

优点:公平,如果请求访问的磁道比较集中,算法性能还算过得去
缺点:若大量进程竞争使用,请求访问的磁道很分散,则FCFS在性能上很差,寻到时间长

最短寻找时间优先(SSTF)

SSTF算法会优先处理的磁道是与当前磁头最近的磁道

可以保证每次的寻道时间最短,但并不能保证总的寻道时间最短
(贪心,局部最优解)

优点:性能较好,平均寻道时间短
缺点:可能产生饥饿现象

扫描算法(SCAN)

SSTF算法产生饥饿的原因:磁头有可能在一个小区域内来回移动
于是:只有磁头移动到最外侧磁道时才能往内移动,移动到最内侧磁道时才能往外移动
即,扫描算法

因为想电梯,所以也叫电梯算法

优点:性能较好,平均寻道时间较短,不会产生饥饿现象

缺点:

  • 只有到达最边上的磁道时,才能改变磁头方向
  • SCAN算法对各个位置磁道的响应频率不平均

LOOK调度算法

解决SCAN的第一个问题
LOOK调度算法:如果在磁头移动方向上已经没有别的请求了,就可以立即改变磁头移动方向
(边移动边观察,因此叫LOOK)

优点:比起SCAN算法,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短

循环扫描算法(C-SCAN)

解决SCAN的第二个问题
C-SCAN短发:只有磁头朝某个特定方向移动时,才处理磁道访问请求

  • 返回时直接快速移动至起始端而不处理任何请求

优点:比起SCAN,对于各个位置磁道的响应频率很平均

缺点:只有到达最边上的磁道时才能改变磁头移动方向

  • 比起SCAN算法,平均寻道时间更长

C-LOOK调度算法

解决C-SCAN算法的主要缺点:

  • 只有到达最边上磁道时才能改变磁头移动方向
  • 且磁头返回时不一定需要返回到最边缘的磁道

C-LOOK算法:如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回

  • 并且磁头只需要返回到有磁道访问请求的位置即可

优点:比起C-SCAN算法,不需要每次都移动到最外侧或最内侧才改变磁头方向

  • 使寻道时间进一步缩短

5.3.3减少磁盘延迟时间的方法

磁头读入一个扇区数据后,需要一小段时间处理

  • 如果逻辑上相邻的扇区在物理上也相邻,则读入几个连续的逻辑扇区,可能需要很长的延迟时间(目标扇区移动到磁头下)

减少延迟时间的方法:交替编号

让逻辑上相邻的扇区在物理上有一定的间隔

  • 可以使用连续的逻辑扇区所需要的延迟时间更小

磁盘地址结构的设计

为什么磁盘物理地址是(柱面号,盘面号,扇区号)

扇区切换速度(磁盘旋转)>盘面切换速度(激活对应盘面的磁头)>柱面切换速度(物理上移动磁头臂)

因此,在读取地址连续的磁盘块时,可以减少磁头移动消耗的时间

减少延迟时间的方法:错位命名

让相邻盘面的扇区编号错位

错位命名后,划过0号盘面后,延迟一个扇区,可以立即读取1号盘面的数据
减少了延迟时间

5.3.4磁盘的管理

磁盘初始化

  • 进行低级格式化(物理格式化)
    • 将磁盘各个磁道划分为扇区
    • 扇区可分为头、数据区域、尾三个部分
    • 管理扇区所需的数据结构一般存放在头尾两部分
      • 包括扇区校验码等
  • 磁盘分区
    • 每个分区由若干柱面组成
  • 进行逻辑格式化,创建文件系统
    • 包括创建文件系统的根目录、初始化存储空间管理所用的数据结构

引导块

计算机开机时执行一系列初始化工作,通过执行初始化程序(自举程序) 完成

ROM中只存放很小的自举装入程序
完整的自举程序存放在磁盘的启动块上(引导块/启动分区)

  • 启动块位于磁盘的固定位置

拥有启动分区的磁盘称为启动磁盘系统磁盘

坏块的管理

坏块属于OS无法修复的硬件故障,应将坏块标记出来,以免错误的使用到它

对简单的磁盘,可在逻辑格式化时检查坏块,并标明哪些扇区是坏扇区

  • 这种方式中,坏块对OS不透明

对于复杂的磁盘,磁盘控制器会维护一个坏块链表

  • 在磁盘出厂前进行低级格式化,将坏块链进行初始化
  • 会保留些备用扇区,用于替换坏块
    • 这种方案:扇区备用
    • 且这种方式中:坏块对OS透明

5.3.5固态硬盘SSD

  • 原理:基于闪存技术,属于电可擦除ROM
  • 组成
    • 闪存翻译层:翻译逻辑块号,找到对应页
    • 存储介质:多个闪存芯片
  • 读写性能特性
    • 以页为单位读写:相当于磁盘的扇区
    • 以块为单位擦除:擦干净的块,其中每页都可以写一次,读无限次
    • 支持随机访问:系统给定一个逻辑地址,闪存翻译层可通过电路迅速定位到对应的物理地址
    • 读快、写慢:要写的页如果有数据,则不能写入,需要将块内其他页全部复制到一个新的(擦除过的)块中,再写入新的页
  • 与机械硬盘相比的特点
    • SSD读写速度快,随机访问性能高,用单路控制访问位置
      • 机械硬盘通过移动磁臂旋转磁盘控制访问位置,有寻道时间和旋转延迟
    • SSD安静无噪音、耐摔抗震、能耗低、造价更贵
    • SSD的一个块被擦除次数过多(重复写同一个块)可能会坏掉
      • 而机械硬盘的扇区不会因为写的次数太多而坏掉
  • 磨损均衡技术
    • 思想:将擦除平均分配在各个块上,以提升使用寿命
    • 动态磨损均衡:写入数据时,优先选择累计擦除次数少的新闪存块
    • 静态磨损均衡:SSD检测并自动进行数据分配、迁移
      • 让老旧的闪存块承担以读为主的存储任务,让较新的闪存块承担更多的写任务

闪存翻译层:将逻辑块号映射到对应的物理地址
闪存芯片组

  • 内存芯片
    • 块(对应磁道)
      • 页(对应的是扇区)
  • 标题: 计算机操作系统(五)IO设备
  • 作者: GuangYing
  • 创建于 : 2025-06-25 18:45:03
  • 更新于 : 2025-06-25 19:01:30
  • 链接: http://quebo.cn/2025/06/25/计算机操作系统-5IO设备/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。