本文目录一览:
银行家算法的C语言程序
- 根据下面给出的系统中资源分配情况,以及各个进程的资源申请情况,通过银行家算法来判断各进程的资源请求能否满足(要求记录程序的运行过程)。 已分配的
改程序——银行家算法C语言版
你是学软件的学生吗 ? 我是学软件的,我在操作系统里学了银行家算法,等我看了,在告诉你我的看法,好吗? 愿意的话希望交流一下 我的邮箱qingdaheqiang@163.com
高分求银行家算法c语言版
#include "malloc.h"
#include "stdio.h"
#include "stdlib.h"
#define alloclen sizeof(struct allocation)
#define maxlen sizeof(struct max)
#define avalen sizeof(struct available)
#define needlen sizeof(struct need)
#define finilen sizeof(struct finish)
#define pathlen sizeof(struct path)
struct allocation {
int value;
struct allocation *next;
};
struct max {
int value;
struct max *next;
};
struct available /*可用资源数*/ {
int value;
struct available *next;
};
struct need /*需求资源数*/ {
int value;
struct need *next;
};
struct path {
int value;
struct path *next;
};
struct finish {
int stat;
struct finish *next;
};
int main() {
int row, colum, status = 0, i, j, t, temp, processtest;
struct allocation *allochead, *alloc1, *alloc2, *alloctemp;
struct max *maxhead, *maxium1, *maxium2, *maxtemp;
struct available *avahead, *available1, *available2, *workhead, *work1, *work2, *worktemp, *worktemp1;
struct need *needhead, *need1, *need2, *needtemp;
struct finish *finihead, *finish1, *finish2, *finishtemp;
struct path *pathhead, *path1, *path2;
printf("\n请输入系统资源的种类数:");
scanf("%d", colum);
printf("请输入现时内存中的进程数:");
scanf("%d", row);
printf("请输入已分配资源矩阵:\n");
for (i = 0; i < row; i++) {
for (j = 0; j < colum; j++) {
printf("请输入已分配给进程 p%d 的 %c 种系统资源:", i, 'A' + j);
if (status == 0) {
allochead = alloc1 = alloc2 = (struct allocation *)malloc(alloclen);
alloc1->next = alloc2->next = NULL;
scanf("%d", &allochead->value);
status++;
} else {
alloc2 = (struct allocation *)malloc(alloclen);
scanf("%d", &alloc2->value);
if (status == 1) {
allochead->next = alloc2;
status++;
}
alloc1->next = alloc2;
alloc1 = alloc2;
}
}
}
alloc2->next = NULL;
status = 0;
printf("请输入最大需求矩阵:\n");
for (i = 0; i < row; i++) {
for (j = 0; j < colum; j++) {
printf("请输入进程 p%d 种类 %c 系统资源最大需求:", i, 'A' + j);
if (status == 0) {
maxhead = maxium1 = maxium2 = (struct max *)malloc(maxlen);
maxium1->next = maxium2->next = NULL;
scanf("%d", &maxium1->value);
status++;
} else {
maxium2 = (struct max *)malloc(maxlen);
scanf("%d", &maxium2->value);
if (status == 1) {
maxhead->next = maxium2;
status++;
}
maxium1->next = maxium2;
maxium1 = maxium2;
}
}
}
maxium2->next = NULL;
status = 0;
printf("请输入现时系统剩余的资源矩阵:\n");
for (j = 0; j < colum; j++) {
printf("种类 %c 的系统资源剩余:", 'A' + j);
if (status == 0) {
avahead = available1 = available2 = (struct available *)malloc(avalen);
workhead = work1 = work2 = (struct available *)malloc(avalen);
available1->next = available2->next = NULL;
work1->next = work2->next = NULL;
scanf("%d", &available1->value);
work1->value = available1->value;
status++;
} else {
available2 = (struct available *)malloc(avalen);
work2 = (struct available *)malloc(avalen);
scanf("%d", &available2->value);
work2->value = available2->value;
if (status == 1) {
avahead->next = available2;
workhead->next = work2;
status++;
}
available1->next = available2;
available1 = available2;
work1->next = work2;
work1 = work2;
}
}
available2->next = NULL;
work2->next = NULL;
status = 0;
alloctemp = allochead;
maxtemp = maxhead;
for (i = 0; i < row; i++) {
for (j = 0; j < colum; j++) {
if (status == 0) {
needhead = need1 = need2 = (struct need *)malloc(needlen);
need1->next = need2->next = NULL;
need1->value = maxtemp->value - alloctemp->value;
status++;
} else {
need2 = (struct need *)malloc(needlen);
need2->value = maxtemp->value - alloctemp->value;
if (status == 1) {
needhead->next = need2;
status++;
}
need1->next = need2;
need1 = need2;
}
maxtemp = maxtemp->next;
alloctemp = alloctemp->next;
}
}
need2->next = NULL;
status = 0;
for (i = 0; i < row; i++) {
if (status == 0) {
finihead = finish1 = finish2 = (struct finish *)malloc(finilen);
finish1->next = finish2->next = NULL;
finish1->stat = 0;
status++;
} else {
finish2 = (struct finish *)malloc(finilen);
finish2->stat = 0;
if (status == 1) {
finihead->next = finish2;
status++;
}
finish1->next = finish2;
finish1 = finish2;
}
}
finish2->next = NULL; /*Initialization compleated*/
status = 0;
processtest = 0;
for (temp = 0; temp < row; temp++) {
alloctemp = allochead;
needtemp = needhead;
finishtemp = finihead;
worktemp = workhead;
for (i = 0; i < row; i++) {
worktemp1 = worktemp;
if (finishtemp->stat == 0) {
for (j = 0; j < colum; j++, needtemp = needtemp->next, worktemp = worktemp->next)
if (needtemp->value <= worktemp->value)
processtest++;
if (processtest == colum) {
for (j = 0; j < colum; j++) {
worktemp1->value += alloctemp->value;
worktemp1 = worktemp1->next;
alloctemp = alloctemp->next;
}
if (status == 0) {
pathhead = path1 = path2 = (struct path *)malloc(pathlen);
path1->next = path2->next = NULL;
path1->value = i;
status++;
} else {
path2 = (struct path *)malloc(pathlen);
path2->value = i;
if (status == 1) {
pathhead->next = path2;
status++;
}
path1->next = path2;
path1 = path2;
}
finishtemp->stat = 1;
} else {
for (t = 0; t < colum; t++)
alloctemp = alloctemp->next;
finishtemp->stat = 0;
}
} else {
for (t = 0; t < colum; t++) {
needtemp = needtemp->next;
alloctemp = alloctemp->next;
}
}
processtest = 0;
worktemp = workhead;
finishtemp = finishtemp->next;
}
}
path2->next = NULL;
finishtemp = finihead;
for (temp = 0; temp < row; temp++) {
if (finishtemp->stat == 0) {
printf("\n系统处于非安全状态!\n");
exit(0);
}
finishtemp = finishtemp->next;
}
printf("\n系统处于安全状态.\n");
printf("\n安全序列为: \n");
do {
printf("p%d ", pathhead->value);
} while ((pathhead = pathhead->next));
printf("\n");
return 0;
}
操作系统(死锁避免)----银行家算法解题
死锁:是指两个以上的进程都因要求对方已经占有的资源,导致无法运行下去的现象,死锁是系统的一种出错状态,不仅浪费大量的系统资源,甚至会导致整个系统的崩溃,所以死锁是尽量预防和避免的。
产生死锁的四个条件:
死锁的处理
银行家算法是死锁避免的重要算法。
银行家算法:资源==钱;收回资源==收回贷款;收不回资源==不会放贷;
例题:假设系统中有三类互斥资源R1,R2,R3。可用资源分别是9,8,5。在T0时刻系统有P1,P2,P3,P4,P5五个进程,这些进程最大的需求和已分配的资源如下所示,如果按_执行,那么系统的状态是安全的。
解:第一步:根据可用资源,可以求得剩余资源。
R1=9-(1+2+2+1+1)=2
R2=8-(2+1+1+2+1)=1
R3=5-(1+1+0+0+3)=0
第二步:根据剩余资源求得还需要的资源数。
公式:还需资源(Need)=最大需求(Max)-已分配资源(Allocation)。
第三步,根据剩余资源数,求出安全序列。
根据剩余资源可得,p2可以执行(条件:每个值都必须≦剩余资源)
由此可见安全序列为P2--p4--p5--p1--p3。
其实安全序列不是唯一的,这是为什么呢?
大家可以看出来,现有资源要大于需要资源的情况下是有多种选择的,因此安全序列不唯一。
c语言银行家算法安全性判别
把1作为参数传给yanzheng() yanzheng(int m) 然后验证函数里修改:
work = Avaliable;
i = m;
while (i < m) {
if (Finish[i] == false && Need[i] <= work) {
work = work + Allocation[i];
Finish[i] = true;
anquan[k] = i;
k++;
i = 0;
} else {
i++;
}
}