操作系统——银行家算法

实验目的:

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;

}

实验结果(附数据和图表):

操作系统——银行家算法_第1张图片

实验结果分析及结论:

在模拟过程中,我们可以有意地制造一些可能导致死锁的条件,例如让两个进程互相等待对方释放资源。通过运行程序并观察输出结果,我们可以看到,当系统处于不安全状态时,程序会输出错误信息并终止执行,从而避免了死锁的发生。这证明了我们的银行家算法可以有效地预防和避免死锁的发生。

实验心得体会和建议:

通过本次实验,我们验证了银行家算法在预防死锁方面的有效性。在实际的操作系统中,银行家算法可以作为一个重要的安全策略来防止死锁的发生。然而,我们也注意到,银行家算法需要系统提供足够的可用资源以保证系统的安全性,如果系统的可用资源过少,可能会导致即使采用银行家算法也无法避免死锁的情况。因此,在实际应用中,我们需要根据系统的具体情况来调整可用资源的数量,以保证系统的正常运行。

你可能感兴趣的:(操作系统实验报告,算法,windows)