发一些大三操作系统的实验代码吸引阅读量吧,当时做实验的时候看见网上很多人写的代码并不好,而且很多人都有错误的地方。如果好的话希望能点赞关注。

本篇文章选自课程设计报告的部分,所以相比前两篇实验详细很多,我尽量贴一些重要的部分出来

在多道程序系统中,多个进程在运行中对于资源的争夺而造成了一种僵局—死锁,若无外力作用,则这些进程均无法向前推进。如此,寻求避免死锁的方法就显得尤为重要。死锁产生的原因一般有三种:竞争不可抢占性资源、竞争可消耗性资源、进程的推进顺序不当。因此,在当前有限资源下,找到一组合法的顺序(称之为安全序列)执行,便能有效的避免死锁的产生。银行家算法便是最有代表性的避免死锁的算法,它是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。本次课程设计通过设计并编写程序来模拟银行家算法的执行过程。

一、数据结构的选择

a.将每个进程都视作一个对象,因此使用类进行存储和读取,并重载运算符用于数据的拷贝。为了实现资源数的可变性,则使用STL(Standard Template Library标准模板库,C++的一部分)中的vector容器存储各资源已用的资源和需要的资源数(int型)。类的定义如下所示:

class Process//使用一个类的对象表示一个进程{public:stringID;//进程名vector<int>UsedResource;//已用各资源数vector<int>NeedResource;//对应的所需资源数Process&operator=(constProcess &p) //运算符重载用于赋值{if(this != &p){this->ID= p.ID;this->UsedResource= p.UsedResource;this->NeedResource= p.NeedResource;}return*this;}};

b.为了对进程数和资源数进行存储,分别定义了int型变量ProcessCount、ResourceCount用于存储进程数和资源数。

c.为了对各资源的可用资源数进行存储和读取,定义了vector<int>Available用于存储可用资源数。

d.为了存储各进程的信息,使用对象的list,即STL中的链表list<Process> n。

e.因为在安全性算法运算时需要更改进程中的资源信息和当前可用资源信息,所以分别定义了list<Process> Copy、list<Process> Copy_2、vector<int>calc在运算前对当前进程的链表和当前资源信息进行拷贝,并用以运算。

f.因为对进程的初始化较为繁琐,所以定义了list<int>UsedResourceBuffer、list<int>NeedResourceBuffer用于对Process的初始化。

g.定义了list<string>Safeyqueue用于存储安全序列。

二、模块的划分

由于算法规模较小,所以大多数的实现均将其写在main函数中的while循环体中,需要使用的变量等也尽量定义为全局变量。但在选择后分别完成了不同的且重要的功能。除main函数中的部分,其它单独出的模块的功能如下:

a.SetProcess:对单个进程的信息进行初始化,返回初始化完成的进程对象。

b.ShowAllProcess:对所有进程进行显示

c.safetyCheak:用于安全性算法,并对安全序列进行初始化

d.ShowQueue:显示安全序列的情况。

三、实现代码如下

#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <list>
#include <cstdlib>
using namespace std;
class Process//使用一个类的对象表示一个进程
{
public:string ID;//进程名vector<int> UsedResource;//已用各资源数vector<int> NeedResource;//对应的所需资源数Process&operator=(const Process &p) //运算符重载用于赋值{if (this != &p){this->ID = p.ID;this->UsedResource = p.UsedResource;this->NeedResource = p.NeedResource;}return *this;}
};
int ProcessCount;//进程数
int ResourceCount;//资源数
vector<int>Available;//可用资源数
vector<int>calc;//用于计算的资源vector
list<Process> n;//进程的链表
list<Process> Copy;//对于进程链表的拷贝
list<Process> Copy_2;//对于进程链表的拷贝
list<int>UsedResourceBuffer;
list<int>NeedResourceBuffer;
list<string> Safeyqueue;//安全序列
bool ShowQueue ()//显示安全序列
{int a = 0;if (Safeyqueue.size()!= 0) {for (auto i=Safeyqueue.begin();i!=Safeyqueue.end();++i)//使用auto定义迭代器,设置循环{cout << *i;if (a != (Safeyqueue.size ()-1)) {cout << "->";a++;}}return true;}else return false;
}
bool safetyCheak () {//安全性算法Safeyqueue.clear ();//清空SafeyqueueCopy_2.clear ();//清空Copy_2Copy_2 = Copy;int cheaknumber1=1;for (int i = ProcessCount; i > 0; i--){cheaknumber1 =cheaknumber1+i;}int cheaknumber2 = 0;while (1){int tip = 0;for (int b = 0; b < ResourceCount; b++){if (Copy_2.front ().NeedResource[b] <= calc[b]){tip++;//单个资源符合要求标识符tip+1}}if (tip == ResourceCount)//进程的所有资源均符合要求{for (int d = 0; d < ResourceCount; d++){calc[d] = calc[d] + Copy_2.front ().UsedResource[d];}cheaknumber2 = 0;Safeyqueue.push_back (Copy_2.front ().ID);Copy_2.pop_front ();}if (cheaknumber2 >= ProcessCount) break;//在第一次循环中就找不到符合条件的进程,跳出循环else if (cheaknumber1 == 0) break;//循环数大于最大可能的循环数,跳出循环else if (Copy_2.size () == 0) return true;Copy_2.push_back (Copy_2.front ());Copy_2.pop_front ();cheaknumber2++;cheaknumber1--;}return false;
}
Process SetProcess (string ID)//为进程初始化所用的函数 返回进程
{Process Buffer;//创建Process对象Buffer.ID = ID;//初始化IDwhile (UsedResourceBuffer.size() != 0)//若UsedResourceBuffer不为空{Buffer.UsedResource.push_back (UsedResourceBuffer.front ());//将UsedResourceBuffer的头节点插入到对象UsdResource的尾部UsedResourceBuffer.pop_front ();//删除UsedResourceBuffer的头节点}while (NeedResourceBuffer.size () != 0)//方法与上相同{Buffer.NeedResource.push_back (NeedResourceBuffer.front ());NeedResourceBuffer.pop_front ();}return Buffer;//返回对象
}
void ShowAllProcess ()//显示全部进程及资源表
{if (n.size () == 0) {cout << "无进程,请分配进程!" << endl;//n中无Process的对象return;}cout << std::left << setw (4) << "ID\t"<<std::right<< setw (12) << "USED\t\t" <<std::right<< setw (12) << " NEED\t" << endl<<std::left << setw (4) << "资源";for (int i = 1; i <= ResourceCount; i++){cout <<"\t" << std::left << i;}for (int i = 1; i <= ResourceCount; i++){cout  <<"\t" << std::left << i ;}for (auto a = n.begin(); a != n.end (); ++a)//定义迭代器设置循环{cout <<endl<<std::left <<setw (4) << a->ID<<"|\t";for (unsigned int b = 0;b<(a->UsedResource.size());b++){if(b!= (a->UsedResource.size ()-1))cout << setw (4) << a->UsedResource[b]<<"\t";else cout << setw (4) << a->UsedResource[b] << "|\t";}for (unsigned int b = 0; b<(a->NeedResource.size ()); b++){cout << setw (4) << a->NeedResource[b] << "\t";}}
}
int main ()
{while (1){system ("cls");system ("color F0");int choose;cout << "请输入需要进行的算法或需要进行的操作\n""1.设置进程个数\n""2.设置资源个数\n""3.为每个进程分配资源\n""4.设置空闲资源并自动检测是否合法\n""5.执行银行家算法(请求新的资源)\n""6.查看当前所有信息\n""7.清除所有内容\n""8.退出程序\n";cout << "请输入您的选择:";cin >> choose;system ("cls");if (choose == 1){if (ProcessCount != 0) {cout << "您已输入资源个数,个数为" << ProcessCount << endl;cout << "若需更改必须清除全部数据" << endl;system ("pause");continue;}cout << "请输入进程个数(输入错误将会保持为零):";cin >> ProcessCount;if (ProcessCount <= 0) {cout << "输入进程数目错误,请重试."<<endl;ProcessCount = 0;system ("pause");continue;}cout << "输入进程个数成功!"<<endl;system ("pause");}if (choose == 2){if (ResourceCount != 0) {cout << "您已输入资源个数,个数为" << ResourceCount << endl;cout << "若需更改必须清除全部数据" << endl;system ("pause");continue;}cout << "请输入资源个数(输入错误将会保持为零):";cin >> ResourceCount;if (ResourceCount <= 0) {cout << "输入资源个数错误,请重试."<<endl;ResourceCount = 0;system ("pause");continue;}cout << "输入资源个数成功!" << endl;system ("pause");}if (choose == 3){if ((ProcessCount == 0) || (ResourceCount == 0)) {cout << "请先分配资源和进程再重试!" << endl;system ("pause");continue;}for (int i = 0; i < ProcessCount; i++){cout << "请输入第"<<i+1<<"个进程的ID:";string ID;cin >> ID;for (int i1 = 1; i1 <= ResourceCount; i1++){int a,b;cout << "请输入第" << i+1 << "个进程的第" << i1 << "个资源的占用数目:";while ((cin >> a) && (a < 0)){cout << endl<<"输入不符合规则,请重试:";}cout << "请输入第" << i + 1 << "个进程的第" << i1 << "个资源的需求数目:";while ((cin >> b) && (b< 0)){cout << endl << "输入不符合规则,请重试:";}UsedResourceBuffer.push_back (a);NeedResourceBuffer.push_back (b);}n.push_back(SetProcess (ID));}cout << endl << "当前所有程序状态如下\n";ShowAllProcess ();system ("pause");}if (choose == 4) {if ((ProcessCount == 0) || (ResourceCount == 0)) {cout << "请先分配资源和进程再重试!" << endl;system ("pause");continue;}Available.clear ();for (int i = 0; i < ResourceCount; i++){int a;cout << "请设置第" << i + 1 << "个资源的空闲个数:";while ((cin >> a) && (a < 0)){cout <<endl<< "输入数值不合法,请重试:";}Available.push_back (a);}calc.clear ();calc = Available;Copy.clear ();Copy = n;bool b=safetyCheak ();if (b == true) {cout << "当前情况安全!"<<endl;cout << "可执行的序列有(可能不唯一,这里只显示一种):";ShowQueue ();system ("pause");continue;}if (b == false) {cout << "当前情况不安全无法按当前值设置空闲资源!"<<endl;cout << "请更改后重试!";Available.clear ();system ("pause");continue;}}if (choose == 5) {if ((ProcessCount == 0) || (ResourceCount == 0)) {cout << "请先分配资源和进程再重试!" << endl;system ("pause");continue;}vector<int>buffer;//存储当前进程请求的资源buffer.clear ();calc.clear ();calc=Available;Copy.clear ();Copy = n;string id;//显示所有进程状态cout << "当前资源情况如下:" << endl;ShowAllProcess ();cout << endl<<"当前资源状态如下" << endl;for (auto i = Available.begin(); i != Available.end (); ++i){cout << *i << "\t";}cout << endl << "请输入需要资源的进程名:";cin >> id;//对进程进行查找for (auto a = Copy.begin (); a != Copy.end (); ++a) {if (id == a->ID) {cout << endl << "找到此进程!";cout << "请输入目前是否需要分配资源,输入-1取消分配其他数字继续:";int c; cin >> c;if (c == -1) {cout << "取消分配!"; system ("pause"); continue;}cout << "请输入" << id << "进程" << "需要的资源个数:" << endl;//输入当前需要资源个数for (int d = 0; d < ResourceCount; d++){int e;cout << "请输入第" << d+ 1 << "个资源个数:";while ((cin >> e) &&( (e <0)||(e>a->NeedResource[d])||(e>calc[d]))){if (e < 0)   cout << "输入不符合规则";if (e > a->NeedResource[d]) cout << "输入的数大于需要的资源数";if (e > calc[d]) cout << "输入的数大于系统的资源数";cout<<",输入错误,请重试:" << endl;}a->UsedResource[d] = a->UsedResource[d] + e;a->NeedResource[d] = a->NeedResource[d] - e;calc[d] = calc[d] - e;buffer.push_back (e);}bool boolean = safetyCheak ();//执行安全性算法检测if (boolean == true) {int f;cout << "当前情况安全!" << endl;cout << "是否要将资源赋给" << id << "?0确定,其他取消\n请输入你的选择:";cin >> f;if (f == 0) {//确定分配n.clear ();n = Copy;vector<int>buffer1;buffer1 = Available;Available.clear ();for (int b = 0; b < ResourceCount; b++){buffer1[b]=buffer1[b] - buffer[b];}Available = buffer1;cout << "本次已成功赋予资源!"<<endl;}else {cout << "已取消!"<<endl;}}if(boolean==false){cout << "不安全!因此无法分配!"<<endl;}cout <<endl<< "当前进程资源情况如下:\n";ShowAllProcess ();cout << endl<< "可用资源个数按顺序分别为:";for (auto i = Available.begin (); i != Available.end (); ++i){cout << *i << "  ";}cout <<endl <<"可执行的队列如下\n";ShowQueue ();system ("pause");continue;}}}if (choose == 6) {cout << "进程个数为" << ProcessCount << endl;cout << "资源个数为" << ResourceCount << endl;cout << "可用资源个数按顺序分别为:";for (auto i = Available.begin (); i != Available.end(); ++i){cout << *i<<"  ";}cout << "当前所有程序状态如下\n";ShowAllProcess ();cout << endl;bool b=ShowQueue ();if(b==false)cout<<"没有合适的可执行队列,请分配正确的资源!"<<endl;system ("pause");}if (choose == 7) {int a;cout << "确认全部删除么?删除请输入0"<<endl;cout << "请输入:";cin >> a;if (a != 0) continue;ProcessCount=0;ResourceCount=0;Available.clear();n.clear();UsedResourceBuffer.clear();Safeyqueue.empty();cout << "全部删除成功!";system ("pause");}if (choose == 8) {cout << "退出程序!\n";system ("pause");exit (0);}}return 0;}

操作系统课程设计--银行家算法的模拟实现相关推荐

  1. 操作系统课程设计——时间片轮转算法模拟

    代码实现: #include <iostream> #include <stdio.h> #include <malloc.h>typedef struct nod ...

  2. java时间片轮转调度(操作系统课程设计)

    操作系统课程设计之时间片轮转调度算法模拟(Java版本可视化) 1. 课程设计要求 本次课程设计的题目是,时间片轮转调度算法的模拟实现.要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算 ...

  3. 华南理工大学计算机操作系统课程设计大作业银行家死锁避免算法模拟,2016春操作系统大作业银行家死锁避免算法模拟.doc...

    文档介绍: 2016春操作系统大作业银行家死锁避免算法模拟20160501华南理工大学"计算机操作系统"课程设计大作业计算机科学与技术专业:春2015班级:号:2015047420 ...

  4. 操作系统课程设计---实验六 银行家算法的模拟与实现

    实验六 银行家算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 进一步理解进程的并发执行. (2) 加强对进程死锁的理解,理解安全状态与不安全状态的概念. ...

  5. 【计算机操作系统】银行家算法的模拟实现

    文章目录 前言 1 实验相关知识理论 1.1 死锁的概念 1.2 产生死锁的原因 1.3 避免死锁的方法 1.4 解除死锁的方法 2 实验设计思路 3 实验设计涉及到的数据结构 4 程序算法设计 4. ...

  6. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

  7. java编写文件系统的方法_操作系统课程设计模拟文件系统Java

    [实例简介] 一个操作系统课程设计,使用java语言模拟磁盘文件系统实现,实现了FAT算法 [实例截图] [核心代码] e692cc3b-c785-40f6-babe-2f9d5383f034 └── ...

  8. 操作系统课程设计---实验七 磁盘调度算法的模拟与实现

    实验七 磁盘调度算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式. (2) 掌握磁盘访问时间的计算方式. (3) 掌握 ...

  9. 操作系统课程设计--使用多线程模拟时间片轮转法调度

    本篇博文分享操作系统课程设计–使用多线程模拟时间片轮转法调度的思路及代码. 实验环境:虚拟机ubuntu18.04 ,VS Code 博主分享仅为互相学习之用,不懂的地方可以留言提问,谨防抄袭!!!谢 ...

  10. 计算机操作系统课设总结,计算机操作系统课程设计

    <计算机操作系统课程设计>由会员分享,可在线阅读,更多相关<计算机操作系统课程设计(36页珍藏版)>请在人人文库网上搜索. 1.操作系统课程设计实验报告姓 名: 李文孝 班 级 ...

最新文章

  1. codevs 1203 判断浮点数是否相等
  2. mysql字段默认值不生效的问题解决(上)
  3. spring配置文件_SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件...
  4. conda init 关闭和重启shell_Linux的/etc/init.d详解
  5. [LeetCode] Valid Anagram - 字符串排序比较系列
  6. java开发工程师学什么专业,Java核心知识点
  7. Oracle11.2.0.4 windows32+64bit opatch工具 11.2.0.0 百度云盘下载
  8. 洛谷试炼场-简单数学问题-二分查找
  9. php yaf.dll,windows下配置nginx+php+yaf的环境
  10. PyTorch 1.0 中文文档:torch.nn.init
  11. SpringBoot配置ELK环境
  12. component_春天@Component
  13. XP电脑开机就检查硬盘
  14. Photoshop 2021 for mac(PS2021直装版)中英双语版
  15. 用python画圆形彩虹_python学习之GUI(pygame)
  16. UBUNTU给已有用户改名
  17. 基于HTML/CSS/JS的动态元素周期表
  18. 【PS】PS改变字体大小的方法
  19. 【资料】分享北京某培训机构全部学习课程加个人的一些学习上的建议
  20. stata构建ARIMA模型并作预测,命令及过程

热门文章

  1. 2022Java最新学习路线(初学者必看)
  2. 用Python写了一个前端,轻轻松松实现前端梦
  3. 黑苹果intel网卡驱动方法
  4. html 做成ppt样式,HTML开发网页样式.ppt
  5. 计算机网络中的A类、B类、C类地址的划分
  6. 电脑录屏用什么软件?录屏软件哪个好用?
  7. 海量监控视频如何存储?
  8. vs C++实现Socket通信、添加ws2_32.lib 静态链接库
  9. android nfc贴卡多次读写,Android Studio NFC 读写卡程序 (二)(示例代码)
  10. 137页Python学习笔记,全面总结看这一篇就够了