zoukankan      html  css  js  c++  java
  • 操作系统-设备的分配与回收

    设备的分配与回收

    设备分配时应考虑的因素

    1. 设备的固有属性
    2. 设备的分配算法
    3. 设备分配中的安全性

    设备的固有属性可分为三种:独占式设备、共享式设备、虚拟设备。
    独占式设备:一个时间段只能分配给一个进程
    共享式设备:可同时分配给多个进程使用,各个进程往往是宏观上同时共享使用设备,微观上交替使用。
    虚拟设备:采用假脱机技术将独占式设备改造成虚拟共享设备,可同时分配给多个进程使用。

    设备分配算法:

    先来先服务算法、短作业优先算法,优先级高优先算法等。

    从进程运行的安全性上考虑,设备分配有两种方式:

    • 安全分配方式:为进程分配一个设备后就将进程阻塞,本次IO完成后才将这个进程唤醒。这种方式是安全的破坏了“请求和保持条件”,不会发生死锁。但是对于进程来说,CPU和IO设备只能串行工作。

    • 不安全分配方式:进程发出IO请求后,系统为其分配IO设备,进程可以继续执行,之后还可以发出新的IO请求。只有某个IO请求得不到满足的情况下才将进程阻塞。

    静态分配与动态分配

    静态分配:进程运行前,为其分配全部所需资源,运行结束后归还资源。
    动态分配:进程运行过程中,动态的申请设备资源。

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

    设备与控制器通道之间的关系。
    一个通道可以有多个控制器,一个控制器又能控制多台设备。所以他们三者之间是一对多的关系,也就可以用树状结构来描述。
    在这里插入图片描述
    系统会为每个设备配置一个设备控制表(DCT),用来记录设备情况。
    这个设备控制表中包含有一下字段:设备类型(扫描仪/打印机/键盘),设备标识符(系统中每个设备的唯一ID),设备状态,指向控制表的指针(因为每个设备都有对应的控制器控制,所以这个指针就是用来指向控制它的控制器),重复执行次数或时间(当IO操作多次仍然不成功,才认为此次IO失败),设备队列的队首指针(这个指针指向一个队列,这个队列里面是PCB,这些PCB是正在等待该设备的)

    控制器控制表(COCT)
    每个设备控制器都会对应一张COCT。
    控制器控制表中的属性有:控制器标识符(各个控制器的唯一ID),控制器状态(忙碌,空闲,故障),指向通道的指针(每个控制器都有对应的通道,该指针用来找到对应的通道),控制器队列的队首指针,控制器队列的队尾指针(指向正在等待该控制器的阻塞队列(由PCB组成的队列))

    通道控制表(CHCT)
    每个通道都会对应一张CHCT。操作系统根据CHCT信息对通道进行操作和管理。
    通道控制表中含有的属性:

    • 通道标识符:各个通道的唯一ID
    • 通道状态
    • 与通道连接的控制器表首地址(根据该指针找到该通道管理的所有控制器相关信息)
    • 通道队列队首指针,通道队列队尾指针(指向正在等待该通道的进程队列(有进程控制块组成))

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

    在这里插入图片描述

    设备分配的步骤

    1. 按照进程请求的物理设备名查找SDT
    2. 根据系统设备表找到DCT(设备控制表),若设备忙碌则将进程挂到设备等待队列中,不忙碌则将设备分配给进程。
    3. 根据设备控制表找到COCT(控制器控制表),若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
    4. 根据COCT找到CHCT(通道控制表),若通道忙碌则将PCB挂到通达等待队列中,不忙碌则将通道分配给进程。

    只有设备。控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可以启动IO设备进行数据传送

    缺点:

    1. 用户编程时必须使用物理设备名,底层细节对用户不透明,不方便编程

    2. 若换了一个物理设备,则程序无法执行

    3. 若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待

    设备分配的改进方式

    ①根据进程请求的逻辑设备名查找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型"
    ②查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。
    ③根据DCT找到COCT,若控制器忙碌,则将PCB挂到控制器等待队列中;不忙碌,则将控制器分配给进程。
    ④根据COCT找到CHCT,若通道忙碌,则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程

    用户编程时使用逻辑设备名申请设备,操作系统负责实现从逻辑设备名到物理设备名的映射。LUT(逻辑设备表)
    如果整个系统只有一张LUT:各个用户所用的逻辑设备名不能重复,如果每个用户一张LUT:各个用户的逻辑设备名可以重复。
    在这里插入图片描述

  • 相关阅读:
    git各种操作:基本操作 and 多人协作 and 冲突解决
    mini-ndn0.5.0 安装教程 (避免踩坑)
    ubuntu18.04 更换镜像源
    自定义日志轮转
    linux常用命令
    Thinkphp6 + uniapp框架,接口访问跨域问题
    机器学习-主成分分析PCA与奇异值分解SVD
    机器学习-数据预处理&特征工程
    机器学习-梯度提升树(xgboost)
    github打不开怎么办
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181375.html
Copyright © 2011-2022 走看看