暂存
#include<cstdio>
#include<cstring>
const int N = 5, M = 4;
// 5个进程,4个资源
int n = 5, m = 4;
// 可利用资源向量,AVAILABLE[j]为目前系统中可用的第j项资源的数量
int AVAILABLE[M] = {3, 12, 14, 14};
// 最大需求资源量矩阵,MAX[i][j]为i进程对j资源的最大需求量
int MAX[N][M] = {
{0, 0, 4, 4},
{2, 7, 5, 0},
{3, 6, 10, 10},
{0, 9, 8, 4},
{0, 6, 6, 10}
};
// 已分配资源量矩阵,ALOCATION[i][j]为已给i进程分配的j资源的数量
int ALOCATION[N][M] = {
{0, 0, 3, 2},
{1, 0, 0, 0},
{1, 3, 5, 4},
{0, 3, 3, 2},
{0, 0, 1, 4}
};
// 需求资源量矩阵,对于任意定义域内的[i, j]都有NEED[i][j] = MAX[i][j] - ALOCATION[i][j]
int NEED[N][M];
void init()
{
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
NEED[i][j] = MAX[i][j] - ALOCATION[i][j];
}
// 判断现有资源是否足够分配给i线程
bool check(int work[], int i)
{
for(int j = 0; j < m; j ++)
if(work[j] < NEED[i][j]) return false;
return true;
}
// 安全性检查
int path[N]; // 安全序列
bool safe_check()
{
// 可分配资源的备份
static int work[M];
memcpy(work, AVAILABLE, sizeof AVAILABLE);
// 判断某个进程是否已经完成
static bool st[N];
memset(st, 0, sizeof st);
for(int i = 0; i < n; i ++)
{
int t = -1;
for(int j = 0; j < n; j ++)
if(!st[j] and check(work, j))
{
t = j;
break;
}
if(t == -1)
{
puts("当前系统不安全!");
return false;
}
st[t] = true;
path[i] = t;
for(int j = 0; j < m; j ++)
work[j] += ALOCATION[t][j];
}
puts("安全序列为:");
for(int i = 0; i < n; i ++) printf("%d ", path[i]);
puts("");
return true;
}
void solve()
{
for(int i = 0; i < n; i ++)
{
int t = path[i];
printf("进程 %d 执行\n", t);
for(int j = 0; j < m; j ++)
{
AVAILABLE[j] -= NEED[t][j];
ALOCATION[t][j] += NEED[t][j];
NEED[t][j] = 0;
}
printf("进程 %d 执行完毕\n", t);
for(int j = 0; j < m; j ++)
AVAILABLE[j] += ALOCATION[t][j];
}
}
int main()
{
init();
safe_check();
solve();
return 0;
}
tql
这不是手算么?滑稽
qwq
闭卷考OS吗?
还不知道怎么考,这个学了就随便写了一下qwq
看上去好有意思qwq
cao,你们这学期也要考os?。。。
是,计网计组OS都在这学期qwq