我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#如何实现银行家算法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#如何实现银行家算法

这篇文章给大家分享的是有关C#如何实现银行家算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1.死锁

死锁,顾名思义,是一种锁住不可自行解开的死局。

在操作系统中,“死锁”用于描述资源分配时,进程互相抢占资源,又因为需求的资源被别的进程抢占,只好互相等待,以至于等待循环中的所有进程均无法正常运行的情况。

死锁形成需要四个条件,这四个条件缺少一个,就不会形成死锁。

死锁的四个条件

1)互斥条件

    即对于某资源在一段时间内仅允许一个进程占有使用。

2)占有且等待条件/请求和保持条件

    在进程已经占有一个或多个资源的情况下,若它仍申请新的资源,在等待获得新的资源时,进程仍会继续占有旧有资源,不会主动释放。

3)不可抢占条件

    直到占有该资源的进程使用完毕之前,其他任何进程均不应该强行抢占该资源。

4)循环等待条件

    若干个进程之间形成了一个等待循环。

2.安全状态

若针对目前资源分配情况,系统可以找到某种次序为进程分配资源,使得所有进程能够依次运行成功,则称系统此时的分配状态是安全的,分配资源的次序称为“安全序列”。

安全状态时系统中无死锁,所以所有避免死锁的算法都尽可能地使系统进入安全状态。

值得注意的是,即使是安全状态下的系统,如果资源分配不当,仍然可以使系统变为不安全状态。

3.银行家算法

1)设计思想

在系统中,进程发起一项资源分配请求,由系统检查是否可以满足该分配请求,若可以,应暂时满足该请求,并查看此时系统是否仍是安全状态。

2)程序流程图

可以分为三个功能模块,第一个模块检查需求是否可以被满足,第二个模块检查系统是否安全,第三个模块是主程序,通过调用前两个模块实现资源分配或请求驳回。

C#如何实现银行家算法

C#如何实现银行家算法

3)数据结构

设有m种资源,n个进程。

int[] Available[m] 系统内可用资源

int[,] Max[n,m] 进程对每种资源的最大需求

int[,] Allocation[n,m] 已分配给各个进程的资源

int[,] Need[n,m] 目前各个进程对各个资源的需求数

[显然有Need=Max-Allocation]

int[,] Require[m] 对于各种资源的请求函数

bool[] Finish[n] 进程是否可以成功运行的标志

int[] Work[m] 用于分配资源的向量
[定义:Work=Available-Require]

4)窗体设计

C#如何实现银行家算法

5)窗体代码

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms; namespace bank{    public partial class Form1 : Form    {        public int n = 1;//进程数目        public int m = 1;//资源分类数        int[,] Allocation;        int[,] Max;        int[] Available;        int[,] Need;        int[] Require;        string order;//输出安全序列         public Form1()        {            InitializeComponent();         }         private void button1_Click(object sender, EventArgs e)        {            n = Convert.ToInt32( tb_proNum.Text);            m = Convert.ToInt32(tb_resouseClass.Text);        }         private void button2_Click(object sender, EventArgs e)        {            if (rb_allocation.Checked)            {                tb_output.Text  += "Allocation矩阵\r\n";                string[] str = tb_datainput.Text.Split(' ');                  Allocation = new int[n, m];                for (int i = 0; i < n; i++)                {                    tb_output.Text+="\r\n";                   string[] temp= str[i].Split(',');                   for (int j = 0; j < m; j++)                   {                       Allocation[i, j] = Convert.ToInt32(temp[j]);                       tb_output.Text += " " + Allocation[i, j];                   }                }                            }            else if (rb_available.Checked)            {                tb_output.Text += "\r\nAvailable向量\r\n";                string[] str = tb_datainput.Text.Split(',');                Available = new int[m];                for (int i = 0; i < m; i++)                {                    Available[i] = Convert.ToInt32(str[i]);                    tb_output.Text += " " + Available[i];                }                    }            else//输入max矩阵            {                tb_output.Text += "\r\nMax矩阵\r\n";                string[] str = tb_datainput.Text.Split(' ');                Max = new int[n, m];                                for (int i = 0; i < n; i++)                {                    tb_output.Text+="\r\n";                    string[] temp = str[i].Split(',');                    for (int j = 0; j < m; j++)                    {                        Max[i, j] = Convert.ToInt32(temp[j]);                        tb_output.Text += " " + Max[i, j];                    }                }            }        }         private void button3_Click(object sender, EventArgs e)        {            int PID = 0;            bool[] finish = new bool[n];            for (int i = 0; i < n; i++)            {                finish[i] = false;            }            if (tb_pid.Text == "")                ;            else                PID = Convert.ToInt32(tb_pid.Text) ;              int bigger_1 = 0;            int bigger_2 = 0;            ///计算Need矩阵///            Need = new int[n, m];            tb_output.Text += "\r\nNeed矩阵\r\n";            for (int i = 0; i < n; i++)            {                tb_output.Text += "\r\n";                for (int j = 0; j < m; j++)                {                    Need[i, j] = Max[i, j] - Allocation[i, j];                    tb_output.Text += " " + Need[i, j];                }            }            ///输入Require///            if (tb_require.Text == "")            {                Require = new int[m];                for (int i = 0; i < m; i++)                { Require[i] = 0; }                PID = 0;                tb_output.Text += "\r\n检测当前状态是否安全中…\r\n";                if (CheckSecure(Available, finish, Need, Allocation))                {                    tb_output.Text += "系统目前安全"+"安全序列"+order;                }                else                {                    tb_output.Text += "系统目前不安全";                 }            }            else            {                string[] str = tb_require.Text.Split(',');                Require = new int[m];                for (int i = 0; i < m; i++)                {                    Require[i] = Convert.ToInt32(str[i]);                    if (Require[i] > Need[PID, i])                        bigger_1++;                    if (Require[i] > Available[i])                        bigger_2++;                 }                 ///检查///                if (bigger_1 != 0)                {                    tb_output.Text += "\r\n错误:进程申请的资源多于说明的最大量,系统无法满足\r\n";                }                else if (bigger_2 != 0)                {                    tb_output.Text += "\r\n进程" + tb_pid.Text + "暂时阻塞\r\n";                }                else                {                    int[] temp_available = Available;                    int[,] temp_allocation = Allocation;                    int[,] temp_need = Need;                     for (int j = 0; j < m; j++)                    {                        temp_available[j] -= Require[j];                        temp_allocation[PID, j] += Require[j];                        temp_need[PID, j] -= Require[j];                     }                     if (CheckSecure(temp_available, finish, temp_need, temp_allocation))                    {                        Available = temp_available;                        Allocation = temp_allocation;                        Need = temp_need;                        tb_output.Text += "\r\n系统处于安全状态,且已经分配完毕\r\n"+"安全序列"+order ;                     }                    else                    { tb_output.Text += "\r\n该请求将导致系统处于不安全状态,已经撤销分配\r\n"; }                 }            }        }///检查安全状态/// public bool CheckSecure(int[] work,bool[] finish,int[,] temp_need,int[,] temp_allocation)        {            int num = 0;//need[i]<=work[i]的个数            order ="";            int[] wor = work;            bool[] finis = finish;            int[,] temp_nee = temp_need;            int[,] temp_allocatio = temp_allocation;int K=0;while (K < 10){    for (int i = 0; i < n; i++)    {        if (!finis[i])        {            for (int j = 0; j < m; j++)            {                if (temp_nee[i, j] <= wor[j])                    num++;             }            if (num == m)            {                for (int j = 0; j < m; j++)                {                    wor[j] += temp_allocatio[i, j];                }                finis[i] = true;                order += i;                                num = 0;             }            else num = 0;          }        else            if (checkFinish(finis))                return true;     }    K++;}                             if (checkFinish(finis))                            return true;                        else                return false;            }             public bool checkFinish(bool[] f)            {int num=0;                foreach (bool k in f)                {                    if (k)                        num++;                                    }                if (num == f.Length)                    return true;                else return false;            }     }}

计算效果如下:

C#如何实现银行家算法

3.总结

实现功能

允许输入数据(只输入Available,Max,Allocation即可,Need可以自动计算,矩阵同一行元素之间用“,”隔开,换行时用空格隔开)

使用银行家算法进行安全检查(若未提出请求,则应使进程号与Require后面的textbox内容为空,点击“提出请求”按钮即可检查当前系统安全状态)

输出状态结果

输出安全序列(注:输出的是进程号,默认序号从0开始)

不足之处

未写出完整的约束

不能输出分配成功后的系统状态
交互不够人性化,例如没有在输出文本框中加入滚动条,不方便使用者查看结果

问题

例子中经过程序计算后的need矩阵中出现了负数,不知道是为什么,正在排查错误。

关键点

——向量比较:银行家算法中的向量大小比较与数学中的向量大小比较(范数比较)不同,只有向量a中的所有分量均大于向量b,才可以称为向量a大于向量b。向量比较主要用在检查Require是否合法,本例中使用for循环对于两向量的各个分量进行比较,设置一个初始值为0的信号变量,若任一分量小于对应分量,则将信号变量++,循环结束后只需要检查信号变量是否为0即可知道是否前者大于后者。
——矩阵输入:使用split方法,将字符串按照给定符号(char,char[])分隔开,并赋给一个给定大小的数组,在本例中使用逗号和空格分开了不同列不同行的元素,定义全局变量m与n,在给数组赋值前需要使用mn初始化数组大小。

——使用临时变量代替真实变量,方便恢复变量数值。因为银行家算法中,若资源分配后系统不安全,要求系统必须撤销所有分配,所以使用临时变量可以避免大量的恢复运算,即使经过检查后,系统为安全状态,也只需要将临时变量的值赋给真实变量即可。

感谢各位的阅读!关于“C#如何实现银行家算法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#如何实现银行家算法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#如何实现银行家算法

这篇文章给大家分享的是有关C#如何实现银行家算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.死锁死锁,顾名思义,是一种锁住不可自行解开的死局。在操作系统中,“死锁”用于描述资源分配时,进程互相抢占资源,又因
2023-06-15

银行家算法 C语言实现

以下是银行家算法在C语言中的实现:```c#include // 资源数量#define M 3// 进程数量#define N 5void calculateNeed(int need[N][M], int max[N][M], int
2023-09-28

C++ OpenCV如何实现银行卡号识别功能

这篇文章主要介绍了C++ OpenCV如何实现银行卡号识别功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、获取模板图像如图所示,这是我们的模板图像。我们需要将上面的字符
2023-06-28

C语言如何实现银行ATM存取款系统

这篇文章给大家分享的是有关C语言如何实现银行ATM存取款系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、课程设计的目的掌握C语言程序设计的基础知识、基本理论、原理和实现技术。二、课程设计的题目银行ATM存取
2023-06-25

java如何实现简单银行ATM系统

这篇文章主要介绍了java如何实现简单银行ATM系统的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java如何实现简单银行ATM系统文章都会有所收获,下面我们一起来看看吧。#ATM系统##功能模拟银行ATM机系
2023-06-30

如何基于python实现银行管理系统

这篇文章将为大家详细讲解有关如何基于python实现银行管理系统,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬
2023-06-14

C++如何实现并查集算法

这篇文章主要介绍了C++如何实现并查集算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、并查集的初始化并查集是用一个数组实现的。首先先定义一个数组:int father[
2023-06-29

C#如何实现抢红包算法

今天小编给大家分享一下C#如何实现抢红包算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。二倍均值法(公平版) 发出一个固定
2023-06-29

Android如何实现仿银行客户签名功能

这篇文章将为大家详细讲解有关Android如何实现仿银行客户签名功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先需要一个自定义view用来签字使用,可以修改颜色和画笔的粗细,可以擦拭重新画packa
2023-05-31

c语言如何实现排序算法

小编给大家分享一下c语言如何实现排序算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.选择排序-简单选择排序选择排序是最简单的一种基于O(n2)时间复杂度的排
2023-06-15

C++如何实现希尔排序算法

这篇“C++如何实现希尔排序算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++如何实现希尔排序算法”文章吧。1.代码模
2023-06-26

C#中如何实现AES算法加密

这篇文章主要介绍了C#中如何实现AES算法加密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中如何实现AES算法加密文章都会有所收获,下面我们一起来看看吧。先上效果图文件和加密文件之间的转换。先添加辅助类
2023-07-05

C++如何实现归并排序算法

这篇文章将为大家详细讲解有关C++如何实现归并排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。归并算法开始首先要对一段要有序的数字进行排序void merg_sort(int* a, int fbe
2023-06-25

C#算法如何实现两数之和

小编给大家分享一下C#算法如何实现两数之和,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!题目给定一个整数数组 nums和一个目标值 target,请你在该数组中找
2023-06-26

如何进行C#算法一道面试题的程序实现

这篇文章将为大家详细讲解有关如何进行C#算法一道面试题的程序实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#算法一道面试题的解答有很多的方法,这里只向你介绍一种,那么首先让我们看看题目
2023-06-18

Java如何实现银行账户管理子系统

本文小编为大家详细介绍“Java如何实现银行账户管理子系统”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何实现银行账户管理子系统”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。所用到的知识点:面向对象基
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录