设备分配与回收、缓冲区管理

设备分配与回收

  1. 是什么:为实现对独占设备的分配,必须在系统中配置相应的数据结构
  2. 设备分配管理中的数据结构
    • 设备控制表DCT:每个设备对应一张DCT,用于记录设备情况
      • 关键字段有:类型、标识符、状态、指向COCT的指针、重复执行次数或时间(当重复执行多次io后仍不成功会认为此次io失败)、等待队列指针(由进程PCB组成队列)
    • 控制器控制表COCT:每个控制器对应一张COCT,操作系统根据COCT的信息对控制器进行操作和管理
      • 关键字段有:控制器标识符、状态、指向CHCT的指针、等待队列指针
    • 通道控制表CHCT:每个控制器对应一张CHCT。操作系统根据CHCT的信息对通道进行操作和管理
      • 关键字段有:通道标识符、状态、指向COCT的指针、等待队列指针
    • 系统设备表SDT:记录整个系统中所有设备的情况,每个设备对应一个表目
      • 关键字段有:设备类型、设备标识符(即物理设备名)、DCT、驱动程序入口
  3. 设备分配的步骤
    • 根据进程请求的物理设备名查找SDT
    • 根据SDT找到DCT
      • 若设备忙碌则将进程PCB挂到设备等待队列中
      • 若设备不忙碌则将设备分配给进程
    • 根据DCT找到COCT
      • 若控制器忙碌则将进程PCB挂到控制器等待队列中
      • 不忙碌则将控制器分配给进程
    • 根据COCT找到CHCT
      • 若通道忙碌则将进程PCB挂到通道等待队列中
      • 不忙碌则将通道分配给进程
    • 只有设备、控制器、通道三者都分配成功,这次设备分配才算成功。之后便可启动I/O设备进行数据传送

设备分配步骤的改进

  • 改成根据进程请求的逻辑设备名(即设备类型)查找SDT。
  • 增加一个逻辑设备表LUT:用户根据逻辑设备名查找SDT时若找到指定类型的、且空闲的设备,就将其分配给该进程。操作系统在LUT中新增一个表项
    • 逻辑设备表LUT建立了逻辑设备名与物理设备名之间的映射关系。如上所示,用户进程第一次使用设备时是用逻辑设备名向操作系统发出请求,然后操作系统查SDT找到空闲设备分配并在LUT中新增表项。若之后用户进程再通过相同的逻辑设备名请求使用该设备,操作系统通过LUT表即可知道该进程要使用哪个物理设备,也能知道该设备的驱动程序入口地址
    • LUT和DMT(Device Mapping Table设备映射表)是一个东西。DMT是Windows下的,LUT是Unix下的,都是建立逻辑设备名到物理设备名的映射关系(以便之后根据设备类型选择调用相应的驱动程序)。属于设备独立性软件要干的事情
  1. 设备分配中应考虑的因素
    • 设备的固有属性:
      • 独占性:将一个独占设备分配给某进程后,便由该进程独占该设备,直至该进程完成或释放该设备
      • 共享性:对于共享设备,可将其同时分配给多个进程使用,此时需注意对这些进程访问该设备的先后次序进行合理调度
      • 虚拟性:虚拟设备属于可共享设备,可将其同时分配给多个进程使用
      • 原则是既要充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁
    • 设备的分配算法
      • 先来先服务
      • 高优先级优先
    • 设备分配中的安全性
      • 安全分配方式:进程只要发出一个I/O请求就立即阻塞,直到I/O完成才被唤醒。即一个进程在同一时间段内只能使用一个设备,发出I/O请求后就不能再请求任何资源。破坏了死锁产生的“请求和保持”条件,不会发生死锁。但对于同一个进程,CPU和I/O设备串行工作,进程推进的效率不高
      • 不安全分配方式:进程可以同时发出多个I/O请求,直到某个I/O设备不可用才阻塞。这种方式下一个进程可同时操作多个设备,使得进程快速推进。但分配不安全,可能造成死锁(可用银行家算法来避免死锁)
    • 设备独立性:将用户程序与具体物理设备隔离开来,即用户面对的是逻辑设备,而分配程序将逻辑设备转换为物理设备后,再根据要求的物理设备号进行分配
      • 使得系统增减或变更设备时不必修改源程序,便于处理I/O设备故障,提高系统可靠性,并使设备的分配更加灵活,提高设备的利用率
  2. 一个设备分配过程的例子:当某进程提出I/O请求后,系统的设备分配程序可按下述步骤进行设备分配:
    • 分配设备:首先根据I/O请求中的物理设备名查找SDT,从中找出该设备的DCT,再根据DCT中的设备状态字段获知该设备是否正忙。若忙则将该进程的PCB挂在设备队列上;否则按照一定算法计算本次设备分配的安全性。若不会导致系统进入不安全状态,就将设备分配给该进程;否则仍将其PCB插入设备等待队列
    • 分配控制器:在系统把设备分配给请求I/O的进程后,再到其DCT中找出与该设备连接的控制器的COCT,从COCT的状态字段中可知该控制器是否正忙。若忙就将该进程的PCB挂在该控制器的等待队列上;否则将该控制器分配给该进程
    • 分配通道:在该COCT中找到找到与该控制器连接的通道的CHCT,根据CHCT内的状态信息可知该通道是否正忙。若忙就将该进程挂在该通道的等待队列上;否则将该通道分配给进程。
    • 只有在设备、控制器、通道三者都分配成功时,这次的设备分配才算成功。然后便可启动该I/O设备进行数据传送

在这里插入图片描述

缓冲区管理

  1. 有缓冲区和无缓冲区的对比:
    • 没有缓冲区的情况(输入):磁盘每准备好一个字的数据(放在其设备控制器的数据寄存器中),就给操作系统发一个中断信号,操作系统的中断处理程序会把磁盘控制器里这个字复制到用户区(即用户进程可以访问的一个空间)。整个1KB都复制完之后,操作系统唤醒用户进程,P就可以使用这1KB的数据
      请添加图片描述
    • 有缓冲区的情况(输入):由于缓冲区是操作系统内核(I/O的设备无关性软件)实现的,因此缓冲区是设置在内存的内核空间中的。这种情况下是先让磁盘逐字地将数据输入到缓冲区中,缓冲区充满后操作系统会将其一口气复制到用户空间。逐字输入的过程(3)就可以交给DMA控制器,这样的话就减少了中断发生的频率(等缓冲区充满后才发一个中断,让操作系统内核将缓冲区的数据全部复制到用户空间)
      请添加图片描述
  2. 缓冲区的作用
    • 缓和CPU与I/O设备之间速度不匹配的矛盾:CPU可以把要输出的数据快速放入缓冲区,之后就可以做别的事。慢速的I/O设备可以慢慢从缓冲区取走数据
    • 减少对CPU的中断频率,放宽对CPU中断响应时间的限制:远程通信系统中,若从远程终端发来的数据仅用一位缓冲来接收,则必须在每收到一位数据时便中断一次CPU。这样,对于速率为9.6kb/s的数据通信来说,就意味着其中断CPU的频率为9.6kHz,即约每100微秒就要中断CPU一次,且CPU必须在这100微秒内予以响应,否则缓冲区内的数据就会被冲掉。若设置一个8位缓冲寄存器,就可以使CPU被中断的频率降低为原来的 1 8 \frac{1}{8} 81。类似的,在磁盘控制器和磁带控制器中,都需要配置缓冲寄存器,以减少对CPU的中断频率,放宽对CPU中断响应时间的限制。随着数据传输速率的提高,需要配置位数更多的寄存器进行缓冲
    • 解决数据粒度不匹配问题:缓冲区可用于解决在生产者和消费者之间交换的数据粒度不匹配的问题。如当生产者所生产的数据粒度比消费者消费的数据粒度小时,生产者进程可以一连生产好几个数据单元的数据,当其总和已达到消费者进程所要求的数据单元大小时,消费者便可从缓冲区中取出数据进行消费。当生产者所生产的数据粒度比消费者消费的数据粒度大时,生产者每次生产的数据,消费者可以分几次从缓冲区中取出消费
    • 提高CPU与I/O设备之间的并行性:例如,在CPU(生产者)和打印机(消费者)之间设置了缓冲区后,生产者在生产了一批数据并将其放入缓冲区后,便可立即去进行下一次的生产。与此同时,消费者可以从缓冲区中取出数据进行消费,这样便可使CPU与打印机处于并行工作状态
  3. 单缓冲:用户进程请求某种块设备读入若干块数据,操作系统在主存中为其分配一个缓冲区。用户进程的内存空间中,会分出一片工作区来接受输入/输出数据,一般默认工作区大小与缓冲区大小相同
    请添加图片描述
    请添加图片描述
  4. 双缓冲:若用户进程请求某种块设备读入若干块数据,操作系统会在主存为其分配两个缓冲
    请添加图片描述
    在这里插入图片描述
    请添加图片描述
    请添加图片描述
    • 如果C+M<T:说明还没充满缓冲区1,缓冲区2的数据就已经处理完了,那么充满缓冲区1后就可以紧接着充满缓冲区2了,即这种情况下,可以使块设备连续输入(但CPU会存在等待,因为处理更快)
    • 如果C+M>T:说明CPU还没从缓冲区1取出+处理完,缓冲区2的数据就已经充满了,那么CPU处理完1之后就可以紧接着取缓冲区2并处理了,即这种情况下,可以使CPU不必等待设备输入(但设备输入会等待)
  5. 循环缓冲区/环形缓冲区:
    • 适用场景:当输入输出速度基本匹配时,双缓冲区能获得较好效果,可使生产者和消费者基本上实现并行操作;但若两者速度相差较远,则双缓冲区的效果不会太理想,不过可以随着缓冲区数量的增加有所改善,因此引入了多缓冲机制,可将多个缓冲区组成环形缓冲的形式
    • 组成:
      • 多个缓冲区:环形缓冲区中包含多个缓冲区,各缓冲区的大小相同。作为输入的多缓冲区可分为三种类型:1)用于装输入数据的空缓冲区R;2)已装满数据的缓冲区G;3)计算进程正在使用的现行工作缓冲区C
      • 多个指针:作为输入的缓冲区可设置3个指针:1)用于指示计算进程下次可用缓冲区G的指针Nextg;2)用于指示输入进程下次可用空缓冲区R的指针Nexti;用于指示计算进程正在使用的缓冲区C的指针Current
        请添加图片描述
    • 环形缓冲区的使用:计算进程和输入进程可利用这两个过程来使用环形缓冲区:1)Getbuf过程(用于计算进程使用缓冲区中的数据);2)Releasebuf过程(计算进程把C缓冲区中的数据提取完毕时就调用Releasebuf过程将缓冲区C释放,改为空缓冲区R;输入进程把缓冲区装满时就调用Releasebuf过程将该缓冲区释放,改为可以缓冲区G)
    • 进程间的同步问题:
      • Nexti指针追上Nextg指针:意味着输入进程输入数据的速度大于计算进程处理数据的速度,已把全部可用的空缓冲区装满,再无缓冲区可用。此时,输入进程应阻塞,直到计算进程把某个缓冲区中的数据全部提取完,使之成为空缓冲区R,并调用Releasebuf过程将其释放后,才可将输入进程唤醒。这种情况称为“系统受计算限制”
      • Nextg指针追上Nexti指针:意味着输入数据的速度小于计算进程处理数据的速度,使装有输入数据的缓冲区都被抽空,再无有数据的缓冲区供计算进程提取数据。这时,计算进程只能阻塞,直至输入进程又装满某个缓冲区,并调用Releasebuf过程将它释放后,才可将计算进程唤醒。这种情况称为“系统受I/O限制”
  6. 缓冲池
    • 适用场景:前面的缓冲区属于专用缓冲,当系统较大时应该有许多循环缓冲,这会消耗大量内存空间,且缓冲区利用率不高。为提高缓冲区的利用率,引入既可用于输入又可用于输出的(公用)缓冲池,该池中设置了多个可供若干进程共享的缓冲区。
    • 缓冲区和缓冲池的区别:缓冲区仅是一组内存块的链表;缓冲池则是包含了一个用于管理自身的数据结构和一组操作函数的管理机制,用于管理多个缓冲区
    • 缓冲池的组成:
      • 三个队列
        • 空白缓冲队列
        • 输入队列:即由装满输入数据的缓冲区所链成的队列
        • 输出队列:即由装满输出数据的缓冲区所链成的队列
      • 四种工作缓冲区:
        • 用于收容输入数据的工作缓冲区
        • 用于提取输入数据的工作缓冲区
        • 用于收容输出数据的工作缓冲区
        • 用于提取输出数据的工作缓冲区
    • Getbuf和Putbuf过程:就是个用信号量实现进程同步互斥的伪代码,见汤书P237
    • 缓冲池的工作方式
      • 收容输入
      • 提取输入
      • 收容输出
      • 提取输出

dd

dd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值