操作系统----银行家算法(C语言实现)_需要431个分配了210个不存在安全序列(1)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

	if (MAX->a >= total->a&&MAX->b >= total->b&&MAX->c >= total->c&&MAX->d >= total->d){
		break;
	}else{
		printf("您输入的系统中的各类资源总数有误,请重新输入系统A,B,C,D资源总数:");
		continue;
	}
}
remainResource(allProcess);
maxProcess(allProcess);

}

//某进程请求资源,系统是否分配给它
//打印进程各个资源的信息
void print(AllProcess* allProcess){
Process* p = allProcess->process;
printf(“\t\t\t\t进程各类资源表格\n”);
printf(“==============================================================================================================\n”);
printf(" \t\t Max\t\tAllocation\t\t\tNeed\n");
printf(“资源名称| A\tB\tC\tD|A\tB\tC\tD|A\tB\tC\tD\n”);

for (int i = 0; i < allProcess->size; i++){
	printf("[进程%d]\t| %d\t%d\t%d\t%d |", i + 1,
		p[i].max.a, p[i].max.b, p[i].max.c, p[i].max.d);

	printf("%d\t%d\t%d\t%d |",
		p[i].allocation.a, p[i].allocation.b,
		p[i].allocation.c, p[i].allocation.d);

	printf("%d\t%d\t%d\t%d\n",
		p[i].need.a, p[i].need.b, p[i].need.c, p[i].need.d);
}
printf("\n");

printf("\t\t\t\t中间运算\n");
printf(" \t\t Work\t\t\tAllocation\t\tNeed\t\t\tWork+Allocation\n");
printf("资源名称| A\tB\tC\tD|A\tB\tC\tD|A\tB\tC\tD|A\tB\tC\tD\t\n");

for (int i = 0; i < allProcess->size; i++){
	printf("[进程%d]\t| %d\t%d\t%d\t%d |", i + 1,
		p[i].work.a, p[i].work.b, p[i].work.c, p[i].work.d);

	printf("%d\t%d\t%d\t%d |",
		p[i].allocation.a, p[i].allocation.b,
		p[i].allocation.c, p[i].allocation.d);

	printf("%d\t%d\t%d\t%d |",
		p[i].need.a, p[i].need.b, p[i].need.c, p[i].need.d);

	printf("%d\t%d\t%d\t%d\n",
		p[i].work_allocation.a, p[i].work_allocation.b, p[i].work_allocation.c, p[i].work_allocation.d);
}
printf("==============================================================================================================\n");
//整个系统剩余资源数
printf("\t系统剩余资源数\n");
printf("\tAvailable\n");

printf("A\tB\tC\tD\n");
printf("%d\t%d\t%d\t%d\n",
	allProcess->available.a, allProcess->available.b,
	allProcess->available.c, allProcess->available.d);

}

//是否存在安全序列
//存在返回1
//不存在返回0
int isSecureArray(AllProcess* allProcess){
Process* p = allProcess->process;
//安全序列好的下标
int count = 0;
//先判断从哪个进程开始,然后将系统中剩余资源是分配给它.
for (int i = 0; isize; i++){
//若系统中剩余资源数大于等于其某个进程需要的资源数,就运行它
if (allProcess->available.a>=p[i].need.a
&&allProcess->available.b >= p[i].need.b
&&allProcess->available.c >= p[i].need.c
&&allProcess->available.d >= p[i].need.d){

		//可工作的资源(试分配)初始化work
		(p+i)->work.a = allProcess->available.a;
		p[i].work.b = allProcess->available.b;
		p[i].work.c = allProcess->available.c;
		p[i].work.d = allProcess->available.d;

		//运行该进程,将其标志位置为1.
		p[i].finish = 1;
		//将第i进程写入安全序列号中
		allProcess->array[count++] = i;

		//释放该进程后,系统中可工作的资源work-allocation
		p[i].work_allocation.a = p[i].work.a + p[i].allocation.a;
		p[i].work_allocation.b = p[i].work.b + p[i].allocation.b;
		p[i].work_allocation.c = p[i].work.c + p[i].allocation.c;
		p[i].work_allocation.d = p[i].work.d + p[i].allocation.d;
		
		//找到第一个序列,即开始序列,则跳出循环
		break;
	}
	
}
//记录安全序列有没有新增
int count1 = 0;

//1. 当安全序列数组已满时,即count超过数组下标时
//2. 或者因资源不够,系统中进程不能够全部运行
//循环结束
while (count<allProcess->size && count1!=count){
	//当整个for循环完count1==count
	//表明检索了整个进程表都没有可以运行的进程
	//说明不存在安全序列

	//如果发生了变化,则把发生变化后的值赋给count1
	//以方便后续判断其是否发生变化
	count1 = count;
	for (int i = 0; i<allProcess->size; i++){

		//当标志位不为0,且刚刚释放的资源数大于等于其某个进程需要的资源数,就运行它
		if (p[i].finish!=1
			&&p[allProcess->array[count - 1]].work_allocation.a >= p[i].need.a
			&&p[allProcess->array[count - 1]].work_allocation.b >= p[i].need.b
			&&p[allProcess->array[count - 1]].work_allocation.c >= p[i].need.c
			&&p[allProcess->array[count - 1]].work_allocation.d >= p[i].need.d){

			//系统可为该进程可工作的资源
			//即刚刚运行完毕所进程释放的资源
			p[i].work.a = p[allProcess->array[count - 1]].work_allocation.a;
			p[i].work.b = p[allProcess->array[count - 1]].work_allocation.b;
			p[i].work.c = p[allProcess->array[count - 1]].work_allocation.c;
			p[i].work.d = p[allProcess->array[count - 1]].work_allocation.d;

			//运行该进程,将其标志位置为1.
			allProcess->process[i].finish = 1;
			//将第i进程写入安全序列号中
			allProcess->array[count++] = i;

			//释放该进程后,系统中可工作的资源work-allocation
			p[i].work_allocation.a = p[i].work.a + p[i].allocation.a;
			p[i].work_allocation.b = p[i].work.b + p[i].allocation.b;
			p[i].work_allocation.c = p[i].work.c + p[i].allocation.c;
			p[i].work_allocation.d = p[i].work.d + p[i].allocation.d;
		}
	}
}
print(allProcess);
//返回1 代表存在安全序列
if (count >= allProcess->size){
	return 1;
}
return 0;

}
//银行家算法
void Bankers(AllProcess* allProcess){
initAllProcess(allProcess);
remainResource(allProcess);
//求输入哪个进程请求分配资源( 为标号,非下标)
int num = 0;
//对请求的进程进行校验:看该进程是否存在该进程
//比如:人家进程数是5,你却说进程6在请求资源
printf(“输入哪个进程请求分配资源[1,%d]:”,allProcess->size);
while (1){
scanf(“%d”, &num);
if (num <= allProcess->size && num >= 1){
break;
}else{
printf(“请输入合法的进程号[1,%d]:”, allProcess->size);
continue;
}
}
//输入请求的资源数目
printf(“请输入[%d进程]的资源请求(A,B,C,D):”,num);
//某号进程请求的各类资源
Resource* r = &allProcess->process[num - 1].request;
/*scanf(“%d %d %d %d”, &allProcess->process[num - 1].request.a,
&allProcess->process[num - 1].request.b, &allProcess->process[num - 1].request.c,
&allProcess->process[num - 1].request.d);*/
scanf(“%d %d %d %d”, &r->a, &r->b, &r->c, &r->d);
//某号进程需要的各类资源
Resource* n = &allProcess->process[num - 1].need;
//某号进程已分配的各类资源
Resource* all = &allProcess->process[num - 1].allocation;

if (r->a <= n->a&&r->b <= n->b&&r->c <= n->c&&r->d <= n->d
	&&r->a<=allProcess->available.a&&r->b<=allProcess->available.b
	&&r->c<=allProcess->available.c&&r->d<=allProcess->available.d){
	//更新该进程的已分配资源
	all->a += r->a;
	all->b += r->b;
	all->c += r->c;
	all->d += r->d;
	//更新该进程的需要资源
	n->a -= r->a;
	n->b -= r->b;
	n->c -= r->c;
	n->d -= r->d;
	
	//更新由于新的请求系统中所剩资源数
	allProcess->available.a -= r->a;
	allProcess->available.b -= r->b;
	allProcess->available.c -= r->c;
	allProcess->available.d -= r->d;

	if (isSecureArray(allProcess) == 1){
		printf("存在安全序列\n");
		printf("安全序列为:");
		for (int i = 0; i < allProcess->size; i++){
			//如果是最后一个输出,就不带->
			if (i == allProcess->size - 1){
				printf("%d\n", allProcess->array[i] + 1);
			}
			else{
				printf("%d->", allProcess->array[i] + 1);
			}
		}
	}
	else{
		printf("不存在安全序列\n");
	}
} else{
	printf("请求失败,不存在安全序列\n");
	return;
}

}
//定义指针类型的整个系统
AllProcess allProcess;

int main()
{
Bankers(&allProcess);
system(“pause”);
return 0;
}


#### 运行结果



//测试用例
/*
请输入该系统的进程数:2
请输入第1个进程的allocation资源分配情况
A B C D
1 1 1 1
请输入第1个进程的need资源情况
A B C D
1 2 3 4
请输入第2个进程的allocation资源分配情况
A B C D
4 3 2 1
请输入第2个进程的need资源情况
A B C D
1 1 1 1
输入系统A,B,C,D资源总数:5 5 5 5
输入哪个进程请求分配资源[1,2]:2
请输入[2进程]的资源请求(A,B,C,D):0 1 1 1
进程各类资源表格

Max Allocation Need
资源名称| A B C D|A B C D|A B C D
[进程1] | 2 3 4 5 |1 1 1 1 |1 2 3 4
[进程2] | 5 4 3 2 |4 4 3 2 |1 0 0 0
中间运算
Work Allocation Need Work+Allocation
资源名称| A B C D|A B C D|A B C D|A B C D
[进程1] | 0 0 0 0 |1 1 1 1 |1 2 3 4 |0 0 0 0
[进程2] | 0 0 0 0 |4 4 3 2 |1 0 0 0 |0 0 0 0

系统剩余资源数
Available
A B C D
0 0 1 2
不存在安全序列
请按任意键继续. . .
*/
//测试用例2
/*
请输入该系统的进程数:2
请输入第1个进程的allocation资源分配情况
A B C D
4 3 2 1
请输入第1个进程的need资源情况
A B C D
1 1 1 1
请输入第2个进程的allocation资源分配情况
A B C D
1 1 1 1
请输入第2个进程的need资源情况
A B C D
1 2 3 4
输入系统A,B,C,D资源总数:6 6 6 6
输入哪个进程请求分配资源;1
请输入[1进程]的资源请求(A,B,C,D):1 1 1 1
进程各类资源表格

Max Allocation Need
资源名称| A B C D|A B C D|A B C D
[进程1] | 5 4 3 2 |5 4 3 2 |0 0 0 0
[进程2] | 2 3 4 5 |1 1 1 1 |1 2 3 4

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

链图片转存中…(img-vPhENPlB-1715808150286)]
[外链图片转存中…(img-sRWpmGCu-1715808150286)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是用 C 语言编写的银行家算法程序,可以实现资源分配: ```c #include <stdio.h> // 定义最大进程数和最大资源数 #define MAX_PROCESS 10 #define MAX_RESOURCE 10 int main() { int available[MAX_RESOURCE]; // 可用资源数目 int max[MAX_PROCESS][MAX_RESOURCE]; // 每个进程所需的最大资源数 int allocation[MAX_PROCESS][MAX_RESOURCE]; // 每个进程已分配的资源数 int need[MAX_PROCESS][MAX_RESOURCE]; // 每个进程还需要的资源数 int request[MAX_RESOURCE]; // 每个进程请求的资源数 int work[MAX_RESOURCE]; // 可用资源数目的拷贝 int finish[MAX_PROCESS]; // 标记每个进程是否完成 int safe[MAX_PROCESS]; // 安全序列 int i, j, k, n, m; int count = 0; int flag = 0; // 输入资源数目和进程数目 printf("请输入资源数目和进程数目:\n"); scanf("%d %d", &m, &n); // 输入可用资源数目 printf("请输入每个资源的可用数目:\n"); for (i = 0; i < m; i++) { scanf("%d", &available[i]); } // 输入每个进程所需的最大资源数 printf("请输入每个进程所需的最大资源数:\n"); for (i = 0; i < n; i++) { printf("请输入进程 P%d 的最大资源数:\n", i); for (j = 0; j < m; j++) { scanf("%d", &max[i][j]); } } // 输入每个进程已分配的资源数 printf("请输入每个进程已分配的资源数:\n"); for (i = 0; i < n; i++) { printf("请输入进程 P%d 已分配的资源数:\n", i); for (j = 0; j < m; j++) { scanf("%d", &allocation[i][j]); need[i][j] = max[i][j] - allocation[i][j]; // 计算每个进程还需要的资源数 } } // 输入请求资源的进程号和请求的资源数 printf("请输入请求资源的进程号和请求的资源数:\n"); scanf("%d", &k); for (i = 0; i < m; i++) { scanf("%d", &request[i]); } // 判断请求是否合法 for (i = 0; i < m; i++) { if (request[i] > need[k][i]) { printf("错误:进程 P%d 请求的资源数超过了其需要的资源数!\n", k); flag = 1; break; } if (request[i] > available[i]) { printf("错误:进程 P%d 请求的资源数超过了系统可用资源数!\n", k); flag = 1; break; } } if (flag == 0) { // 模拟分配资源 for (i = 0; i < m; i++) { available[i] -= request[i]; allocation[k][i] += request[i]; need[k][i] -= request[i]; } // 初始化 work 数组 for (i = 0; i < m; i++) { work[i] = available[i]; } // 初始化 finish 数组 for (i = 0; i < n; i++) { finish[i] = 0; } // 安全检查 while (count < n) { flag = 0; for (i = 0; i < n; i++) { if (finish[i] == 0) { for (j = 0; j < m; j++) { if (need[i][j] > work[j]) { break; } } if (j == m) { for (k = 0; k < m; k++) { work[k] += allocation[i][k]; } finish[i] = 1; safe[count++] = i; flag = 1; } } } if (flag == 0) { break; } } // 输出安全序列 if (count == n) { printf("安全序列为:\n"); for (i = 0; i < n; i++) { printf("%d ", safe[i]); } printf("\n"); } else { printf("系统处于不安全状态,无法分配资源!\n"); } } return 0; } ``` 上述程序实现银行家算法的资源分配功能,包括输入资源数目和进程数目、每个资源的可用数目、每个进程所需的最大资源数、每个进程已分配的资源数、请求资源的进程号和请求的资源数等。在输入请求资源后,程序会模拟分配资源,并进行安全检查,输出安全序列或者提示系统处于不安全状态。 ### 回答2: 银行家算法是一种资源分配和避免死锁的算法,用于处理多个进程对有限资源的请求。下面是一个用C语言编写和调试的简单银行家算法程序。 首先,我们定义一些必要的数据结构和全局变量。假设我们有5个进程和3种类型的资源。 ```c #include <stdio.h> #define NUM_PROCESSES 5 // 进程数 #define NUM_RESOURCES 3 // 资源数 int available[NUM_RESOURCES]; // 可用资源数组 int max[NUM_PROCESSES][NUM_RESOURCES]; // 进程最大资源需求矩阵 int allocation[NUM_PROCESSES][NUM_RESOURCES]; // 进程已分配资源矩阵 int need[NUM_PROCESSES][NUM_RESOURCES]; // 进程还需要资源矩阵 int work[NUM_RESOURCES]; // 工作向量 int finish[NUM_PROCESSES]; // 完成进程数组 // 初始化银行家算法的数据结构 void init() { int i, j; int initial_resources[NUM_RESOURCES] = {10, 5, 7}; // 初始可用资源 // 设置初始可用资源 for (i = 0; i < NUM_RESOURCES; i++) { available[i] = initial_resources[i]; } // 设置最大资源需求矩阵 int max_resources[NUM_PROCESSES][NUM_RESOURCES] = { {7, 5, 3}, {3, 2, 2}, {9, 0, 2}, {2, 2, 2}, {4, 3, 3} }; for (i = 0; i < NUM_PROCESSES; i++) { for (j = 0; j < NUM_RESOURCES; j++) { max[i][j] = max_resources[i][j]; } } // 初始化已分配资源矩阵和还需要资源矩阵 int allocated_resources[NUM_PROCESSES][NUM_RESOURCES] = { {0, 1, 0}, {2, 0, 0}, {3, 0, 2}, {2, 1, 1}, {0, 0, 2} }; for (i = 0; i < NUM_PROCESSES; i++) { for (j = 0; j < NUM_RESOURCES; j++) { allocation[i][j] = allocated_resources[i][j]; need[i][j] = max[i][j] - allocation[i][j]; } } } // 检查进程能否获得资源 int is_safe() { int i, j; int count = 0; // 初始化工作向量和完成进程数组 for (i = 0; i < NUM_RESOURCES; i++) { work[i] = available[i]; } for (i = 0; i < NUM_PROCESSES; i++) { finish[i] = 0; } // 寻找可以分配资源的进程 while (count < NUM_PROCESSES) { int found = 0; for (i = 0; i < NUM_PROCESSES; i++) { if (finish[i] == 0) { int j; int can_allocate = 1; for (j = 0; j < NUM_RESOURCES; j++) { if (need[i][j] > work[j]) { can_allocate = 0; break; } } if (can_allocate) { for (j = 0; j < NUM_RESOURCES; j++) { work[j] += allocation[i][j]; } finish[i] = 1; found = 1; count++; } } } if (!found) { break; } } // 检查是否分配完所有进程 for (i = 0; i < NUM_PROCESSES; i++) { if (finish[i] == 0) { return 0; } } return 1; } int main() { init(); if (is_safe()) { printf("安全状态!进程可以获得资源。\n"); } else { printf("不安全状态!进程无法获得资源。\n"); } return 0; } ``` 在以上程序中,我们首先初始化银行家算法所需数据结构,包括可用资源数组、进程最大资源需求矩阵、进程已分配资源矩阵和进程还需要资源矩阵。然后,我们实现了一个`is_safe()`函数来检查系统当前是否处于安全状态。最后,在`main()`函数中,我们调用`is_safe()`函数来判断资源分配是否安全。如果安全,打印“安全状态!进程可以获得资源。”;否则,打印“不安全状态!进程无法获得资源。”。 这是一个简单的银行家算法程序,用于实现资源分配和避免死锁。请注意,以上示例仅能体现基本的银行家算法原理,实际应用中可能需要更复杂的实现和更多的安全性检查。 ### 回答3: 银行家算法是一种用于避免死锁的资源分配算法,在实际的操作系统中广泛应用于资源管理。以下是一个简单的银行家算法程序的实现步骤: 1. 首先定义一些必要的变量和数据结构,包括进程数、资源数、进程的最大需求量、已分配资源量和可利用资源量等。 2. 初始化这些变量和数据结构,包括设置进程的最大需求量、已分配资源量和可利用资源量。 3. 编写一个函数来检查每个进程的资源请求是否满足条件,即判断请求的资源数量是否小于进程的最大需求量、小于系统可利用资源量并且不会导致死锁。 4. 如果满足条件,分配请求的资源给该进程,并更新已分配资源量和可利用资源量。 5. 如果不满足条件,则暂停该进程,并将其加入等待队列中。 6. 循环执行步骤3和4,直到没有进程满足资源请求的条件为止。 7. 当一个进程释放已分配的资源时,重新评估队列中所有进程的资源请求,并进行分配。 8. 检查所有进程的资源请求是否满足条件,如果满足则继续执行,如果不满足则暂停进程,并将其加入等待队列中。 9. 重复步骤7和8,直到所有进程完成。 此外,为了保证代码的正确性,可以采用一些调试技术,如打印输出每个步骤中的关键变量和数据结构,观察其变化情况,以及使用断点调试等方式进行程序运行的调试。 上述是一个简单的银行家算法程序的实现过程,具体的代码实现需要根据具体情况进行,例如使用数组、循环、条件语句等来实现相应的功能。编写和调试一个完整的银行家算法程序需要仔细考虑资源分配的各种可能情况,确保程序能正确地进行资源的分配和释放,从而避免死锁的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值