操作系统实验11:死锁检测算法模拟实现

1. 实验目的

理解并掌握死锁检测算法的基本设计思想、关键数据结构和算法流程。

2. 实验内容

利用 C 语言设计与实现死锁检测算法,构建计算机系统的进程-资源场景随机发生机制,并对自己的死锁检测算法实现方案加以测试验证。

3. 实验要求

(1)基于C语言的死锁检测算法的设计与实现;
(2)计算机系统的进程-资源场景随机发生机制的构建(随机生成系统各类资源配备数量明细、一组并发进程及当前各类资源占有/需求数量);
(3)算法原型应能正确判断对应进程-资源场景是否陷入了死锁状态;
(4)针对死锁检测算法原型开展基于进程-资源场景的完备的测试验证。

4. 实验思路

按照实验要求,系统的资源总数是随机生成的,这样更好的使用一个进程组测试样例来判断有无死锁情况出现。
按照课堂上的ppt讲解内容,首先设置Finish、Work、Max、Allocation、Need、Available等数组,进行线程资源的模拟。分为init函数、distribute函数、show函数,进行主要的功能。
其中init函数,主要是从txt文件中按既定的格式,读取线程的个数、各个线程所需的资源和已经分配的资源数。并随件生成系统资源总数。
Distribute函数用来进行判断有无出现死锁,有则报警,无即寻找安全序列。还设置了几个函数用以辅助distribute函数。是的结构更加分明。
Show函数在有安全序列的同时显示出安全序列或死锁报警。

5. 死锁检测算法模拟实现程序实现

5.1. 相关环境介绍

操作系统:window 10 21H2
开发环境:Clion-2022.2.1-Windows
编译器:mwing-10.0

5.2. Test

初始数据
在这里插入图片描述

图表 5 1 test1初始数据

结果验证
在这里插入图片描述

图表 5 2 test测试结果
Init函数,每次生成不同的系统总资源数,首先确定可以满足系统中已经分配出去的资源,这样保证系统死锁是在运行过程中发生,而不是一开始。
这样只要可以找到安全序列就打印出来,并且继续运行;最后只要发现死锁,程序停止,输出死锁之前已经执行完的程序。

6. 实验汇总

6.1. 实验要求完成情况

成功完成实验要求。

6.2. 技术难点及解决方案

一开始,发现程序会出现,卡住不动的情况。最后定位到是资源初始化的位置,发现是有的数组没有重新初始化,出现了数据叠加,遂使用memset函数重置。

6.3. 实验感想和经验总结

我们可以把很多初始化的数据或者配置信息,存在文件中,进行文件的读写操作,这样保证了输入的格式和效率。
发现cout和cerr的缓冲区可能不是同一个,这样在不刷新缓冲区的情况下,会出现cout和cerr内容错位的情况,这也是以前没有遇到的情况。

6.4. 参考链接

  • ZGSOS操作系统实验指导《实验课题11_死锁检测算法模拟实现》

7. 代码附录

8.	#include <iostream>  
9.	#include <vector>  
10.	#include <fstream>  
11.	#include <iostream>  
12.	#include <string>  
13.	#include <string.h>  
14.	  
15.	  
16.	using namespace std;  
17.	#define THREAD 5  
18.	#define RESOURCE 3  
19.	  
20.	int Finish[THREAD] = {
   0};  
21.	int Work[RESOURCE] = {
   0};  
22.	int Max[THREAD][RESOURCE] = {
   0};  
23.	int Allocation[THREAD][RESOURCE] = {
   0};  
24.	int Need[THREAD][RESOURCE] = {
   0};  
25.	int Available[RESOURCE] = {
   0};  
26.	int n; // num for thread  
27.	int m; // num for classification of resource  
28.	ifstream fin;  
29.	  
30.	int Security[THREAD] = {
   -1};  
31.	int count = 0; // the order of security line  
32.	int tem_allocation[RESOURCE] = {
   0};  
33.	  
34.	  
35.	int init(string &test_file_path= (string &) "../test1"){
     
36.	  
37.	    fin.open(test_file_path);  
38.	    if(!fin){
     
39.	        cerr << "file " << test_file_path << " open error!\n";  
40.	        return -1;  
41.	    }  
42.	  
43.	    fin >> n >> m;  
44.	  
45.	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值