• 【操作系统】第五章 IO


    第五章 IO系统

    3.1 IO设备管理

    3.1.1 IO设备

    1.分类

    块设备:信息交换以数据块为单位,属于有结构设备,比如磁盘等
    字符设备:信息交换以字符为单位,信息没有固定结构,比如打印机,键盘等,使用流传输

    2.IO接口(设备控制器)

    IO接收器又称为设备控制器,位于CPU和设备之间,承担着CPU和设备之间通信的中介功能

    • 设备控制器和CPU的接口:包含三类控制线数据线、地址线和控制线。数据线通常和数据寄存器(存放从设备送来的输入数据和CPU送来的输出数据)连接
    • 设备控制器和设备的接口:一个设备控制器可以连接多个设备,每个接口中都存在着数据、控制和状态三种信号
    • IO逻辑:用于实现对设备的控制。通过一组控制线和CPU交互,对从CPU收到的IO命令进行译码
      主要作用:
      1.接收和识别CPU发来的命令
      2.数据交换
      3.标识和报告设备的状态
      4.地址识别
      5.数据缓冲
      6.差错控制

    在这里插入图片描述

    3.IO端口

    IO端口指的是设备控制器中可以被CPU直接访问的寄存器,主要有三类

    • 数据寄存器:实现CPU和设备之间的缓冲
    • 状态寄存器:获取执行结果和设备状态信息
    • 控制寄存器:由CPU写入的控制设备 的寄存器
      为了实现CPU和IO端口的通信,一般由两种方法:
      在这里插入图片描述

    3.1.2 IO控制方式

    1.程序直接控制

    特点:每次只读写一个字
    数据流向
    每个字的读写都需要CPU的帮助
    优点:简单且易于实现
    缺点:CPU和IO只能串行工作,CPU利用率低,CPU频繁轮询检查状态寄存器,干预频率高。

    2.中断驱动方式

    在这里插入图片描述
    TIPS:

    1. CPU会在每个指令周期的末尾检查中断
    2. 中断会有一定开销
    3. 每次只读写一个字
    4. 每次读写都需要CPU干预
      优点:CPU干预频率比方法1低,并且CPU和IO可以并行工作
      缺点:每次只能传输一个字,并且频繁的中断会消耗CPU时间

    对比
    在这里插入图片描述

    其实和1.的比较就类似于CPU要跟IO设备交换信息,1.是CPU有空就主动问IO信息准备好了没,2.则是不需要CPU主动问,而是IO主动跟CPU说有信息要处理,那么CPU干完手上的活后腾出手来处理。

    3.DMA方式(直接存储器存储)

    DMA是一种特殊的控制器,主要用于对块设备的管理(比如说磁盘),有几个改进

    1. 数据传输单位是块
    2. 数据流向是设备直接传输到内存,而不经过CPU
    3. 仅在一个或多个块开始和结束时才需要CPU干预
      在这里插入图片描述
      可以看出,DMA控制器就像是一个中介,只需要CPU发出指令,他就可以完成将数据从IO到内存的迁移过程,而不需要CPU亲力亲为。
      优点:数据传输以块为单位,CPU介入频率低,并行性得到提升
      缺点:CPU每发出一条IO指令,只能读写一个或者多个连续的数据块。如果需要读写多个离散存储到数据块,或者要将数据分别写到了不同的内存区域时,CPU就要分别发出多条IO指令,进行多次中断处理。
    4.通道控制方式

    通道,一种硬件,可以理解为弱鸡版的CPU,通道可以识别并且执行一系列的通道指令。
    在这里插入图片描述
    CPU干预频率很低,只需要将一组任务交给通道就可以去执行其他任务了。
    同时,每次可以读写一组数据块。CPU、通道和IO可以并行工作,资源利用率高,但是实现较为复杂,需要专门的硬件支持,成本较高。

    在这里插入图片描述

    5.1.3 IO软件层次结构

    IO软件层次结构
    用户层软件
    设备独立性软件(内核)
    设备驱动程序(内核)
    中断处理程序(内核)
    硬件

    IO的核心子系统主要包括设备独立性软件、设备驱动程序和中断处理程序三个
    用户层软件
    提供与用户交互的接口,用户可以调用接口。将用户请求翻译成格式化的IO请求,并且通过系统调用请求操作系统内核服务
    设备独立性软件
    设备无关性软件,与设备的硬件属性无关的功能都在这一层实现是对底层的进一步抽象。另外还有差错控制和设备保护功能,以及设备的分配和回收和数据缓冲区管理。
    建立逻辑设备到物理设备的映射,并且根据设备类型选择调用相应的驱动程序。设备独立性软件会通过逻辑设备表LUT确定对应物理设备

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

    有的一整个系统只设置一张LUT,适用于单用户系统;多用户系统需要给每个用户分配一张LUT

    设备驱动程序
    驱动程序主要负责对硬件设备的具体控制,将上层发出的一系列指令转化为设备指令。
    中断处理程序
    IO任务完成时,IO控制器会发出一个中断信号,系统会根据中断信号类型找到相应的中断处理程序执行。

    5.2 设备独立性软件

    IO调度指的是用一个算法确定一个较优的顺序来处理各个IO请求
    设备保护操作系统将设备看作为一种特殊的文件,每个设备也有对应的文件保护块,以此来实现设备保护

    1.高速缓存和缓冲区

    缓冲区是一个存储区域,可以使用专门的硬件寄存器,也可以利用内存作为缓冲区。

    缓冲区作用:

    • 缓和CPU和IO设别之间速度不匹配的矛盾
    • 减少对CPU的中断频率
    • 解决数据粒度不匹配的问题,比如一次性向单个字符输入的设备提交多个字符数据
    • 提高CPU和IO设备之间的并行性
    单缓冲

    在这里插入图片描述
    如果T>C,则平均处理时间为T+M;如果T

    双缓冲

    双缓冲中操作系统会在主存中为其分配两个缓冲区。在双缓冲题目中,初始状态为:工作区空,其中一个缓冲区满但是另一个为空
    在这里插入图片描述
    假设T

    TIPS:单缓冲和双缓冲也可以在两台主机通信时使用,可以配置缓冲区用于数据的发送和接收。如果只设置单缓冲区,则在任意时刻只能实现单向传输。采用双缓冲则可以实现双向数据传输。

    循环队列缓冲区

    将多个大小相等的缓冲区链接为一个循环队列。并且设置两个缓冲区:in指针指向下一个可以冲如数据的缓冲区;out缓冲区指向下一个能够取出数据的缓冲区

    缓冲池

    缓冲池是由系统中公用的缓冲区组成,这些缓冲区按照使用情况可以分为:空缓冲队列、输入队列、输出队列。根据实际运算中扮演的功能不同分为收容输入hin,提取输入sout,收容输入hout、提取输出sin

    1. 输入进程请求输入数据时,会将空缓冲队里取出一块缓冲区移动至收容输入,完成输入后挂在输入队列队尾。
    2. 计算进程想要取得一块输入数据的时候,从输入队列中取出一块缓冲区,并且通过提取输入提取数据,然后挂在空缓冲队列队尾
    3. 计算进程想要将准备好的数据冲入缓冲区时,取得一块空缓冲队列中的缓冲区,并且通过收容输入注入数据,然后移动到输出队列队尾
    4. 输出进程请求输出数据时,从输出队列中取得一块缓冲区,并且将其通过提取输出输出数据,然后移动到空缓冲队列队尾

    2.设备的分配和回收

    分配的时候需要考虑设备的固有属性,设备的分配算法和设备分配中的安全性

    设备固有属性:

    1. 独占设备:一个时段只能分配给一个进程
    2. 分时共享适用设备:可以同时分配各多个进程使用(比如磁盘)
    3. 虚拟设备:使用SPOOLing技术使用的外部设备,可以讲一个物理设备拆分成若干个逻辑设备
    设备分配安全性:

    安全分配方式:为进程分配一个设备后将其阻塞,本次设备使用完成后才将进程唤醒,一个时段内每个进程只能使用一个设备。优点是不会死锁,缺点是CPU和IO只能串行工作。

    不安全分配方式:进程被分配到IO设备后,进程可以继续执行,之后还可以发出新的IO请求,直到某个IO请求无法满足的时候才阻塞。优点是CPU和IO可以并行处理,但是缺点是可能会发生死锁,应该搭配死锁避免、检测和解除的方法一起使用

    设备分配方式

    静态分配:进程运行前就为其分配所有需要的资源,运行结束后归还资源,破坏了请求和保持条件,不会死锁
    动态分配:进程运行过程中动态申请设备资源

    设备分配管理中的数据结构

    在这里插入图片描述
    系统会为每一个设备分配一张设备控制表DCT
    在这里插入图片描述
    也会为每一个控制器配置一张控制器控制表
    在这里插入图片描述
    同时也会为通道配置一张通道控制表CHCT
    在这里插入图片描述
    最后还有一个系统设置表SDT,记录了系统中全部设备的情况,每一个设备对应一个表项。一个表项中有设备类型、设备标识符、设备控制表DCT、驱动程序入口

    设备分配步骤
    1. 根据进程请求的物理设备名查找SDT中的表项
    2. 根据DCT中的信息判断是否空闲
      • 如果空闲则分配,并且将该设备所属的控制器分配给进程
      • 如果忙碌则将该进程挂在该设备的等待队列队尾

    只有设备、控制器、通道都成功才算是分配成功。任何一个忙碌,进程都会被阻塞并且挂到对应队列的队尾

    缺点:

    1. 使用物理设备名不方便变成
    2. 更换设备会使得程序无法运行
    3. 如果有同类型设备空闲但是目标设备忙碌,程序不会转向请求同类设别

    改进方法:建立逻辑设备名到物理设备名的映射,用户编程只需要提供逻辑设备名。逻辑设备表LUT就是负责这个

    整个系统共用一张LUT适合单用户操作系统,各个逻辑设备名不允许重复;每个用户使用一个LUT适用于多用户操作系统

    3.SPOOLing假脱机技术

    脱机指的是脱离主机进行输入和输出操作。这使得缓慢的IO操作能够在CPU不参与的情况下完成,直到输入输出的数据累积到一定程度后,CPU一并将其取走并处理。
    在这里插入图片描述

    假脱机技术相关技术概念

    • 输入井和输出井:在磁盘上开辟的两个存储区域,用于收容IO操作的数据,类似于脱机操作中的磁带。
    • 输入缓冲区和输出缓冲区:暂存输入设备送来的数据,以后在传输到输入井,输出井反之。缓冲区位于内存
    • 输入进程和输出进程:模拟输入输出时的外围控制机,会将输入数据存入输入井,将输出数据从输出井取出

    实现SPOOLing技术需要多道程序技术支持

    实例:共享打印机原理
    在这里插入图片描述
    虽然系统中只有一台打印机,但是每个进程有打印请求的时候,系统都会在输出井中为其分配一个存储区,相当于一个逻辑设备,使得一个台物理设备变成了多台逻辑设备。

    5.3 磁盘和固态硬盘

    1.磁盘

    在这里插入图片描述

    一个磁盘会有许多个盘片,一个盘面会被划分为一个个的磁道;每一个磁道会被划分为若干个磁块。每个磁盘块分配的数据量是相同的。最内侧的面积最小,因此数据密度最大。其中不同盘面上的相同磁道构成了一个柱面

    读取数据时,需要磁头移动到想要进行读写的磁道,而磁盘可以通过马达旋转。让目标扇区从磁头下面画过就能完成对扇区的读写。

    磁盘的地址可以通过**(柱面号,盘面号,扇区号)**这个三元组来确定。
    如果根据地址需要读取一个块,则:

    • 根据柱面号移动磁头,是的磁头指向指定柱面
    • 激活指定盘面对应磁头
    • 磁盘旋转过程中磁头划过对应扇区

    磁盘分类:

    • 活动头磁盘:磁臂可以来回伸缩定位磁道

    • 固定头磁盘:每一个磁道都有一个对应的磁头,磁头不需要活动

    • 可换盘磁盘和不可换盘磁盘:区别是磁盘片是否可更换

    2.磁盘调度算法

    一次磁盘读写操作所需时间

    寻找时间Ts:在读写数据前讲磁头移动到指定磁道的时间

    • 启动磁头臂需要时间s
    • 移动磁道需要时间,每跨越一个磁道耗时m,需要跨越n条磁道
      那么Ts=n*m+s

    延迟时间Tr:通过旋转磁盘,使得磁盘头定位到目标扇区所需时间,平均查找一个扇区需要旋转半圈。如果磁盘转速为r,则平均所需延迟时间为 T r = 1 2 ∗ 1 r = 1 2 r T_r=\frac{1}{2}*\frac{1}{r}=\frac{1}{2r} Tr=21r1=2r1

    在这里插入图片描述
    延迟时间和传输时间操作系统无法优化,因为影响这两个时间的主要因素是磁盘转速,而磁盘转速是固定的,操作系统无法影响。

    磁盘调度

    需要学会计算总共移动了多少个磁道,平均每次移动多少个磁道

    先来先服务算法FCFS
    • 优点:公平,如果请求访问的磁道比较集中的话,性能还行
    • 缺点:如果有大量进程需要竞争使用磁道,并且请求访问的磁道很分散,则在性能上很差
    最短寻找时间优先算法SSTF

    优先选择离当前磁头最近的磁道,是一种贪心算法。
    优点:性能好,平均寻道时间短
    缺点:可能产生饥饿现象

    扫描算法SCAN

    只有磁头移动到最外侧磁道的时候才能往内侧移动,移动到最内侧的时候才能望外侧移动,又称为电梯算法

    • 优点:性能好并且不会有饥饿现象
    • 缺点:
      • 如果有255个磁道,需要访问的是1,2,3号,那么访问完3号后还会向外移动到255号才往回扫描,浪费时间
      • 各个磁道响应时间不均匀
    LOOK调度算法

    在SCAN之外,只要磁头移动方向上没有别的请求的时候,就可以立即改变磁头移动方向,而不需要移动到磁道边界。

    C-SCAN循环扫描算法

    磁头往特定方向移动时才处理磁道访问请求,而反方向移动会快速移动并且不做任何扫描。比如从0号到255号,在顺序扫描的时候才会处理磁道访问请求,而到达255之后,则快速回退到0号磁道并且开始下一个循环

    • 优点:比起SCAN,各个位置的磁道的响应频率都很平均
    • 缺点:性能没有SCAN这么好
    C-LOOK调度算法

    和C-SCAN相比,C-LOOK不需要移动到磁道边缘,而是移动到最后一个请求的磁块后就可以快速返回并开始下一轮扫描。并且快速返回到的位置也不是磁道边缘,而是有磁道访问请求的最小磁道

    注意:题目中无特殊说明,那么SCAN就是LOOK算法,C-SCAN就是C-LOOK,不需要考虑到移动到磁道边界,而只需要考虑移动到最后一个请求的磁道

    3.减少磁盘延迟时间的方法

    磁头读取了一个扇区的数据后,需要一定的处理时间才能接着读下一个。如果数个逻辑上连续的数据在磁盘上也连续,那么在读取了第一个扇区,正在经过连续的第二个扇区的时候,由于磁盘正在处理第一个扇区的数据而错过第二个扇区的读取。此时想要再次读取需要多转一圈,导致较大的开销。

    交替编号
    让逻辑上相邻的扇区在物理上有一定的间隔,可以使得读取连续逻辑扇区所需的延迟时间更小。

    错位命名
    每个盘面上同一个位置的扇区使用不同的逻辑命名。使得在出现盘片切换的时候,可以连续读写。

    4.磁盘管理

    磁盘初始化

    出厂时硬盘只进行了磁道的划分,并没有划分扇区

    Step1:物理格式化(低级格式化),将各个磁道花费为固定扇区,一个扇区包括扇区头,数据部分和扇区尾。管理扇区所需要的数据结构一般存放在头和尾两个部分。
    Step2:将硬盘分区,每个分区由若干个柱面组成,这部分就是我们熟悉的C盘、D盘这些。
    Step3:进行逻辑格式化,创建文件系统

    引导块

    计算机开机时需要进行一系列工作,会执行一个初始化程序(自举程序),完成初始化工作。但是ROM中的数据难以更改和更新。因此现代的操作系统只会在ROM中存放很小的自举装入程序,通过该程序计算机可以从磁盘上读取完整的自举程序。这样自举程序也可以很方便更新

    开机时拥有自举程序的块称为引导块

    坏块

    对于简单的硬盘,可以在逻辑格式化的时候对磁盘进行坏块检查,并且在FAT文件分配表中表明,从而不使用这些坏块。这种方法对操作系统是不透明的,操作系统知晓具体是哪个块坏了

    对于复杂的磁盘,会维护一个坏块链表。坏块链表在出厂前进行的低级格式化的时候就已经初始化了。磁盘的磁盘控制器会维护该链表,并且会刻意保留一些备用扇区以替换坏快。这种方式称之为扇区备用,该方式对操作系统透明。

  • 相关阅读:
    中国PETG市场预测及战略研究报告(2022版)
    数据结构期末复习(十套试卷)库题
    《Weisfeiler and Leman Go Neural Higher-order Graph Neural Networks》阅读笔记
    sklearn中的SparseCoder是什么?又该如何使用
    Ubuntu20.04安装 nginx1.23.1
    小白学习笔记—网络安全/黑客技术
    .NET CORE 授权
    java培训技术SpringMVC 确定目标方法 POJO 类型入参的过程
    什么是代码签名?代码签名的好处
    Python少儿编程小课堂(五)入门篇(5)
  • 原文地址:https://blog.csdn.net/weixin_45434953/article/details/126673263