⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deadlock.cpp

📁 几个实现操作系统算法的小程序 有哲学家 算法 生产者消费者等算法的实现 供初学者学习参考
💻 CPP
字号:
#include <stdio.h>

#define MAXP 10//最大进程数
#define MAXR 10//最大资源种类数

int NUMP,NUMR;//进程数目和资源数目

void Safe(int * Available, int Max[MAXP][MAXR], int Alloc[MAXP][MAXR]);//安全算法
bool LE(int * a, int * b, int len);//判断向量a小于等于向量b

int main()
{
	int	Max[MAXP][MAXR];//= {{3,2,2},{6,1,3},{3,1,4},{4,2,2}};//每一进程需要每一资源最大数
	int Alloc[MAXP][MAXR];//= {{1,0,0},{6,1,2},{2,1,1},{0,0,2}};//每一进程已经得到每一资源数
	int Available[MAXR];//= {0,1,0};//系统中未分配给进程的每种资源总量3
	int i, j;

	printf("input the amount of porcess and resource:\n");
	scanf("%d %d", &NUMP, &NUMR);

	printf("请输入每一资源还可使用数:\n");
	for(j = 0; j < NUMR; j++)//输入每一资源还可使用数
		scanf("%d", &Available[j]);

	printf("请输入进程第一资源最大数:\n");
	for(i = 0; i < NUMP; i++)//输入进程第一资源最大数
		for(j = 0; j < NUMR; j++)
			scanf("%d", &Max[i][j]);

	printf("请输入进程已拥有每一资源数:\n");
	for(i = 0; i < NUMP; i++)//输入进程已拥有每一资源数
		for(j = 0; j < NUMR; j++)
			scanf("%d", &Alloc[i][j]);
		
	Safe(Available, Max, Alloc);

	return 0;
}

void Safe(int * Available, int Max[MAXP][MAXR], int Alloc[MAXP][MAXR])
{
	int CurrentAvail[MAXR];
	int Need[MAXR];
	int Process[MAXP], pointer = 0;//记录进程的完成顺序
	bool Finish[MAXP];//记录进程i是否顺利完成
	int i,j;

	for(i = 0; i < NUMR; i++)
		CurrentAvail[i] = Available[i];
	for(i = 0; i < NUMP; i++)
		Finish[i] = false;

	for(i = 0; i < NUMP; i++)
	{
		for(j = 0; j < NUMR; j++)//计算进程i需要资源数
			Need[j] = Max[i][j] - Alloc[i][j];

		if( LE(Need, CurrentAvail, NUMR) && Finish[i] == false )
		{//可用资源可满足进程需要的资源
			for(j = 0 ; j < NUMR; j++)//完成进程i后计算可用资源
				CurrentAvail[j] += Alloc[i][j];
			Finish[i] = true;
			Process[pointer] = i;
			pointer++;
			i = -1;
		}
	}

	for(i = 0; i < NUMP; i++)
		if( Finish[i] == false )
		{//进程没用全部完成,则不安全
			printf("unsafe\n");
			return ;
		}

	printf("safe: ");//进程全部顺利完成,安全
	for(i = 0; i < NUMP; i++)//输出进程完成顺序
		printf("p%d ", Process[i]+1);
	printf("\n");
}

bool LE(int * a, int * b, int len)
{//判断长度为len的向量a小于等于b
	for(int i = 0; i < len; i++)
		if(a[i] > b[i])
			return false;
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -