资源分配图 (RAG) 深度解析

资源分配图(RAG)是一种可视化工具,帮助我们直观地理解操作系统中资源是如何分配的。不再仅仅依赖枯燥的表格来展示哪些资源已被分配、被请求或可用,RAG 通过节点和边清晰地描绘了进程与其所需资源之间的关系。

  • RAG 清晰地展示了哪些资源已被分配,哪些正在被进程请求。
  • 相比于表格,它能帮助我们更直观地观察死锁。
  • RAG 展示了资源的分配和请求是如何影响整个系统的。
  • 进程用圆形表示,资源用方形表示,边则代表分配或请求关系。

RAG 中的顶点类型

在资源分配图中,主要有两种类型的顶点:

1. 进程顶点 (Process Vertex): 每一个进程都会被表示为一个进程顶点。通常情况下,我们使用圆形来代表进程。
2. 资源顶点 (Resource Vertex): 每一个资源都会被表示为一个资源顶点。它又分为两种类型:

  • 单实例资源 (Single Instance Resource): 只有一个副本的资源。在 RAG 中,它被显示为单个节点,且同一时间只能有一个进程使用它。
  • 多实例资源 (Multi Instance Resource): 拥有多个副本的资源。在 RAG 中,它被显示为包含多个实例的节点,因此多个进程可以同时使用不同的副本。

!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251024190545453348/frame3197.webp">frame3197 顶点类型

RAG 中的边类型

RAG 中主要存在两种类型的边:

  • 分配边 (Assign Edge): 如果一个资源已经被分配给了一个进程,那么这就是一条分配边。这通过一条从资源顶点指向进程顶点的有向边来表示。
  • 请求边 (Request Edge): 请求边表示一个进程当前正在请求某个资源。这通过一条从进程顶点指向资源顶点的有向边来表示。

!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251024190617039067/frame3196.webp">frame3196 边的类型

简单来说,如果一个进程正在使用某个资源,我们就画一个从资源节点指向进程节点的箭头。如果一个进程正在请求某个资源,我们就画一个从进程节点指向资源节点的箭头。

示例 1: (单实例 RAG)

!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251024190655853200/frame3195.webp">frame3195 存在死锁的单实例情况

如果资源分配图中存在一个环路,且该环路中的每个资源都只提供一个实例,那么这些进程将陷入死锁。例如,如果进程 P1 持有资源 R1,进程 P2 持有资源 R2,同时进程 P1 正在等待 R2,而进程 P2 正在等待 R1,那么进程 P1 和进程 P2 就会处于死锁状态。

!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251024190729901345/frame3194.webp">frame3194 不存在死锁的单实例情况

我们来看另一个例子,展示了进程 P1 和 P2 分别获取了资源 R1 和 R2,而进程 P3 正在等待获取这两个资源。在这个例子中,并没有发生死锁,因为不存在循环依赖。所以,对于单实例资源类型,环路是死锁的充分条件

示例 2: (多实例 RAG)

!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251024190829727509/frame3193.webp">frame3193 不存在死锁的多实例情况

从上面的例子中,我们无法直接断言该 RAG 是处于安全状态还是不安全状态。为了判断这个 RAG 的状态,让我们来构建分配矩阵和请求矩阵。

!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251025102157107666/frame3204.webp">frame3204 资源分配表

  • 进程总数为三个:P1、P2 和 P3,资源总数为两个:R1 和 R2。
  • 分配矩阵: 构建分配矩阵时,只需查看各个资源分配给了哪个进程。

R1 分配给了 P1,因此在分配矩阵中写入 1;同理,R2 分配给了 P2 和 P3,其余位置则写入 0。

  • 请求矩阵: 为了找出请求矩阵,我们需要查看每个进程发出的边。

P1 正在请求资源 R2,所以在矩阵中写入 1;同理,P2 正在请求 R1,其余位置写入 0。

此时,可用资源为 = (0, 0)。

  • 检查死锁 (是否安全)

!Checking deadlock

  • 结果表明,该 RAG 中没有死锁。尽管图中存在环路,但依然没有发生死锁。因此,在多实例资源的情况下,环路并不是死锁的充分条件

!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251024190851928157/frame3192.webp">frame3192 存在死锁的多实例情况

上面的例子与前一个类似,除了进程 P3 也在请求资源 R1。所以表格变成了下图所示的样子。

!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251024190939503919/frame3191.webp">frame3191 资源分配表

这样一来,可用的资源…

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/21533.html
点赞
0.00 平均评分 (0% 分数) - 0