【算法随笔:银行家算法】(进程调度 | 死锁避免/回滚检查)

 代码简单易懂,附注释,供参考

/** 
 * 银行家算法
 **/
#include <bitset>
#include <algorithm>
#include <span>
 
constexpr unsigned int N { 10 };	/*  process number */
constexpr unsigned int M { 5 };  /*  resouce number */

unsigned int Available[M]	 	{};/* 开始时系统预留的资源数量 */

unsigned int Allocation[N][M] 	{};/* 进程执行前的预分配资源 */
unsigned int Need[N][M] 		{};/* 进程执行需要额外分配的资源 */
unsigned int Max[N][M]			{};/* 执行进程最大需要的资源 */
unsigned int requestID 			{};/* 进程提出资源请求 */
unsigned int requestRSC[M]		{};

unsigned int Work[M]			{};/* 跟踪当前资源剩余数量 */

std::bitset<N> Finish {};

bool enough(unsigned int process) noexcept {/* 检查当前系统剩余资源是否足够支撑该线程运行 */
	for(unsigned int j {}; j < M; j ++) 
		if(Need[process][j] > Work[j]) 
			return false;
	return true;	
}
void release(unsigned int process) noexcept { /* 一个进程执行完后会释放对应资源 */
	for(unsigned int j {}; j < M; j ++)
		Work[j] += Allocation[process][j];
}
int main() {
	for(unsigned int j {}; j < M; j ++)
		if(requestRSC[j] > Need[requestID][j] /* 原本就不需要这么多 */|| requestRSC[j] > Available[j] /* 系统资源根本不够用 */) {
			std::puts("request not permitted");
			return 0;
		}
	
	for(unsigned int j {}; j < M; j ++) {
		Allocation[requestID][j] += requestRSC[j]; /* 申请成功,于是预分配资源多了 */
		Need[requestID][j] -= requestRSC[j];  		/* 那么执行这个进程,还需要的额外资源就少了 */
		Available[j] -= requestRSC[j];				/* 那一开始的预留资源就少了 */
	}
	for(unsigned int i {}; i < N; i ++)
		for(unsigned int j {}; j < M; j ++) 
			Max[i][j] += Need[i][j] + Allocation[i][j];	/* Max的含义就一目了然了*/
	
	std::copy_n(std::cbegin(Available), std::min(std::size(Available), std::size(Work)), std::begin(Work));	
	/* Work工作向量 实时跟踪当前执行过程中,剩余的资源个数 */
	while(true) 
		for(unsigned int i {}; i < N; i ++) {
			if(!Finish[i] && enough(i)) {
				/* 模拟执行该进程 */
				release(i);			/* 执行完释放资源 */
				Finish[i] = true;	/* 选到了就剔除掉 */
				break;	// 再次从头开始选下一个进程
			} else goto jump_out;
		}
jump_out:
	for(unsigned int i {}; i < N; i ++) 
		if(! Finish[i])	{
			std::puts("dead lock");
			return 0;
		}	
	std::puts("safe");
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XNB's Not a Beginner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值