计算机操作系统实验:银行家算法模拟

news2024/9/27 12:08:11

目录

  • 前言
  • 实验目的
  • 实验内容
  • 实验原理
  • 实验过程
      • 代码如下
      • 代码详解
      • 算法过程
      • 运行结果
  • 总结

前言

本文是计算机操作系统实验的一部分,主要介绍了银行家算法的原理和实现。银行家算法是一种用于解决多个进程对多种资源的竞争和分配的算法,它可以避免死锁和资源浪费的情况。银行家算法的思想是模拟银行家对贷款申请的处理过程,即在保证系统安全性的前提下,尽可能满足每个进程的资源需求。本文将通过C语言编程,实现一个简单的银行家算法模拟程序,并展示其运行结果和分析。

实验目的

(1)理解利用银行家算法避免死锁的问题;
(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,并检测机算和笔算的一致性。
(3)理解和掌握安全序列、安全性算法

实验内容

(1)编程实现银行家算法
(2)编程实现安全性算法
基本要求:
(1)能够根据给定的资源分配情况,及某进程提出的资源请求,通过算法得出是否能够进行分配。
(2)如能分配,需得出相应的安全序列。

实验原理

银行家算法是一种死锁避免算法,它通过模拟所有资源的预定最大可能数量的分配来测试安全性,然后在决定是否分配之前进行“s-state”检查以测试所有其他未决活动的可能死锁条件应该允许继续²。

银行家算法之所以得名,是因为该算法可用于银行系统,以确保银行不会耗尽资源,因为银行永远不会以无法再满足要求的方式分配资金所有客户的需求²。

以下是该算法的工作原理¹:

  1. 系统跟踪可用资源总量和分配给每个进程的资源。
    2.当一个进程请求一些资源时,系统检查它是否可以分配它们而不会导致死锁。
  2. 如果可以安全地授予请求(即不会造成死锁),系统会分配资源并更新其记录。
  3. 如果不能安全地授予请求(即会导致死锁),系统将拒绝该请求。

实验过程

代码如下

#include<stdio.h>
int main()
{
    int p, r, i, j, k;
    printf("Enter number of processes: ");
    scanf("%d", &p);
    printf("Enter number of resources: ");
    scanf("%d", &r);
    int alloc[p][r], max[p][r], avail[r], need[p][r], finish[p];
    for(i=0;i<p;i++)
        finish[i]=0;
    printf("Enter allocation matrix:\n");
    for(i=0;i<p;i++)
        for(j=0;j<r;j++)
            scanf("%d", &alloc[i][j]);
    printf("Enter max matrix:\n");
    for(i=0;i<p;i++)
        for(j=0;j<r;j++)
            scanf("%d", &max[i][j]);
    printf("Enter available matrix:\n");
    for(i=0;i<r;i++)
        scanf("%d", &avail[i]);
    for(i=0;i<p;i++)
        for(j=0;j<r;j++)
            need[i][j]=max[i][j]-alloc[i][j];
    int count=0;
    while(count!=p)
    {
        int flag=0;
        for(i=0;i<p;i++)
        {
            if(finish[i]==0)
            {
                int c=0;
                for(j=0;j<r;j++)
                    if(need[i][j]<=avail[j])
                        c++;
                if(c==r)
                {
                    finish[i]=1;
                    flag=1;
                    count++;
                    for(j=0;j<r;j++)
                        avail[j]+=alloc[i][j];
                }
            }
        }
        if(flag==0)
            break;
    }
    if(count==p)
        printf("\nSafe sequence exists.\n");
    else
        printf("\nSafe sequence does not exist.\n");
}

代码详解

该算法是操作系统中使用的死锁避免算法。银行家算法用于通过在将资源分配给进程之前检查系统是否处于安全状态来避免死锁。该算法通过跟踪每个进程的资源使用情况并识别可能导致死锁的冲突来工作。您提供的代码从用户那里获取进程数、资源、分配矩阵、最大矩阵和可用矩阵的输入。然后它计算需求矩阵并检查是否存在安全序列。如果存在安全序列,它会打印“存在安全序列”。否则它会打印“安全序列不存在。”

下面是代码的详细解释:

  • 代码首先从用户那里获取进程和资源数量的输入。
  • 然后它接受分配矩阵的输入,该矩阵表示分配给每个进程的资源数量。
  • 然后它接受最大矩阵的输入,该矩阵表示每个进程可以请求的最大资源数。
  • 然后它接受可用矩阵的输入,该矩阵表示每种资源类型的可用资源数量。
  • 然后计算需求矩阵,该矩阵表示每个流程所需的资源数量。
  • 它初始化一个名为 finish 的数组,该数组跟踪进程是否已完成执行。
  • 然后它进入一个 while 循环,该循环一直运行到所有进程都完成执行。
  • 在 while 循环内,它通过检查其需求是否小于或等于可用资源来检查是否存在可以安全执行的进程。
  • 如果存在这样的进程,它会执行该进程并释放分配给它的资源。
  • 如果不存在这样的过程,它会跳出 while 循环。
  • 最后,它检查是否所有进程都已完成执行。如果是,它会打印“存在安全序列”。否则它会打印“安全序列不存在。”

算法过程

该算法首先从用户那里获取进程和资源数量的输入。
然后它为分配矩阵获取输入,该矩阵表示分配给每个进程的资源数量。
然后它接受最大矩阵的输入,该矩阵表示每个进程可以请求的最大资源数。
然后它为可用矩阵获取输入,该矩阵表示每种资源类型的可用资源数量。
然后它计算需求矩阵,该矩阵表示每个进程所需的资源数量。
它初始化一个名为 finish 的数组,该数组跟踪进程是否已完成执行。
然后它进入一个 while 循环,该循环一直运行到所有进程都完成执行。
在 while 循环内,它通过检查其需求是否小于或等于可用资源来检查是否存在可以安全执行的进程。
如果存在这样的进程,它会执行该进程并释放分配给它的资源。
如果不存在这样的过程,它就会跳出 while 循环。
最后,它检查是否所有进程都已执行完毕。如果是,它会打印“存在安全序列”。否则它会打印“安全序列不存在。”

运行结果

在这里插入图片描述

总结

本文是对计算机操作系统实验中银行家算法模拟的总结。银行家算法是一种用于避免死锁和资源浪费的动态分配算法,它模拟了银行家在贷款时的策略。银行家算法的基本思想是,当一个进程请求资源时,系统先判断该请求是否会导致系统进入不安全状态,如果是,则拒绝该请求;如果不是,则分配资源,并检查系统是否还有足够的资源满足其他进程的最大需求,如果有,则继续运行;如果没有,则撤销刚才的分配,并让该进程等待。

在实验中,我们使用C语言编写了一个银行家算法模拟程序,该程序可以接收用户输入的进程数、资源种类、每种资源的总数、每个进程已分配的资源数、每个进程还需要的资源数等信息,并根据银行家算法判断系统是否处于安全状态,以及是否可以满足某个进程的资源请求。我们通过多组测试数据验证了程序的正确性和鲁棒性,并对程序的运行结果进行了分析和总结。

通过这次实验,我们加深了对计算机操作系统中资源管理和死锁避免的理解,掌握了银行家算法的原理和实现方法,提高了编程和调试的能力,也体会到了动态分配算法在实际应用中的重要性和优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

写作业用白光还是暖光?盘点色温4000K的护眼台灯

台灯的白光或者暖光指的是台灯的色温&#xff0c;低色温的光线看起来发黄发红&#xff0c;高色温的光线发白发蓝。 如果灯光的光源是高品质光源&#xff0c;本身没有蓝光问题&#xff0c;那么色温的选择对护眼的影响是比较少的&#xff0c;更多的是对人学习工作状态&#xff0c…

TIM-编码器—STM32

TIM-编码器—STM32 EncoderInterface 编码器接口 编码器接口可接收增量(正交) 编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度 每个高级定时器和通用定时器都拥有1个编码器…

transformer在计算机视觉中的应用

Transformer 在计算机视觉中的应用 论文地址&#xff1a; https://arxiv.org/abs/1706.03762 Vision Transformer An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 代码地址&#xff1a; https://github.com/google-research/vision_transfor…

总结840

学习目标&#xff1a; 5月&#xff08;完成张宇强化18讲&#xff0c;背诵25篇短文&#xff0c;熟词僻义300词基础词&#xff09; 每日必复习&#xff08;5分钟&#xff09; 看了进步本中的一道数列题 学习内容&#xff1a; 暴力英语&#xff1a;继续艾玛沃特森的演讲&#…

Winsw实现springboot的jar包的windows服务,实现开机自启动

在windows上运行Springboot打包jar&#xff0c;如何后台运行及注册成Windows服务&#xff1f; 一、确认.NET Framework版本 1、在地址栏上输入“C:\Windows\Microsoft.NET\Framework”&#xff0c;按回车键 2、可以看到.NET Framework版本。可以看到最高版本为4.0 二、winsw &…

node 开发

文章目录 快速认识node开始使用node编程hello world模块和包什么是模块创建和加载模块创建包node.js 的包管理本地模式 和全局模式创建全局连接包的发布 调试 快速认识node 开始使用node编程 hello world 打开你的文本编辑器&#xff0c;在上面输入&#xff1a; console。l…

【Java EE】-使用Fiddler抓包以及HTTP的报文格式

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 在满园弥漫的沉静的光芒之前&#xff0c;一个人更容易看到时间&#xff0c;并看到自己的身影。——史铁生《我与地坛》 主要内容&#xff1a;使用FIddler抓包的…

船舶建造概论(船舶建造工艺任务与现代造船模式)

船舶建造概论 1 船舶建造概论1.1 船舶建造工艺主要任务1.2 船舶建造流程&#xff08;1&#xff09;钢材料预处理&#xff08;2&#xff09; 钢材料加工&#xff08;3&#xff09;分段制作&#xff08;4&#xff09;总段制作&#xff08;5&#xff09;船台合拢&#xff08;6&…

【漏洞复现】Apache Superset 未授权访问漏洞(CVE-2023-27524)

文章目录 前言声明一、Apache Superset 简介二、影响范围三、漏洞复现四、整改建议 前言 Apache Superset 存在未授权访问漏洞&#xff0c;攻击者可利用该漏洞验证和访问未经授权的资源。 声明 本篇文章仅用于漏洞复现与技术研究&#xff0c;请勿利用文章内的相关技术从事非法…

2.计算机基础

文章目录 1.冯诺依曼体系结构&#xff08;1&#xff09;冯诺依曼体系结构思想&#xff08;2&#xff09;五大部件介绍&#xff08;3&#xff09;现代计算机逻辑架构 2.现代计算机硬件图 和 CPU&#xff08;1&#xff09;现代计算机硬件图&#xff08;2&#xff09;CPU运算器结构…

微软正式宣布 Win10 死刑,Win11 LTSC要来了

微软在 2015 年带来了 Windows 10&#xff0c;PC 操作系统也由此进入到一个新的篇章。 如此前每代新系统一样&#xff0c;Windows 10 发布之初&#xff0c;稳定性不足&#xff0c;BUG 众多。 全新的界面设计、交互逻辑以及操作习惯上的强行改变让其很长一段时间都不那么受待见。…

static的常见用法

参考链接&#xff1a;https://blog.csdn.net/guotianqing/article/details/79828100 C语言 作用&#xff1a;提高代码的模块化&#xff0c;提高代码的可读性。 普通的局部变量&#xff1a;在最开始的时候不会进行初始化&#xff0c;存储在栈空间&#xff0c;使用完毕就会释放…

100ASK_全志V853-PRO开发板 环境配置及编译烧写

0.前言 本章主要介绍关于100ASK-V853-PRO开发板的Tina SDK包的下载和编译打包生成镜像&#xff0c;并将镜像烧录到100ASK-V853-PRO开发板上。在进行100ASK-V853-PRO开发板的环境配置前需要获取配置虚拟机系统&#xff0c;可以参考&#xff1a;https://dongshanpi.com/Dongshan…

「蓝桥杯」扫地机器人

扫地机器人 题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 N 个方格区域组成&#xff0c;如下图所示。 走廊内部署了 K 台扫地机器人&#xff0c;其中第 i 台在第 A_i 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中&#xff0c;并将该区域清扫干…

图的着色学习

图的边着色 排课表问题&#xff1a;设有m位教师&#xff0c;n个班级&#xff0c;教师xi要给班级yj上pij节课&#xff0c;求如何在最少节次排完所有课。 图论模型&#xff1a;令X{x1,x2,…,xm}&#xff0c;Y{y1,y2,…,yn}&#xff0c;xi与yj间连pij条边&#xff0c;得偶图G(X,…

【prism系列】子窗口中如何实现区域(Region)管理

前言 在之前系列文章《Region的用法》中&#xff0c;我提到无法在子窗口中实现区域管理&#xff0c;最近经过尝试发现其实是可以的&#xff0c;只是少了一个步骤而已&#xff01;Region具体细节还请参考这篇。 【Prism系列】Region的用法_prism region_code bean的博客-CSDN博…

一文全览各种 ES 查询在 Java 中的实现

ElasticSearch 进阶&#xff1a;一文全览各种 ES 查询在 Java 中的实现 以下为摘录自用&#xff0c;非本人撰写 本文基于elasticsearch 7.13.2版本&#xff0c;es从7.0以后&#xff0c;发生了很大的更新。7.3以后&#xff0c;已经不推荐使用TransportClient这个client&#xf…

浅谈自动驾驶技术

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

【Linux】5. 开发工具的使用(gcc/gdb/makefile)

Linux编译器-gcc/g使用 1. 复习编译链接过程 2. 理解选项当中的含义 这些选项难记住&#xff0c;怎么办&#xff1f; – ESc - iso(对应) gcc选项 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面-S 编译到汇编语言不进行汇编和链接-c 编译到目标代码-o …

基于OpenHarmony开发的健康生活应用(ArkTS)

健康生活应用&#xff08;ArkTS&#xff09; 介绍 本篇Codelab介绍了如何实现一个简单的健康生活应用&#xff0c;主要功能包括&#xff1a; 用户可以创建最多6个健康生活任务&#xff08;早起&#xff0c;喝水&#xff0c;吃苹果&#xff0c;每日微笑&#xff0c;刷牙&#…