操作系统课程设计-银行家算法与随机分配算法

本文通过C语言模拟操作系统中进程资源分配,对比随机分配可能导致的死锁问题,介绍了银行家算法的原理和应用。通过具体代码及测试数据展示如何确保系统的安全性并输出安全序列。
摘要由CSDN通过智能技术生成

 

用c语言模拟资源给进程分配的全过程,若资源随机分配,则有可能进入不安全状态从而形成死锁,银行家算法可以解决这一问题,并输出安全序列。

 

这里的随机算法其实就是自己决定分配多少,而非用伪随机种子生成。银行家算法,很简单的算法,学了操作系统的应该都知道了。

 

 

代码:

 

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define os 10

using namespace std;

struct REC
{
    int A;
    int B;
    int C;
};

struct PCB
{
	int Id;  //进程号,外部标识符
	char State; //状态 R就绪 W等待 E完成
	REC Apply;  //当前请求量
	REC Max;  //需求总量
	REC Need;   //还需要资源数量
	REC Allocation;    //已分配量
};

PCB *pos,*tmp, *pos0;

REC System, Available;

PCB pcb[3];

/*void InitPCB()
{
    printf("输入系统资源总量:\n");
    scanf("%d%d%d", &System.A, &System.B, &System.C);
	int i = 0, a = 0, b = 0, c = 0;
	for(pos = pcb; pos < pcb+3; pos++)
	{
		i++;
		pos->Id = i;
		pos->State = 'R';
		pos->Allocation.A = 0;
		pos->Allocation.B = 0;
		pos->Allocation.C = 0;
		pos->Apply.B = 0;
		pos->Apply.B = 0;
		pos->Apply.B = 0;
	}
	i = 0;
	for(pos = pcb; pos < pcb+3; pos++)
	{
	    printf("输入进程%d最大需求Max\n", ++i);
	    scanf("%d%d%d", &pos->Max.A, &pos->Max.B, &pos->Max.C);
		while(pos->Max.A>os || pos->Max.B>os || pos->Max.C>os || pos->Max.A<0 || pos->Max.B<0 || pos->Max.C<0)
		{
		    printf("数据输入有错,请重新输入:\n");
			scanf("%d%d%d", &pos->Max.A, &pos->Max.B, &pos->Max.C);
		}
		printf("输入进程%d已分配量\n", i);
	    scanf("%d%d%d", &pos->Allocation.A, &pos->Allocation.B, &pos->Allocation.C);
		while(pos->Allocation.A>pos->Max.A || pos->Allocation.B>pos->Max.B || pos->Allocation.C>pos->Max.C || pos->Allocation.A<0 || pos->Allocation.B<0 || pos->Allocation.C<0)
		{
		    printf("数据输入有错,请重新输入:\n");
			scanf("%d%d%d", &pos->Allocation.A, &pos->Allocation.B, &pos->Allocation.C);
		}
		a+=pos->Allocation.A;
		b+=pos->Allocation.B;
		c+=pos->Allocation.C;
		pos->Need.A = pos->Max.A-pos->Allocation.A;
		pos->Need.B = pos->Max.B-pos->Allocation.B;
		pos->Need.C = pos->Max.C-pos->Allocation.C;
	}
	Available.A = System.A-a;
	Available.B = System.B-b;
	Available.C = System.C-c;
}*/

void InitPCB()
{
 //   printf("输入系统资源总量:\n");
    System.A = 10;
    System.B = 5;
    System.C = 7;
	int i = 0, a = 0, b = 0, c = 0;
	for(pos = pcb; pos < pcb+3; pos++)
	{
		i++;
		pos->Id = i;
		pos->State = 'R';
		pos->Allocation.A = 0;
		pos->Allocation.B = 0;
		pos->Allocation.C = 0;
		pos->Apply.B = 0;
		pos->Apply.B = 0;
		pos->Apply.B = 0;
	}
	i = 0;
	//初始化第一个
	pos = pcb;
	pos->Max.A = 7;
	pos->Max.B = 5;
	pos->Max.C = 3;
	pos->Allocation.A = 0;
	pos->Allocation.B = 1;
	pos->Allocation.C = 3;
	a+=pos->Allocation.A;
    b+=pos->Allocation.B;
    c+=pos->Allocation.C;
    pos->Ne
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值