操作系统课设-银行家算法VS2022

2024-01-25 21:30

本文主要是介绍操作系统课设-银行家算法VS2022,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1 目的和要求

2 银行家算法的数据结构

3 进程请求时的资源处理

4 安全性算法的设计思路

5 调试与分析

6 C语言源代码

7 心得体会


1 目的和要求

银行家算法是避免死锁的一种重要方法,能够有效的在资源分配的过程中,对系统的安全性进行检测。通过银行家算法设计与实现,可以加深对死锁的理解,掌握死锁的预防、避免、检测和解除的基本原理,重点掌握死锁的避免方法━银行家算法。初步具有研究、设计、编制和调试操作系统模块的能力。

能够考虑社会、健康、安全、法律、文化及环境等因素的影响,针对银行家算法避免死锁进行建模,设计实验方案,运用恰当的集成开发工具编程模拟实现上述算法。

对程序要求:

  1. 有录入界面,动态录入进程个数、资源种类数、诸进程对各类资源的最大需求、TO时刻系统为诸进程已分配的资源数以及系统中各类资源的资源总数;
  2. 能够判断TO时刻系统是否安全,进程之间能否无死锁的运行下去,若能输出安全序列;
  3. 有输出界面,能够从录入界面模拟进程又提出新的申请,根据银行家算法判断请求是否能得到满足,并输出当前时刻下诸进程对各类资源的需求列表及系统可用资源数,若能输出安全序列,若不能分配输出无法分配的原因;

对报告要求:

  1. 报告要体现算法设计和分析的能力,要体现建模及算法设计与实现的过程,形成设计文档;
  2. 要对各种资源请求情况的运行结果截图并分析实验数据,分析产生不同结果的原因,得出有效结论;
  3. 对本次设计进行总结,遇到什么问题、是如何解决的?总结实验仿真的局限性,指出实验设计方案的完善方向;
  4. 报告要体现科技强国的核心价值观,科技报国的家国情怀和使命担当。具有探索未知、追求真理、勇攀科学高峰的科学精神以及以改革创新为核心的时代精神。

2 银行家算法的数据结构

可用资源向量Available [m]

m为系统中资源种类数,Available[j]=k表示系统中第j类资源数为k个。

最大需求矩阵Max[n][m]

n为系统中进程数,Max[i][j=表示进程i对j类资源的最大需求数为k。

分配矩阵Allocation[n][m]

Allocation[i][j]=k表示进程i已分得j类资源的数目为k个。

需求矩阵Need[n][m]

Need[i][j]=k 表示进程i还需要j类资源k个。

Need[i][j]=Max[i][j]-Allocation[i][j]

3 进程请求时的资源处理

假设在进程并发执行时进程i提出请求j类资源k个后,表示为Request,[j]=k,系统按下述步骤进行安全检查:

如果Request,≤Need;则继续以下检查,否则显示需求申请超出最大需求值的错误。

〉如果Request,≤Available则继续以下检查,否则显示系统无足够资源,P;阻塞

等待。

系统试探把要求的资源分配给进程i并修改有关数据结构的值:

Available = Available-Request, ;

Allocation;=Allocation; +Request; ;Need;=Need,-Request;;

系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态,若安全,才正式将资源分配给进程i,以完成本次分配;否则将试探分配作废,恢复原来的资源分配状态,让进程P;等待。

4 安全性算法的设计思路

安全性算法

A.设置完成标志向量Finish[n]。

初始化:Finish[i] = false表示i进程尚末完成

B.从进程集合n设置Work[m]表示系统可提供给进程的各类资源数目。初始化:

Work = Available,

中找到一个能满足下述二个条件:Finish[i] = false , Need;≤Work如找到则执行步骤C,找不到则执行步骤D

C.当进程i获得资源后可顺利执行直到完成,并释放出分配给它的资源,表示如下:

work = work+Allocation; ; Finish[i]=true ;转执行步骤B。

D.如果所有的Finish[i]=ture,则表示系统处于安全状态,否则系统处于不安全状态。

5 调试与分析

1.资源的初始分配(图1)

图1

2.尝试给P0分配资源2,2,提示请求资源数大于可利用资源数(图2)

图2

3.尝试给P0分配资源3,2提示请求资源数大于所需资源数(图3)

图3

4.尝试给P0分配资源0,0,提示不安全撤销了分配(图4)

图4

5.尝试给P2分配资源1,1,提示安全,可利用资源和对应进程的资源需求随即发生更新(图5.1)(图5.2)

图5.1

图5.2

6.继续给P2分配资源2,0,进程达到需求结束后释放资源(图6.1)(图6.2)

图6.1

图6.2

7.给P1分配资源2,2,进程达到需求结束后释放资源(图7.1)(图7.2)

图7.1

图7.2

8.给P0分配资源2,2,进程达到需求结束后释放资源(图8.1)(图8.2)

图8.1

图8.2

6 C语言源代码

安全性算法

int safety(int m, int n)//m进程数,n资源种类数
{int i, j, k, l, flag;int safe[MAX] = { 0 };//安全序列int count = 0; //安全序列个数for (i = 0; i < m; i++) {finish[i] = 0; //初始化完成标志 work[i] = available[i]; //可利用资源量初始化 }while (1){flag = 0; //完成标志for (j = 0; j < m; j++) {if (finish[j] == 0) //未完成进程{for (k = 0; k < n; k++){if (need[j][k] > work[k]) //判断资源是否满足 break;}if (k == n) //资源满足{for (l = 0; l < n; l++)work[l] += allocation[j][l];//更新可利用资源量safe[count] = j; //加入安全序列count++;finish[j] = 1; //更新完成标志 flag = 1;//更新完成标志}}} if (flag == 0) //无进程可运行 break;} if (count == m) //进程完成 {printf("安全序列为:");for (i = 0; i < m; i++)printf("P%d ", safe[i]);printf("\n安全\n");return 1;}else //不安全{printf("不安全\n");return 0;}
}

请求资源 

int requestResource(int p, int m, int n)//m进程数,n资源种类数
{int i, j, k; //判断请求资源是否满足 for (i = 0; i < n; i++){if (request[i] > need[p][i]){printf("请求资源数大于所需资源数,请重新输入\n");return 0;}} //判断请求资源是否满足for (j = 0; j < n; j++){if (request[j] > available[j]){printf("请求资源数大于可利用资源数,请重新输入\n");return 0;}} //满足请求 if (safety(m, n) == 1){for (k = 0; k < n; k++){available[k] -= request[k]; //更新可利用资源量allocation[p][k] += request[k]; //更新分配矩阵need[p][k] -= request[k]; //更新需求矩阵 }}}if (safety(m, n) != 1) //安全性算法撤销操作{for (k = 0; k < n; k++){available[k] += request[k]; //更新可利用资源量 allocation[p][k] -= request[k]; //更新分配矩阵need[p][k] += request[k]; //更新需求矩阵 }}printf("已撤销操作\n");}}

7 心得体会

这次课设是以银行家算法来进行,通过互联网上的相关渠道,了解了银行家算法是避免死锁作为一种事先预防死锁的策略,原理是在为各个进程分配资源的过程中不允许系统进去不安全状态,以此来避免死锁的发生。所谓安全状态,是指系统能按某种进程推进顺序为每个进程分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利地完成。此时称该进程推进序列为安全序列,如果无法找到这样一个安全序列,则称系统处于不安全状态。

为了实现银行家算法,在系统中必须设置这样四个数据结构,分别用来描述系统中可利用的资源,所有进程对资源的最大需求,系统中的资源分配以及所有进程还需要多少资源的情况。当一个进程发出请求资源的请求后,如果它所请求的资源大于目前系统可利用资源则不予分配。如果小于可利用资源,则系统试探着把资源分配给该进程,并修改分配之后的资源数值。接着系统执行安全算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给该进程,以完成本次分配。否则,将本次的试探分配作废,恢复原来的资源分配状态,让该进程等待。过程中遇到了许多问题,例如回收资源的代码如何实现,通过和同学们的讨论与互联网上相关内容的查询最终解决了问题。这次课设让我对操作系统的避免死锁这一概念的理解更加深入,学到了很多。

这篇关于操作系统课设-银行家算法VS2022的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/644674

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

最大公因数:欧几里得算法

简述         求两个数字 m和n 的最大公因数,假设r是m%n的余数,只要n不等于0,就一直执行 m=n,n=r 举例 以18和12为例 m n r18 % 12 = 612 % 6 = 06 0所以最大公因数为:6 代码实现 #include<iostream>using namespace std;/