如何理解操作系统的资源分配图呢?

资源分配图是死锁的一种准确而形象地描述,通过资源分配图,可以对当前系统资源分 配和申请情况一目了然,便于对死锁进行分析并采取对策。

一、资源分配图

资源分配图是一张有向图,一个系统资源分配图SRAG (System Resource Allocation Graph)可定义为一个二元组,即SRAG= (V, E),其中V是顶点的集合,而E是有向边的集合。顶点集合可分为两种部分:P= (P1,P2,…,Pn),是由系统内的所有进程组成的集合,每一个P代表一个进程;R = (r1,r2,…,rn),是系统内所有资源组成的集合, 每一个r代表一类资源。

在有向图中,用圆圈表示进程,用方框表示每类资源。每一类资源r,可能有多个实例, 可用方框中的圆点(实心圆点)表示各个资源实例。申请边为从进程到资源的有向边,表示进程申请一个资源,但当前该进程在等待该资源。分配边为从资源到进程的有向边,表示 有一个资源实例分配给进程。注意:一条申请边仅指向代表资源类的方框,表示申请时不 指定哪一个资源实例,而分配边必须由方框中的圆点引出,表明哪一个资源实例已被占有。

当进程P,请求资源类r的一个实例时,将一条请求边加人资源分配图,如果这个请求是 可以满足的,则该请求边立即转换成分配边;

当进程随后释放了某个资源时,则删除分配边。图5-10是一个资源分配图的示例。

图5-10给出的内容如下。

集合P,R,E分别为:

P = {P1,P2,P3} R = { r1, r2, r3, r4}

E = {< P1,r1>,< P2,r2>,< r1,P2>,< r2,P3>,< r3,P1 >,< r3,P2>}

资源实例个数为:

I r1|= 1,| r2 | =1,| r3 | =2,| r4 | =3

进程状态如下

(1)进程h已占用一个r3类资源,且正在等待获得一个r1类资源。

(2)进程P2已占用r1和r3类资源各一个且正在等待获得一个r2类资源。

(3)进程P3已占用一个r2类资源。

二、死锁定理

基于上述资源分配图的定义,可给出判定死锁的法则,又称为死锁定理。

(1)如果资源分配图中没有环路,则系统没有死锁。

(2)如果资源分配图中出现了环路,则系统中可能存在死锁。

①如果处于环路中的每个资源类中均只包含一个资源实例,则环路的存在即意味着死 锁的存在。此时,环路是死锁的充分必要条件。

②如果处于环路中的每个资源类中资源实例的个数不全为1,则环路的存在是产生死锁 的必要条件而不是充分条件。

以图5-11中的资源分配图为例,假设此时进程P3申请一个r3类资源,由于此时r2已没有可用资源,于是在图中加人一条新的申请边< P3, r3>,如图5-11所示。

此时,资源分配图中有两个环路:

P1—>r1—>P2—>r2—>P3—>r3—>P1

P2 —>r2 —>P3 —>r3 —>P2

显然,进程P1,P2,P3都陷入了死锁,因为进程P3正在等待进程P1或P2释放r3类资源中的—个实例,但P2又在等待P3释放r2, P1又在等待P2释放r1。

在图5-12所示的资源分配图中也存在一个环路:

P1—>r1一>P3一>r2一>P1

但系统没有产生死锁,因为当P4释放了一个r2类资源后,可将它分给P3或者P2释放 一个r1类资源后将它分给P1,这两种情况下环路都消失了,因而不会发生死锁。

由此可见,资源分配图中有环路,则可能发生死锁,也可能没有死锁。

三、资源分配图化简方法

可以利用资源分配图化简方法,来检测系统是否为死锁状态。

所谓化简是指若一个进程的所有资源请求均能被满足,可以设想该进程得到其所需的全部资源,最终完成任务,运行完毕,并释放所占有的全部资源。在这种情况下,则称资源分配图可以被该进程化简。假如一个资源分配图可被其所有进程化简,那么称该图是可化简的,否则称该图是不可化简的。

化简方法如下:

(1)在资源分配图中,找出一个既非等待又非孤立的进程结点Pi,由于Pi可获得它所需要的全部资源,且运行完后释放它所占有的全部资源,故可在资源分配图中消去Pi所有的申请边和分配边,使之成为既无申请边又无分配边的孤立结点。

(2)将Pi所释放的资源分配给申请它们的进程,即在资源分配图中将这些进程对资源的申请边改为分配边。

(3)重复1)、2)两1步骤,直到找不到符合条件的进程结点。

经过化简后,若能消去资源分配图中的所有边,使所有进程都成为孤立结点,则该图是可完全化简的;否则为不可化简的。

对于较复杂的资源分配图,可能有多个既非等待、又非孤立的进程结点,不同的简化过程是否会得到不同的化简图呢?可以证明,所有的化简顺序将导致相同的不可简化图。同样可以证 明,系统处于死锁状态的充分条件是,当且仅当该系统的资源分配图是不可完全简化的。

以图5-11和图5-12为例,说明资源分配图的化简过程以及得出的结论。在图5-11中, 找不到任何一个既非等待、又非孤立的进程结点,所以该资源分配图是不可化简的,根据上述介绍,该系统发生了死锁。在图5-12中,首先找到既非等待、又非孤立的P4结点,消去其分配边,得到一个可用的资源r2,由于P3有一条对r2的申请边,可将该资源分配给P2, 即将P2的申请边改为分配边。在得到的新的资源分配图中,可以找到既非等待、又非孤立的进程结点P3,继续将相应的分配边消去,并将P1对r1的申请边改为分配边;……最终资 源分配图中的所有进程结点都变成孤立结点,资源分配图是可化简的,所以可以得出结论, 该系统没有发生死锁。在图5-11中,可以先挑出进程结点P2,结论是一致的。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
操作系统中,通常使用多种数据结构来管理和分配资源,其中最常用的包括链表、队列、栈、堆等。下面是一个简单的 C 语言示例,演示如何按序分配操作系统资源: ```c #include <stdio.h> #include <stdlib.h> // 定义一个链表节点结构体 struct Node { int data; // 数据 struct Node* next; // 指向下一个节点的指针 }; // 定义一个链表结构体 struct List { struct Node* head; // 指向链表头节点的指针 }; // 初始化链表 void initList(List* list) { list->head = NULL; } // 在链表尾部插入节点 void insertNode(List* list, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); // 创建一个新的节点 newNode->data = data; newNode->next = NULL; if (list->head == NULL) { // 如果链表为空,则将新节点作为头节点 list->head = newNode; } else { Node* cur = list->head; while (cur->next != NULL) { // 找到链表尾部 cur = cur->next; } cur->next = newNode; // 将新节点插入到链表尾部 } } // 按序分配资源 int allocate(List* list) { if (list->head == NULL) { // 如果链表为空,返回-1表示分配失败 return -1; } else { Node* cur = list->head; int data = cur->data; // 取出链表头节点的数据 list->head = cur->next; // 将头节点指向下一个节点 free(cur); // 释放原头节点的内存空间 return data; // 返回分配的资源 } } int main() { List list; initList(&list); insertNode(&list, 10); insertNode(&list, 20); insertNode(&list, 30); int res1 = allocate(&list); int res2 = allocate(&list); int res3 = allocate(&list); int res4 = allocate(&list); printf("%d %d %d %d\n", res1, res2, res3, res4); // 输出:10 20 30 -1 return 0; } ``` 在上面的代码中,`struct Node` 表示链表中的一个节点,包含一个 `data` 数据域和一个 `next` 指针域,`struct List` 则表示整个链表,包含一个 `head` 指针,指向链表的头节点。`initList()` 函数用于初始化链表,`insertNode()` 函数用于在链表尾部插入新的节点,`allocate()` 函数用于按序分配资源,如果链表为空,则返回 `-1` 表示分配失败。 在 `main()` 函数中,我们首先创建一个空的链表,然后依次插入三个节点,分别存储数值为 `10`、`20` 和 `30` 的资源。接着,我们依次调用 `allocate()` 函数,尝试按序分配这三个资源,最后再尝试分配一个不存在的资源,输出结果为 `10 20 30 -1`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值