资源管理概述
资源的静态(作业)&动态分配(进程)
虚拟资源(通过抽象与管理,把物理资源"虚拟化"后呈现给用户或进程使用的逻辑资源)
&物理资源(计算机硬件中真实存在的资源)
| 虚拟资源 | 对应的物理资源 | 实现机制 |
|---|
|-------|-----|-------------------|
| 虚拟处理器 | CPU | 调度算法(时间片轮转、优先级调度) |
|------|---------|---------------------------|
| 虚拟内存 | 主存 + 磁盘 | 地址映射、分页(Page)、分段(Segment) |
|------|-----|-------------|
| 虚拟文件 | 磁盘块 | 文件系统抽象、缓存机制 |
|------|-----------|-------------------|
| 虚拟设备 | 各种 I/O 设备 | 设备驱动程序、缓冲区管理、系统调用 |
资源分配的机构
资源描述器
定义:描述各类资源的最少分配单位的数据结构
**资源信息块:**描述某类资源的请求者、可用资源和资源分配程序等必要信息的数据结构
访问磁盘调度
组成:磁道、扇区、柱面(所有盘片上相同编号的磁道集合)、磁头
磁盘访问时间: 寻道时间 + 旋转延迟 + 传输时间
寻道时间:磁头移动到目标磁道所需时间
旋转延迟:磁头移动到目标磁道所需时间
传输时间:实际读/写数据的时间
其中,寻道时间的占比最大,因此调度算法的主要目的:
减少平均寻道时间。
常见磁盘调度算法:
- FCFS 按照请求到达的顺序服务,简单公平,但平均寻道时间长。
- SSTF 最短寻道时间优先:优先选择与当前磁头位置最近的请求。可能导致远处的请求长时间得不到响应
- SCAN 电梯调度算法 :磁头像电梯一样来回移动,按一个方向依次处理请求,走到尽头再反向。缺陷是较远一侧请求可能延迟。
- CSCAN 循环扫描算法:只向一个方向移动(如从小到大),到尽头后直接回到起点,不处理回程请求,使每个请求等待时间更均匀,缺点是会有回程空转。
- LOOK/CLOOK 类似 SCAN / CSCAN,但磁头不会到磁盘尽头,而是到最后一个请求的位置就折返
死锁
定义:多个并发进程中,自身持有 某个资源而又相互等待 对方的资源,造成这些进程都无法执行的情况
图解:
折线图:

进程------资源分配图:

注:p指向r表示进程p申请资源未得到处于等待,r指向p表示资源r已被进程p占用。图二表示死锁。
产生必要条件:
互斥、不剥夺(非抢占)、占用并等待(部分分配)、环路(循环等待)
解决办法:破坏四个必要条件
预防死锁:
- 静态分配策略 一次性为选中的作业分配一直使用的资源,直至该作业完毕。破环部分分配。缺陷是程序运行之前很难提出所有需要占用的设备,以及资源利用率下降
- 有序资源分配 对所有资源进行唯一编号,申请时按升序进行申请,破坏环路。
避免死锁:
- 银行家算法

当一个进程提出资源请求时:
-
系统先试分配给它;
-
然后检查系统是否处于"安全状态(Safe State)";
-
若安全,则正式分配;
-
若不安全,则拒绝请求,让进程等待。
银行家算法的数据结构:
1*m向量,available,各资源的使用情况,3个n*m矩阵(线程数*资源数)最大需求量 ,已分配给各进程的资源数 ,尚需的资源量
安全状态定义:
系统中存在一个进程序列P1,P2,...,Pn,
使得对于每个进程 Pi,它的需求都能被当前系统资源满足,则称系统处于安全状态。
若无此序列,系统处于不安全状态
不做最小需求优化!只要可以被分配就试探
算法流程:
安全性算法
银行家算法:
- 检查合法性 判断requset[i] <= need[i] && request[i] <= available[i]
- 检查资源可用性
- 试探分配 该项资源被占用后仍然可以找到安全序列
- 安全->正式分配;不安全->撤销试探,等待

死锁的检测与解除
通心面问题:5个人,5把叉,
解决办法:至多四个人吃;取叉子顺序(打破环路)等两把叉子,否则一个也不拿(破环部分分配)
例题:


v0:优先想到,一次性资源分配,船要过时AB同时p,车同理,缺点是并发度太低,因为AB利用率不高。
v1:利用弯道:提前得知弯道大小,B未升起时可以先到B,等待A放下。改进空间:同类进程不必互斥。
v1.1:给要过的船和车一个数量信号灯,当前有车/船在过时一直过