操作系统实验报告-死锁的检测与解除
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ work[0]+=allocation[i][0]; work[1]+=allocation[i][1]; work[2]+=allocation[i][2]; finish[i]=true; que[k]=i; k++; i=0;
} else
i++; } for(i=0;i<M;i++)
if(finish[i]==false) {
printf("%d ",allocation[0][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",need[0][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",available[j]); } printf("\n");
2) 最大需求矩阵 max 它是一个 n m 的矩阵,定义了系统中 n 个进 程中得每一个进程对 m 类资源的最大需求。
3) 可分配矩阵 allocation: 这也一个 n m 的矩阵,定义了系统 中每一类资源当前已分配给每一进程的资源数。
4) 需求矩阵 need: 这表示每一个进程尚需的各类资源数。 5) need[i][j]=max[i][j]-allocation[i][j]。
printf("%d ",need[3][j]); } printf("\n"); } /***************给某进程分配资源***************/ void change(int n) { int j; for(j=0;j<N;j++) {
available[j]=available[j]-request[j]; allocation[n][j]=allocation[n][j]+request[j]; need[n][j]=need[n][j]-request[j]; } } /***************找出占用资源最多的进程***************/ int findmany() { int i=0,j=0,k=0,l=0; i=allocation[0][0]+allocation[0][1]; i+=allocation[0][2]; j=allocation[1][0]+allocation[1][1]; j+=allocation[1][2];
work[0]=available[0]; work[1]=available[1];
work[2]=available[2]; i=n; while(i<M) {
if(finish[i]==false&&need[i][0]<=work[0]&&need[i][1]<=wo rk[1]&&need[i][2]<=work[2])
//各进程仍需要的资源情况
int request[3]={0,0,0};
//某进程
请求的资源情况
/***************输入初始的资源状况***************/ void input() {
int i=0,j=0; printf("\t\t\t\tA B C\n"); printf("请输入进程 0 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
for(j=0;j<3;j++) {
scanf("%d",&available[j]); }
for(i=0;i<4;i++) for(j=0;j<3;j++) { need[i][j]=max[i][j]-allocation[i][j]; }
printf("\n"); } /***************显示当前的资源状况***************/ void output() {
scanf("%d",&max[0][j]); } printf("\n"); printf("请输入进程 1 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
scanf("%d",&max[1][j]); } printf("\n"); printf("请输入进程 2 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
scanf("%d",&max[2][j]); } printf("\n"); printf("请输入进程 3 对 3 类资源的最大需求:");
for(j=0;j<3;j++) {
scanf("%d",&max[3][j]); } printf("\n"); printf("请输入进程 0 已分配的 3 类资源量:");
printf("%d ",need[1][j]); } printf("\n"); printf("进程 2:\t"); for(j=0;j<3;j++) {
printf("%d ",max[2][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",allocation[2][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("进程 1:\t"); for(j=0;j<3;j++) {
printf("%d ",max[1][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",allocation[1][j]); } printf("\t"); for(j=0;j<3;j++) {
变量说明:
可用资源向量 available[3]; 最大需求矩阵 max[4][3]; 可分配矩阵 allocation[4][3]; 需求矩阵 need[4][3]; 进程状态标识 finish[4];
流程图:
算法开始
输入各进程的最大需求资源、 已分配资源和可利用资源数
显示各进程的最大需求资源、 已分配资源和可利用资源数
// 各进程
可利用的资源情况
int
max[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
//各进程最大需求的资源情况
int
allocation[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
//各进程已经分配的资源情况
int
need[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
else return 3;
} else {
if(k>=l) return 2;
else return 3;
} } else {
if(j>=k) {
if(j>=l) return 1;
else return 3;
} else {
if(k>=l) return 2;
else return 3;
} } } /***************找出需要资源最少的进程***************/ int findfew() { int i=0,j=0,k=0,l=0; i=need[0][0]+need[0][1]; i+=need[0][2]; j=need[1][0]+need[1][1]; j+=need[1][2]; k=need[2][0]+need[2][1]; k+=need[2][2]; l=need[3][0]+need[3][1]; l+=need[3][2]; if(i<=j) {
选择进程并进行资源请求
请求是否合法
是
分配资源
是否死锁
是
解除占用资源最多的进程
否
否Байду номын сангаас
输出进程序列以及该 时刻的资源分配情况
算法结束
运行结果:
无死锁:
有死锁:
有连续死锁:
实验代码:
#include<stdio.h>
#define M 4 //进程数 #define N 3 //资源种类数
int available[3]={0,0,0};
k=allocation[2][0]+allocation[2][1]; k+=allocation[2][2]; l=allocation[3][0]+allocation[3][1]; l+=allocation[3][2]; if(i>=j) {
if(i>=k) {
if(i>=l) return 0;
设计思想:
该程序是在银行家算法的基础上添加了死锁的解除模块得来的, 死锁的解除采用的方法是:当系统发生死锁时,找到已分配资源最大 的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。
数据结构:
1) 可用资源向量 available: 这是一个含有 m 个元素的数组,其 中的每一个元素代表一类可利用资源数目。
if(i<=k) {
if(i<=l) return 0;
else return 3;
} else {
if(k<=l) return 2;
else return 3;
} }
else {
if(j<=k) {
if(j<=l) return 1;
else return 3;
} else {
if(k<=l) return 2;
for(j=0;j<3;j++) {
scanf("%d",&allocation[2][j]); } printf("\n"); printf("请输入进程 3 已分配的 3 类资源量:");
for(j=0;j<3;j++) {
scanf("%d",&allocation[3][j]); } printf("\n"); printf("请输入可利用的 3 类资源量:");
for(j=0;j<3;j++) {
scanf("%d",&allocation[0][j]); } printf("\n"); printf("请输入进程 1 已分配的 3 类资源量:");
for(j=0;j<3;j++) {
scanf("%d",&allocation[1][j]); } printf("\n"); printf("请输入进程 2 已分配的 3 类资源量:");
int i=0,j=0; printf("该时刻 3 类资源的分配情况如下:\n"); printf("\tMAX\t\tALOCAT\t\tNEED\t\tAVAILABLE\n"); printf("进程 0:\t"); for(j=0;j<3;j++) {
printf("%d ",max[0][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("存在死锁!\n"); return 1;
break; } break; } printf("\n"); printf("检测结果:不存在死锁!\n"); printf("安全序列为:"); for(i=0;i<M;i++) printf("%d\t",que[i]); printf("\n"); return 0; } /***************主函数***************/ void main() {
else return 3;
} } } /***************安全性检测***************/ int checksafe(int n) { int work[3],finish[M],que[M]; int i=0,k=0; for(i=0;i<M;i++)
finish[i]=false; for(;;) {
操作系统实验报告
实验题目:死锁的检测与解除 学生姓名:田凯飞 学生学号:1107300215 学生班级:计科 111 指导老师:霍林
实验题目:
死锁的检测与解除。
实验目的:
在实验一中我们可以通过银行家算法和安全性检测来对系统对 进程分配资源时进行安全性检测,这是避免系统发生死锁的有效方 法,但是假如系统真的发生死锁的时候,系统也必须对此采取有效的 措施,通过该实验我们可以深刻的认识系统对死锁的检测与解除的方 法。
printf("%d ",need[2][j]); } printf("\n"); printf("进程 3:\t"); for(j=0;j<3;j++)
{ printf("%d ",max[3][j]);
} printf("\t"); for(j=0;j<3;j++) {
printf("%d ",allocation[3][j]); } printf("\t"); for(j=0;j<3;j++) {
} else
i++; } for(i=0;i<M;i++)
if(finish[i]==false) {
printf("%d ",allocation[0][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",need[0][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",available[j]); } printf("\n");
2) 最大需求矩阵 max 它是一个 n m 的矩阵,定义了系统中 n 个进 程中得每一个进程对 m 类资源的最大需求。
3) 可分配矩阵 allocation: 这也一个 n m 的矩阵,定义了系统 中每一类资源当前已分配给每一进程的资源数。
4) 需求矩阵 need: 这表示每一个进程尚需的各类资源数。 5) need[i][j]=max[i][j]-allocation[i][j]。
printf("%d ",need[3][j]); } printf("\n"); } /***************给某进程分配资源***************/ void change(int n) { int j; for(j=0;j<N;j++) {
available[j]=available[j]-request[j]; allocation[n][j]=allocation[n][j]+request[j]; need[n][j]=need[n][j]-request[j]; } } /***************找出占用资源最多的进程***************/ int findmany() { int i=0,j=0,k=0,l=0; i=allocation[0][0]+allocation[0][1]; i+=allocation[0][2]; j=allocation[1][0]+allocation[1][1]; j+=allocation[1][2];
work[0]=available[0]; work[1]=available[1];
work[2]=available[2]; i=n; while(i<M) {
if(finish[i]==false&&need[i][0]<=work[0]&&need[i][1]<=wo rk[1]&&need[i][2]<=work[2])
//各进程仍需要的资源情况
int request[3]={0,0,0};
//某进程
请求的资源情况
/***************输入初始的资源状况***************/ void input() {
int i=0,j=0; printf("\t\t\t\tA B C\n"); printf("请输入进程 0 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
for(j=0;j<3;j++) {
scanf("%d",&available[j]); }
for(i=0;i<4;i++) for(j=0;j<3;j++) { need[i][j]=max[i][j]-allocation[i][j]; }
printf("\n"); } /***************显示当前的资源状况***************/ void output() {
scanf("%d",&max[0][j]); } printf("\n"); printf("请输入进程 1 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
scanf("%d",&max[1][j]); } printf("\n"); printf("请输入进程 2 对 3 类资源的最大需求:"); for(j=0;j<3;j++) {
scanf("%d",&max[2][j]); } printf("\n"); printf("请输入进程 3 对 3 类资源的最大需求:");
for(j=0;j<3;j++) {
scanf("%d",&max[3][j]); } printf("\n"); printf("请输入进程 0 已分配的 3 类资源量:");
printf("%d ",need[1][j]); } printf("\n"); printf("进程 2:\t"); for(j=0;j<3;j++) {
printf("%d ",max[2][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",allocation[2][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("进程 1:\t"); for(j=0;j<3;j++) {
printf("%d ",max[1][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("%d ",allocation[1][j]); } printf("\t"); for(j=0;j<3;j++) {
变量说明:
可用资源向量 available[3]; 最大需求矩阵 max[4][3]; 可分配矩阵 allocation[4][3]; 需求矩阵 need[4][3]; 进程状态标识 finish[4];
流程图:
算法开始
输入各进程的最大需求资源、 已分配资源和可利用资源数
显示各进程的最大需求资源、 已分配资源和可利用资源数
// 各进程
可利用的资源情况
int
max[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
//各进程最大需求的资源情况
int
allocation[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
//各进程已经分配的资源情况
int
need[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
else return 3;
} else {
if(k>=l) return 2;
else return 3;
} } else {
if(j>=k) {
if(j>=l) return 1;
else return 3;
} else {
if(k>=l) return 2;
else return 3;
} } } /***************找出需要资源最少的进程***************/ int findfew() { int i=0,j=0,k=0,l=0; i=need[0][0]+need[0][1]; i+=need[0][2]; j=need[1][0]+need[1][1]; j+=need[1][2]; k=need[2][0]+need[2][1]; k+=need[2][2]; l=need[3][0]+need[3][1]; l+=need[3][2]; if(i<=j) {
选择进程并进行资源请求
请求是否合法
是
分配资源
是否死锁
是
解除占用资源最多的进程
否
否Байду номын сангаас
输出进程序列以及该 时刻的资源分配情况
算法结束
运行结果:
无死锁:
有死锁:
有连续死锁:
实验代码:
#include<stdio.h>
#define M 4 //进程数 #define N 3 //资源种类数
int available[3]={0,0,0};
k=allocation[2][0]+allocation[2][1]; k+=allocation[2][2]; l=allocation[3][0]+allocation[3][1]; l+=allocation[3][2]; if(i>=j) {
if(i>=k) {
if(i>=l) return 0;
设计思想:
该程序是在银行家算法的基础上添加了死锁的解除模块得来的, 死锁的解除采用的方法是:当系统发生死锁时,找到已分配资源最大 的死锁进程,剥夺其已分配资源,再次检测是否发生死锁。
数据结构:
1) 可用资源向量 available: 这是一个含有 m 个元素的数组,其 中的每一个元素代表一类可利用资源数目。
if(i<=k) {
if(i<=l) return 0;
else return 3;
} else {
if(k<=l) return 2;
else return 3;
} }
else {
if(j<=k) {
if(j<=l) return 1;
else return 3;
} else {
if(k<=l) return 2;
for(j=0;j<3;j++) {
scanf("%d",&allocation[2][j]); } printf("\n"); printf("请输入进程 3 已分配的 3 类资源量:");
for(j=0;j<3;j++) {
scanf("%d",&allocation[3][j]); } printf("\n"); printf("请输入可利用的 3 类资源量:");
for(j=0;j<3;j++) {
scanf("%d",&allocation[0][j]); } printf("\n"); printf("请输入进程 1 已分配的 3 类资源量:");
for(j=0;j<3;j++) {
scanf("%d",&allocation[1][j]); } printf("\n"); printf("请输入进程 2 已分配的 3 类资源量:");
int i=0,j=0; printf("该时刻 3 类资源的分配情况如下:\n"); printf("\tMAX\t\tALOCAT\t\tNEED\t\tAVAILABLE\n"); printf("进程 0:\t"); for(j=0;j<3;j++) {
printf("%d ",max[0][j]); } printf("\t"); for(j=0;j<3;j++) {
printf("存在死锁!\n"); return 1;
break; } break; } printf("\n"); printf("检测结果:不存在死锁!\n"); printf("安全序列为:"); for(i=0;i<M;i++) printf("%d\t",que[i]); printf("\n"); return 0; } /***************主函数***************/ void main() {
else return 3;
} } } /***************安全性检测***************/ int checksafe(int n) { int work[3],finish[M],que[M]; int i=0,k=0; for(i=0;i<M;i++)
finish[i]=false; for(;;) {
操作系统实验报告
实验题目:死锁的检测与解除 学生姓名:田凯飞 学生学号:1107300215 学生班级:计科 111 指导老师:霍林
实验题目:
死锁的检测与解除。
实验目的:
在实验一中我们可以通过银行家算法和安全性检测来对系统对 进程分配资源时进行安全性检测,这是避免系统发生死锁的有效方 法,但是假如系统真的发生死锁的时候,系统也必须对此采取有效的 措施,通过该实验我们可以深刻的认识系统对死锁的检测与解除的方 法。
printf("%d ",need[2][j]); } printf("\n"); printf("进程 3:\t"); for(j=0;j<3;j++)
{ printf("%d ",max[3][j]);
} printf("\t"); for(j=0;j<3;j++) {
printf("%d ",allocation[3][j]); } printf("\t"); for(j=0;j<3;j++) {