资源分配图化简法

一 了解进程资源图


Markdown编辑器用的还不是太熟,表格中插入图片这事还没学会,纠结着在Word中总结了下,然后截个图放在下面供大家参考:

图和表示的内容


二 化简资源分配图


方法步骤

  • 第一步:先看系统还剩下多少资源没分配,再看有哪些进程是不阻塞(“不阻塞”即:系统有足够的空闲资源分配给它)的
  • 第二步:把不阻塞的进程的所有边都去掉,形成一个孤立的点,再把系统分配给这个进程的资源回收回来
  • 第三步:看剩下的进程有哪些是不阻塞的,然后又把它们逐个变成孤立的点。
  • 第四步:最后,所有的资源和进程都变成孤立的点。这样的图就叫做“可完全简化”

如果一个图可完全简化,则不会产生死锁;如果一个图不可完全简化(即:图中还有“边”存在),则会产生死锁。这就是“死锁定理”。 

实例

进程资源图

  • 第一步:先看R1资源,它有三个箭头是向外的,因此它一共给进程分配了3个资源,此时,R1没有空闲的资源剩余。
  • 第二步:再看R2资源,它有一个箭头是向外的,因此它一共给进程分配了1个资源,此时,R2还剩余一个空闲的资源没分配。
  • 第三步:看完资源,再来看进程,先看进程P2,它只申请一个R1资源,但此时R1资源已经用光了,所以,进程P2进入阻塞状态,因此,进程P2暂时不能化成孤立的点。
  • 第四步:再看进程P1,它只申请一个R2资源,此时,系统还剩余一个R2资源没分配,因此,可以满足P1的申请。这样,进程P1便得到了它的全部所需资源,所以它不会进入阻塞状态,可以一直运行,等它运行完后,我们再把它的所有的资源释放。相当于:可以把P1的所有的边去掉,变成一个孤立的点,如下图所示:

进程资源图2

  • 第五步:进程P1运行完后,释放其所占有的资源(2个R1资源和1个R2资源),系统回收这些资源后,空闲的资源便变成2个R1资源和1个R2资源,由于进程P2一直在申请一个R1资源,所以此时,系统能满足它的申请。这样,进程P2便得到了它的全部所需资源,所以它不会进入阻塞状态,可以一直运行,等它运行完后,我们再把它的所有的资源释放。相当于:可以把P2的所有的边都去掉,化成一个孤立的点,变成下图: 
    进程资源图3

由于这个资源分配图可完全简化,因此,不会产生死锁。 
而如果资源分配图中的点,最终不能够化成孤立的点,则进程资源图不能够完全简化,从而会发生死锁。

  • 144
    点赞
  • 213
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
Python可以通过以下步骤使用卡诺化简: 1. 创建一个truth table,表示布尔函数的输入和输出。 2. 将truth table按照规则(如最短项的贪心)分组,并将分组的结果标记在卡诺上。 3. 用卡诺的分组结果来确定布尔函数的最小项(min terms)和不可简化项(don't care terms)。 4. 使用最小项和不可简化项生成简化后的布尔函数。 以下是一个使用Python代码实现卡诺化简的例子: ``` from itertools import combinations # create a truth table (inputs -> output) truth_table = {'000': 0, '001': 0, '010': 0, '011': 1, '100': 1, '101': 1, '110': 0, '111': 0} def generate_groups(minterms, num_vars): groups = [[] for i in range(num_vars + 1)] for minterm in minterms: num_ones = bin(minterm).count('1') groups[num_ones].append(minterm) return groups def combine_groups(groups): new_groups = [] for i, group in enumerate(groups): for j, other_group in enumerate(groups): if i != j: for pair in combinations(group, 2): if pair[0] ^ pair[1] in other_group: new_group = set(group + other_group) new_group.remove(pair[0]) new_group.remove(pair[1]) new_groups.append(sorted(list(new_group))) return new_groups def get_min_terms(group): min_terms = [] for minterm in group: bin_num = bin(minterm)[2:] bin_num = '0' * (3 - len(bin_num)) + bin_num min_terms.append(bin_num) return min_terms def simplify_boolean(minterms, num_vars): groups = generate_groups(minterms, num_vars) while True: new_groups = combine_groups(groups) if len(new_groups) == 0: break groups = groups + new_groups min_terms = [] for group in groups: min_terms += get_min_terms(group) return min_terms print(simplify_boolean([3, 4, 5, 6], 3)) # Output: ['011', '101'] ``` 在这个例子中,我们使用了一个truth table来表示一个布尔函数,并创建了一个函数`simplify_boolean`来实现化简布尔函数的操作。该函数接受一个包含minterms的列表和变量数量,返回最小项的字符串表示形式。我们可以看到,该函数使用卡诺来实现化简操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值