操作系统 进程调度-银行家算法实验报告

简介: 操作系统 进程调度-银行家算法实验报告

实验要求


一、 实验目的

死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。

二、 实验要求

设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。

系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;

三、 数据结构

1. 可利用资源向量Available ,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available(j)=k,标是系统中现有Rj类资源k个。

2. 最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k。

3. 分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Allocation(i,j)=k,表示进程i当前已经分到Rj类资源的数目为k。Allocation i表示进程i的分配向量,有矩阵Allocation的第i行构成。

4. 需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。如果Need(i,j)=k,表示进程i还需要Rj类资源k个,才能完成其任务。Need i表示进程i的需求向量,由矩阵Need的第i行构成。

上述三个矩阵间存在关系:Need(i,j)=Max(i,j)-Allocation(i,j);

四、 银行家算法

参考教材P96

五、 安全性算法

1. 设置两个向量。

Work:它表示系统可提供给进程继续运行的各类资源数目,它包含m个元素,开始执行安全性算法时,Work = Available。

Finish:它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish(I)=false;当有足够资源分配给进程Pi时,令Finish(i)=true;

2. 从进程集合中找到一个能满足下述条件的进程。

Finish(i)= = false;

Need i ≤work;

如找到则执行步骤3;否则,执行步骤4;

3. 当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行

Work = work + Allocation i

Finish(i)=true;转向步骤2;

4. 若所有进程的Finish(i)都为true,则表示系统处于安全状态;否则,系统处于不安全状态。

六、流程

20200619094706694.png

实验报告


1.实验目的


死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。

2.实验内容与要求


①实验内容

1. 可利用资源向量Available ,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available(j)=k,标是系统中现有Rj类资源k个。


2. 最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k。


3. 分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Allocation(i,j)=k,表示进程i当前已经分到Rj类资源的数目为k。Allocation i表示进程i的分配向量,有矩阵Allocation的第i行构成。


4. 需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。如果Need(i,j)=k,表示进程i还需要Rj类资源k个,才能完成其任务。Need i表示进程i的需求向量,由矩阵Need的第i行构成。

上述三个矩阵间存在关系:Need(i,j)=Max(i,j)-Allocation(i,j);

安全性算法

1. 设置两个向量。

Work:它表示系统可提供给进程继续运行的各类资源数目,它包含m个元素,开始执行安全性算法时,Work = Available。


Finish:它表示系统是否有足够的资源分配给进程,使之运行完成,开始Finish(I)=false;当有足够资源分配给进程Pi时,令Finish(i)=true;


2. 从进程集合中找到一个能满足下述条件的进程。

Finish(i)= = false;

Need i ≤work;

如找到则执行步骤3;否则,执行步骤4;


3. 当进程Pi获得资源后,可顺利执行直到完成,并释放出分配给它的资源,故应执行

Work = work + Allocation i

Finish(i)=true;转向步骤2;


4. 若所有进程的Finish(i)都为true,则表示系统处于安全状态;否则,系统处于不安全状态。

②实验要求

设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。

系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析;

3.流程图与模块调用


20200619094706694.png

4.实验分析


想要完成操作系统算法,首先要弄清楚操作系统相关的专业术语。弄清各个算法的流程和目的要求。才能模拟出相关算法的过程。

在我的理解中,

银行家算法的思想:

银行家算法让进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,即分配完是否会进入不安全状态。

若此次资源分配安全,便将资源分配给进程,否则不分配资源,让进程等待。

银行家算法的理解:

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。


当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。


若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

5.运行情况


image.png

6.实验体会


通过本次实验,我深刻的理解了操作系统中线程资源的分配方式和银行家算法。操作系统实验重在理解每一个算法的意图和目的,那么就选择适当的数据结构模拟过程就可以完成相关算法了。


系统有多个种资源并且每一种资源的数目有限,有多个想要申请这些资源的进程,僧多粥少,所以要好好安排分配的顺序,不然就会导致不安全状态甚至死锁。


本次实验采用python完成,IDE是pycharm。

【附】实验代码


import numpy as np
def security(work, need, allocation):
    n = need.shape[0]
    finish = np.array([False] * n, dtype=bool)
    while not (finish.all()):
        flag = False
        for i in range(n):
            if not finish[i] and (need[i] <= work).all():
                print("P{}".format(i), end=' -> ')
                flag = True
                work += allocation[i]
                finish[i] = True
                break
        if not flag:
            return False
    print()
    return True
def printTable(available, max_table, allocation, need, n):
    print("--------------------------")
    print("进程\t最大需求量\t已分配量\t剩余需要分配量")
    for i in range(n):
        print("P{}\t\t{}\t\t{}\t\t{}".format(
            i, max_table[i], allocation[i], need[i]))
    print("当前剩余资源:", available)
if __name__ == '__main__':
    m = int(input("输入资源种类数 m: "))
    temp = input("输入进程数资源,空格隔开:").split()
    available = np.array(temp, dtype=int)   # 可利用资源向量
    n = int(input("输入进程数 n: "))
    max_table = np.zeros([n, m], dtype=int)     # 最大需求矩阵
    allocation = np.zeros([n, m], dtype=int)    # 分配矩阵
    # 输入最大需求资源
    for i in range(n):
        temp = input("输入进程 P{} 的最大需求向量:".format(i)).split()
        max_table[i] = np.array(temp, dtype=int)
        if (available < max_table[i]).any():
            print("输入有误,重新输入")
            i -= 1
    # 输入已分配资源
    for i in range(n):
        temp = input("输入进程 P{} 的已分配资源:".format(i)).split()
        allocation[i] = np.array(temp, dtype=int)
        if (max_table[i] < allocation[i]).any():
            print("输入有误,重新输入")
            i -= 1
    need = max_table - allocation   # 剩余需求矩阵
    # 计算剩余资源
    for i in allocation:
        available -= i
    printTable(available, max_table, allocation, need, n)
    while (need != 0).any():
        proc_ind, req = input("输入接下来的请求: ").split(',')
        proc_ind = int(proc_ind[1:])
        req = np.array(req.split(), dtype=int)
        # 判断合法性
        if (req > max_table[proc_ind]).any():
            print("输入有误,重新输入")
        # 判断安全性
        else:
            available -= req
            allocation[proc_ind] += req
            need[proc_ind] -= req
            if security(available.copy(), need, allocation):
                printTable(available, max_table, allocation, need)
                continue
            else:
                print("不安全,不能分配")
                available += req
                allocation[proc_ind] -= req
                need[proc_ind] += req
相关文章
|
10天前
|
算法 大数据 调度
深入理解操作系统:进程管理与调度策略
【4月更文挑战第27天】 在现代计算机系统的核心,操作系统扮演着至关重要的角色。它不仅管理硬件资源,还为应用程序提供必要的服务。其中,进程管理是操作系统的一个关键组成部分,它负责创建、执行以及终止进程。而进程调度策略则是确保系统高效运行的基石。本文将探讨操作系统中的进程管理机制及其调度策略,分析它们如何影响系统性能,并讨论当前的挑战及未来可能的发展方向。
|
7天前
|
算法 大数据 Linux
深入理解Linux内核的进程调度机制
【4月更文挑战第30天】操作系统的核心职能之一是有效地管理和调度进程,确保系统资源的合理分配和高效利用。在众多操作系统中,Linux因其开源和高度可定制的特点,在进程调度机制上展现出独特优势。本文将深入探讨Linux内核中的进程调度器——完全公平调度器(CFS),分析其设计理念、实现原理及面临的挑战,并探索未来可能的改进方向。
|
7天前
|
算法 Linux 调度
探索Linux内核:进程调度的奥秘
【4月更文挑战第30天】 在多任务操作系统中,进程调度是核心功能之一,它决定了处理器资源的分配。本文深入分析了Linux操作系统的进程调度机制,从调度器的基本原理到复杂的调度策略,以及它们如何影响系统性能和用户体验。通过剖析进程优先级、时间片分配以及实时性要求等方面,揭示了Linux如何在众多运行着的进程中做出快速而公平的决策,确保系统的高效与稳定运行。
|
7天前
|
算法 安全 大数据
深入理解操作系统之进程管理与调度
【4月更文挑战第30天】 在现代计算机系统中,操作系统的核心职能之一是高效地管理和调度进程,确保系统的稳定运行和资源利用的最优化。本文将深入探讨操作系统中的进程管理机制、进程调度算法以及它们在多核处理器环境下的实现。通过对不同操作系统中进程调度策略的比较,我们将揭示进程管理的关键技术和性能权衡,同时对未来操作系统设计中可能面临的挑战进行展望。
|
8天前
|
算法 Linux 调度
深入理解操作系统之进程调度策略
【4月更文挑战第29天】 在多任务操作系统中,进程调度策略是核心组件之一,它决定了处理器资源的分配。不同于常规的摘要重述内容,本文将通过分析不同的进程调度算法,揭示它们对系统性能的影响,以及在不同应用场景下的适用性。文章首先概述了操作系统中的进程概念和调度的重要性,然后详细探讨了几种主流的调度策略,包括先来先服务(FCFS)、短作业优先(SJF)、轮转调度(RR)及多级反馈队列(MFQ)。最后,文章评估了这些策略在现代操作系统中的应用,并提出了未来可能的发展趋势。
|
8天前
|
机器学习/深度学习 人工智能 算法
深入理解操作系统的进程调度策略
【4月更文挑战第29天】 本文旨在探讨操作系统中的核心机制之一——进程调度。通过对不同进程调度算法的比较分析,我们不仅揭示了各种算法背后的原理和设计理念,还讨论了它们在现代多核处理器环境下的性能表现和适用场景。文章首先回顾了进程调度的基本概念,随后详细阐述了几种经典调度策略,包括先来先服务、短作业优先以及时间片轮转等。接着,本文通过模拟实验对比了这些策略在不同工作负载下的表现,并提出了改进的调度方案。最后,文章展望了未来进程调度研究的方向,特别是在人工智能和机器学习领域的应用前景。
|
8天前
|
算法 安全 调度
深入理解操作系统:进程管理与调度策略
【4月更文挑战第29天】 在本文中,我们将深入探讨操作系统的核心组件之一——进程管理。首先,我们将解释进程的概念以及它们在操作系统中的作用。接着,我们将详细讨论不同的进程调度策略,包括先来先服务、短作业优先和轮转调度等。此外,我们还将分析这些调度策略的优缺点,并探讨它们在不同场景下的应用。最后,我们将展望操作系统进程管理的未来发展趋势。
|
8天前
|
算法 Linux 调度
深入理解操作系统的进程调度策略
【4月更文挑战第29天】 在多任务操作系统中,进程调度策略是核心组件之一,它直接关系到系统资源的利用效率及用户体验。本文将探讨现代操作系统中的几种主要进程调度算法——从简单的先来先服务(FCFS)到复杂的多级反馈队列(MLFQ)和公平共享调度(Fair Share Scheduling, FSS)。我们将剖析每种策略的工作原理、优势、局限性以及它们在实际操作系统中的应用实例。通过比较分析,文章旨在为读者提供一个全面的视角,以理解不同调度策略如何影响操作系统的性能和行为。
|
9天前
|
算法 调度 UED
深入理解操作系统中的进程调度策略
【4月更文挑战第28天】 在多任务操作系统中,进程调度策略是决定系统性能和响应能力的关键因素。本文将探讨操作系统中进程调度的基本原理、不同调度算法的特点及其适用场景,并通过分析比较它们的优缺点,提供一个全面的视角来理解操作系统如何管理运行中的进程。通过深入了解这些调度策略,读者可以更好地把握操作系统的行为模式,以及如何在特定应用中选择合适的调度策略以优化系统表现。
|
9天前
|
资源调度 算法 Linux
深入理解操作系统之进程管理与调度
【4月更文挑战第28天】 在现代计算机系统的核心,操作系统承担着资源管理和任务协调的重要职责。本文将深入探讨操作系统的心脏——进程管理及其调度机制。我们将剖析进程的概念、生命周期以及它们如何在多任务环境中被操作系统有效调度。文中不仅涉及理论模型,更通过实际案例分析现代操作系统如Linux和Windows在进程管理上的异同。此外,还将讨论如何通过优化调度算法来提升系统性能和响应速度,以及这些方法对未来操作系统设计的启示。