实验目的:
1.理解死锁和死锁避免的概念;
2.理解安全序列的概念;
3.掌握银行家算法的原理
实验器材:
VSCode
实验内容:
编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
模拟银行家算法,初始化时系统拥有一定资源;通过键盘输入方式申请资源;如果预分配后,系统处于安全状态,则修改系统的资源分配情况; 如果预分配后,系统处于安全状态,则修改系统的资源分配情况;
实验步骤:
#include
#include
typedef struct {
int id;
int resource;
} Process;
int find_max_need(Process *processes, int num_processes) {
int max = 0;
for (int i = 0; i < num_processes; i++) {
if (processes[i].resource > max) {
max = processes[i].resource;
}
}
return max;
}
int is_safe_state(Process *processes, int num_processes, int total_resource) {
int total_need = 0;
for (int i = 0; i < num_processes; i++) {
total_need += processes[i].resource;
}
return total_need <= total_resource;
}
void banker_algorithm(Process *processes, int num_processes, int total_resource) {
int max_need = find_max_need(processes, num_processes);
printf("Initial state:\n");
for (int i = 0; i < num_processes; i++) {
printf("Process %d: resource = %d\n", processes[i].id, processes[i].resource);
}
printf("\n");
int allocated_resource = 0;
while (1) {
printf("Enter the process ID for resource allocation (0 to quit): ");
int process_id;
scanf("%d", &process_id);
if (process_id == 0) {
break;
}
if (processes[process_id - 1].resource + 1 <= total_resource) {
processes[process_id - 1].resource++;
allocated_resource++;
printf("Process %d: resource = %d\n", process_id, processes[process_id - 1].resource);
if (is_safe_state(processes, num_processes, total_resource - allocated_resource)) {
printf("System is in a safe state.\n");
} else {
printf("System is not in a safe state.\n");
}
} else {
printf("Insufficient resource.\n");
}
}
printf("Final state:\n");
for (int i = 0; i < num_processes; i++) {
printf("Process %d: resource = %d\n", processes[i].id, processes[i].resource);
}
printf("\n");
}
int main() {
Process processes[] = {
{1, 0},
{2, 0},
{3, 0}
};
int num_processes = sizeof(processes) / sizeof(processes[0]);
int total_resource = 10;
banker_algorithm(processes, num_processes, total_resource);
return 0;
}
实验结果(附数据和图表):
实验结果分析及结论:
在模拟过程中,我们可以有意地制造一些可能导致死锁的条件,例如让两个进程互相等待对方释放资源。通过运行程序并观察输出结果,我们可以看到,当系统处于不安全状态时,程序会输出错误信息并终止执行,从而避免了死锁的发生。这证明了我们的银行家算法可以有效地预防和避免死锁的发生。
实验心得体会和建议:
通过本次实验,我们验证了银行家算法在预防死锁方面的有效性。在实际的操作系统中,银行家算法可以作为一个重要的安全策略来防止死锁的发生。然而,我们也注意到,银行家算法需要系统提供足够的可用资源以保证系统的安全性,如果系统的可用资源过少,可能会导致即使采用银行家算法也无法避免死锁的情况。因此,在实际应用中,我们需要根据系统的具体情况来调整可用资源的数量,以保证系统的正常运行。