九、设备的分配与回收

news2024/12/23 22:34:33

1.设备分配时应考虑的因素

①设备的固有属性

设备的固有属性可分为三种:独占设备、共享设备、虚拟设备。

独占设备

一个时段只能分配给一个进程(如打印机)

共享设备

可同时分配给多个进程使用(如磁盘),各进程往往是宏观上同时共享使用设备而微观上交替使用。

虚拟设备

采用 SPOOLing技术将独占设备改造成虚拟的共享设备,可同时分配给多个进程使用(如采用 SPOOLing 技术实现的共享打印机)

②设备分配算法

设备的分配算法:

先来先服务

优先级高者优先

短任务优先

……

③设备分配中的安全性

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

安全分配方式:

为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒。(eg:考虑进程请求打印机打印输出的例子)

一个时段内每个进程只能使用一个设备。

优点:破坏了“请求和保持”条件,不会死锁;

缺点:对于一个进程来说,CPU和I/O设备只能串行工作

不安全分配方式:

进程发出I/O请求后,系统为其分配I/O设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞。

一个进程可以同时使用多个设备

优点:进程的计算任务和I0任务可以并行处理,使进程迅速推进

缺点:有可能发生死锁(死锁避免、死锁的检测和解除)

2.静态分配与动态分配

静态分配:

进程运行前为其分配全部所需资源,运行结束后归还资源

破坏了“请求和保持”条件,不会发生死锁

动态分配:

进程运行过程中动态申请设备资源

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

①设备控制表(DCT Device Control Table)

系统为每个设备配置一张DCT,用于记录设备情况

设备控制表(DCT)

设备类型

如:打印机/扫描仪/键盘

设备标识符

即物理设备名,系统中的每个设备的物理设备名唯一

设备状态

忙碌/空闲/故障..

指向控制器表的指针

每个设备由一个控制器控制,该指针可找到相应控制器的信息

重复执行次数或时间

当重复执行多次1/0操作后仍不成功,才认为此次I/O失败

设备队列的队首指针

指向正在等待该设备的进程队列(由进程PCB组成队列)

注:

“进程管理”章节中曾经提到过“系统会根据阻塞原因不同,将进程PCB挂到不同的阻塞队列中”,说的就是DCT中的设备队列的队尾。

②控制器控制表(COCT )

每个设备控制器都会对应一张COCT。操作系统根据COCT的信息对控制器进行操作和管理。

控制器控制表(COCT)

控制器标识符

各个控制器的唯一ID

控制器状态

忙碌/空闲/故障.

指向通道表的指针

每个控制器由一个通道控制,该指针可找到相应通道的信息

控制器队列的队首指针

控制器队列的队尾指针

指向正在等待该控制器的进程队列(由进程PCB组成队列)

③通道控制表(CHCT)

每个通道都会对应一张CHCT。操作系统根据CHCT的信息对通道进行操作和管理。

通道控制表(CHCT)

通道标识符

各个通道的唯一ID

通道状态

忙碌/空闲/故障..

与通道连接的控制器表首址

可通过该指针找到该通道管理的所有控制器相关信息(COCT)

通道队列的队首指针

通道队列的队尾指针

指向正在等待该通道的进程队列(由进程PCB组成队列)

④系统设备表(SDT)

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

4.设备分配的步骤

①根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)②根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。

③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配

给进程。

④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。

注:只有设备控制器通道三者都分配成功时,这次设备分配才算成功,之后便可启动I/O设备进行数据传送

缺点:

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

②若换了一个物理设备,则程序无法运行

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

5.设备分配步骤的政进方法

改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名

①逻辑设备表(LUT)

逻辑设备表(LUT)建立了逻辑设备名与物理设备名之间的映射关系。

某用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据用户进程指定的设备类型(逻辑设备名)查找系统设备表,找到一个空闲设备分配给进程,并在LUT中增加相应表项

如果之后用户进程再次通过相同的逻辑设备名请求使用设备则操作系统通过LUT表即可知道用户进程实际要使用的是哪个物理设备了,并且也能知道该设备的驱动程序入口地址。

逻辑设备表的设置问题:

整个系统只有一张LUT:

各用户所用的逻辑设备名不允许重复,适用于单用户操作系统

每个用户一张LUT:

不同用户的逻辑设备名可重复,适用于多用户操作系统

②步骤

①根据进程请求的逻辑设备名査找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型”

②查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项。

③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。

④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Orange Pi 5嵌入式应用编程】-用户空间UART通信

用户空间UART通信 文章目录 用户空间UART通信1、理解UART通信1.1 什么是UART通信?1.2 UART如何工作?1.3 UART传输步骤1.4 UART的优缺点2、嵌入式Linux中的UART3、Orange Pi 5中UART完整示例3.1 UART操作函数定义3.2 UART定义函数实现1、理解UART通信 UART是Universal Asynch…

松山湖全球首秀:传祺华为概念车发布

9月24日晚,传祺与华为联合举办的创「新」计划成果分享会暨全新概念车品鉴会,在华为东莞松山湖基地圆满落幕。 作为本次活动的焦点,传祺与华为双方联手打造的首款概念车「1 Concept」,也在会场正式登场亮相,这也标志着传…

动态分配内存

目录 前言 一.malloc,free函数 1.malloc,free函数原型 2.使用方法 3.具体实例 4.注意事项 二.calloc函数 1.calloc函数原型 2.主要特点 3.使用案例 三.realloc函数 1.realloc函数原型 2.使用案例 3.注意事项 前言 动态内存是指在程序运行时,按需分配和…

Java网络通信—TCP

1.客户端 2.服务端

OpenGL ES 纹理(7)

OpenGL ES 纹理(7) 简述 通过前面几章的学习,我们已经可以绘制渲染我们想要的逻辑图形了,但是如果我们想要渲染一张本地图片,这就需要纹理了。 纹理其实是一个可以用于采样的数据集,比较典型的就是图片了,我们知道我…

【ios】---swift开发从入门到放弃

swift开发从入门到放弃 环境swift入门变量与常量类型安全和类型推断print函数字符串整数双精度布尔运算符数组集合set字典区间元祖可选类型循环语句条件语句switch语句函数枚举类型闭包数组方法结构体 环境 1.在App Store下载Xcode 2.新建项目(可以先使用这个&…

AKShare-股票数据-相关股票

AKShare-股票数据-相关股票 数据科学实战 数据科学实战 2024年10月01日 13:53 作者寄语 本次更新股票数据-相关股票接口。主要修复该接口,目前通过该接口可以获取 时间,股票代码,相关股票代码,涨跌幅 等字段的数据。 欢迎加入专…

Java之方法的使用

修饰符 返回值 方法名称(形式参数){ } 当无参数的时候形式参数中什么都不写。 列如求两个数相加 修饰符可有可无。 方法重载: 1.方法名相同 2.参数列表不同 3。返回值不影响重载

STL--string类

我们从这篇文章之后就正式开始学习STL的string,字面看起来是不是像C语言里面的字符串之类的处理方法,是的,C里面也是对字符串的一些处理函数,但是C有很多这样的函数,给大家推荐一个网站 ,这个网站是C的官网…

Python | Leetcode Python题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:n len(nums)for num in nums:x (num - 1) % nnums[x] nret [i 1 for i, num in enumerate(nums) if num < n]return ret

Verilog基础:$display系统函数和C语言中的库函数printf的区别

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 Verilog中的$display系统函数和C语言中的库函数printf都是用于输出信息&#xff0c;但它们的用法存在一定差别&#xff0c;本文将简要描述。 $display系统函数的B…

Javaweb商城项目

smbms 视频教程&#xff1a;javaweb-30&#xff1a;smbms项目搭建_哔哩哔哩_bilibili 一.项目分析 1.项目结构 2.数据库表 CREATE DATABASE smbms;USE smbms;DROP TABLE IF EXISTS smbms_address;CREATE TABLE smbms_address (id bigint(20) NOT NULL AUTO_INCREMENT CO…

计算机毕业设计 家校互联管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

2024年录屏软件排行榜:班迪录屏等四款软件实测!

不论是学习、娱乐还是工作&#xff0c;都有可能需要用到屏幕录制功能。在这篇文章中&#xff0c;我们将从不同的使用场景出发&#xff0c;为大家推荐几款实用的录屏工具——福昕录屏大师、转转大师录屏、爱拍录屏以及班迪录屏。 Foxit REC 直达链接&#xff08;复制到浏览器打…

Flexible组件的用法

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了扩展内容相关的知识,本章回中将介绍Flexible组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在前面章回中介绍了扩展列表相关的内容,当页面中其它组件和扩展列表一起使用时,扩展列表有可能会…

SpringBoot——基础配置

但是还需要删除pom.xml中的标签——模板的文件也同样操作 banner的选项——关闭 控制台 日志 banner图片的位置——还会分辨颜色 在 Java 的日志框架&#xff08;如 Logback、Log4j2 等&#xff09;中&#xff0c;logging.level.root主要用于设置根日志记录器的日志级别…

【Redis】如何在 Ubuntu 上安装 Redis 5

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容主要介绍如何在 Ubuntu 上安装 Redis5 一些碎碎念&#xff1a; 本来这期内容介绍如何在 Centos 安装 Redis …

常用的Java安全框架

Spring Security&#xff1a; 就像Java安全领域的“瑞士军刀”&#xff0c;功能全面且强大。 支持认证、授权、加密、会话管理等安全功能。 与Spring框架无缝集成&#xff0c;使用起来特别方便。 社区活跃&#xff0c;文档丰富&#xff0c;遇到问题容易找到解决方案。 Apach…

SigmaStudio控件Cross Mixer\Signal Merger算法效果分析

衰减与叠加混音算法验证分析一 CH2:输入源为-20dB正弦波1khz CH1叠加混音&#xff1a;参考混音算法https://blog.csdn.net/weixin_48408892/article/details/129878036?spm1001.2014.3001.5502 Ch0衰减混音&#xff1a;外部多个输入源做混音时&#xff0c;建议参考该算法控件&…

网络通信——OSPF协议(基础篇)

这里基础是因为没有讲解OSPF中的具体算法过程&#xff0c;以及其中很多小细节。后续会更新。 目录 一.OSPF的基础信息 二.认识OSPF中的Router ID 三.OSPF中的三张表 四.OSPF中的度量方法&#xff08;计算开销值&#xff09; 五. OSPF选举DR和BDR&#xff08;就是这个区域…