上海网站搜索引擎优化,开车网址来一个,常见c2c网站有哪些,网站开发要求有哪些一#xff0e;实验目的#xff1a; 银行家算法是一种最有代表性的避免死锁的算法。通过编写一个模拟动态资源分配的银行家算法程序#xff0c;进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念#xff0c;并掌握避免死锁的具体实施方法。
二#xff0e;实验要…一实验目的 银行家算法是一种最有代表性的避免死锁的算法。通过编写一个模拟动态资源分配的银行家算法程序进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念并掌握避免死锁的具体实施方法。
二实验要求 程序可以针对不同进程的请求进行判断并决定是否满足其需求。算法程序需要设计合理的数据结构对资源情况、进程相关数据进行存储。
三. 实验内容 在避免死锁方法中允许进程动态地申请资源用户请求分配资源时首先对用户提出的请求进行合法性检查若不存在请求的资源大于可利用的资源、可分配的资源的情况则请求合法进行预分配。系统在进行资源分配之前应先计算此次分配资源的安全性若分配不会导致系统进入不安全状态则分配否则等待。
四算法描述
1. 银行家算法中的数据结构 1可利用资源向量Available 这是个含有m个元素的数组其中的每一个元素代表一类可利用的资源数目。其初始值是系统中所配置的该类全部可用资源的数目其数值随该类资源的分配和回收而动态地改变如果Available[j]K则表示系统中现有Rj 类资源的最大数目为K。 2最大需求矩阵Max 这是一个n×m的矩阵它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Maxi,jK则表示进程i需要Rj 类资源的最大数目为K。 3分配矩阵Allocation 这也是一个n×m的矩阵它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocationi,jK则表示进程i当前已分得Rj 类资源的数目为K。 4需求矩阵Need。 这也是一个n×m的矩阵用以表示每一个进程尚需的各类资源数。如果Needi,jK则表示进程i还需要Rj 类资源K个方能完成其任务。 上述三个矩阵间存在下述关系 Needi,jMaxi,j-Allocationi,j
2. 银行家算法 设Requesti是进程Pi 的请求向量如果RequestijK表示进程Pi 需要K个Rj 类型的资源。当Pi 发出资源请求后系统按下述步骤进行检查 1如果Requestij≤Needi,j便转向步骤2否则认为出错因为它所需要的资源数已超过它所宣布最大值。 2如果Requestij≤Availablej便转向步骤3否则表示尚无足够资源 Pi须等待。 3系统试探着把资源分配给进程Pi 并修改下面数据结构中的数值 AvailablejAvailablej-Requestij; Allocationi,jAllocationi,jRequestij; Needi,jNeedi,j-Requestij; (4)系统执行安全性算法检查此次资源分配后系统是否处于安全状态。若安全才正式将资源分配给进程Pi 以完成本次分配否则将本次的试探分配作废恢复原来的资源分配状态让进程Pi 等待。
3. 安全性算法
1设置两个向量 工作向量Work: 它表示系统可提供给进程继续运行所需的各类资源数目它含有m个元素在执行安全算法开始时WorkAvailable; Finish: 它表示系统是否有足够的资源分配给进程使之运行完成。开始时先做Finish[i]false; 当有足够资源分配给进程时 再令Finish[i]true。
2从进程集合中找到一个能满足下述条件的进程 Finishifalse; Needi,j≤Workj; 若找到执行 (3)否则执行 (4)
3当进程Pi 获得资源后可顺利执行直至完成并释放出分配给它的资源故应执行 Workj WorkiAllocationi,j; Finishitrue; go to step 2;
4如果所有进程的Finishitrue都满足 则表示系统处于安全状态否则系统处于不安全状态;
五运行结果与分析 运行程序首先需要输入进程的数目和资源的数目每个进程最多所需的各资源数、已分配的各资源数和各个资源现有的数目运行及输入情况如下图所示 图1 输入初始数据 在分配资源之前首先会判断当前初始状态是否为安全状态若处于安全状态则提示系统是安全的并输出安全序列允许资源分配。反之若处于不安全状态则不允许后续的资源分配。 图2 判断初始状态 在申请分配资源之前首先将系统可用的资源数、各进程最多需要的资源数、各进程已经得到的资源、各进程还需要的资源量输出。各进程还需要的资源量等于最多需要的资源数减各进程已经得到的资源数。 图3 输出基本数据 开始进行分配资源首先输入要申请的进程号输入进程所请求的各资源数根据申请进行安全性检查如果处于安全状态则允许分配并输出安全序列。分配完成后如果想要再次分配输入y/Y否则输入其它符号 图4 申请分配资源结果图 输入y再次请求分配资源同样首先输出当前系统可用的资源数、各进程最多需要的资源数、各进程已经得到的资源、各进程还需要的资源量输出。 图5 再次申请分配资源 输入申请3进程但由于此时3进程需要资源数小于申请的资源数因此提示输入的资源请求数超过进程数需求量并重新输入。结果图如下所示 图6 申请分配资源失败图1 若所申请的资源数大于系统可分配的资源数则会提示输入的资源请求数超过系统当前资源拥有数并重新输入 图7 申请分配资源失败图2 再次申请分配资源申请分配给进程0资源数为100此时系统是安全的成功分配。同时输入n结束资源分配。结果图如下所示 图8 再次申请分配资源图
六源程序
#includeiostream
using namespace std;
const int Max_process 50;//最大进程数
const int Max_source 50;//最大资源数class bank
{
private:int available[Max_source];//可用资源数int max[Max_process][Max_source];//最大需求int allocation[Max_process][Max_source];//已分配资源数int need[Max_process][Max_source];//还需资源数int request[Max_process][Max_source];//进程需要资源数bool finish[Max_process];//判断系统是否有足够的资源分配int p[Max_process];//记录序列int m;//用来表示进程int n;//表示资源public:void Init();//完成对变量的初始化bool Safe();//安全检测算法void Banker();//银行家算法void Display(int, int);//显示进程与资源状态};void bank::Init()
{cout 请输入进程的数目;cin m;cout 请输入资源的数目:;cin n;cout 请输入每个进程最多所需的各资源数按照 m X n 矩阵格式输入 endl;for (int i 0; i m; i)for (int j 0; j n; j)cin max[i][j];cout 请输入每个进程已分配的各资源数按照 m X n 矩阵格式输入 endl;for (int i 0; i m; i)for (int j 0; j n; j){cin allocation[i][j];已分配资源数need[i][j] max[i][j] - allocation[i][j];if (need[i][j] 0){cout 你输入的第 i 1 个进程的第 j 1 个资源数有问题\n请重新输入;j--;//忽略这个资源数continue;//跳出本次循环}}cout 请输入各个资源现有的数目 endl;for (int i 0; i n; i){cin available[i];可用资源数}}//m表示进程n表示资源
void bank::Display(int n, int m)
{cout endl endl;cout 系统可用的资源数为;for (int i 0; i n; i){cout available[i] ;}cout endl 各进程最多需要的资源数: endl;for (int i 0; i m; i){cout P i :;for (int j 0; j n; j){cout max[i][j];}cout endl;}cout endl 各进程已经得到的资源: endl;for (int i 0; i m; i){cout P i :;for (int j 0; j n; j){cout allocation[i][j];}cout endl;}cout endl 各进程还需要的资源量 endl;for (int i 0; i m; i){cout P i :;for (int j 0; j n; j)cout need[i][j];cout endl;}cout endl endl;
}void bank::Banker()
{int num_process, flag 0;//num_process表示资源进程号char again;//键盘录入一个字符用于判断是否继续请求资源while (1){Display(n, m);cout endl;/*请求资源*/while (true){cout 请输入要申请的进程号:;cin num_process;if (num_process m){cout 没有该进程请重新输入 endl;continue;}cout 请输入进程所请求的各资源数: ;for (int i 0; i n; i)cin request[num_process][i];for (int i 0; i n; i){if (request[num_process][i] need[num_process][i]){cout 你输入的资源请求数超过进程数需求量请重新输入 endl;continue;}if (request[num_process][i] available[i]){cout 你输入的资源请求数超过系统当前资源拥有数 endl;break;}}break;}/*上述是资源请求不合理的情况下面是资源请求合理时则执行银行家算法*/for (int i 0; i n; i){available[i] - request[num_process][i];//可用资源减去成功申请的allocation[num_process][i] request[num_process][i];//已分配资源加上成功申请的need[num_process][i] - request[num_process][i];//进程还需要的减去成功申请的}/*判断分配申请资源后系统是否安全如果不安全则将申请过的资源还给系统*/if (Safe())//安全性算法cout 同意分配请求endl;else{cout 你的请求被拒绝 endl;/*进行向系统还回资源操作*/for (int i 0; i n; i){available[i] request[num_process][i];allocation[num_process][i] - request[num_process][i];need[num_process][i] request[num_process][i];}}/*判断是否继续申请*/cout 你还想再次请求分配吗是请按Y/y否请按其他键 endl;cin again;if (again Y || again y)continue;break;}
}m表示进程n表示资源
bool bank::Safe()
{int l 0, j, i;int work[Max_source];//工作向量系统可提供给进程继续运行所需各类资源数/*对work数组进行初始化初始化时和avilable可用资源数数组相同*/for (int i 0; i n; i)work[i] available[i];/*对finish数组判断系统是否有足够的资源分配初始化全为false*/for (int i 0; i m; i)finish[i] false;for (int i 0; i m; i){if (finish[i] true)continue;else{for (j 0; j n; j){if (need[i][j] work[j])break;}if (j n){finish[i] true;for (int k 0; k n; k)work[k] allocation[i][k]; //已分配work可分配p[l] i;//记录进程号i -1;保证每次查询均从第一个进程开始}elsecontinue;}}if (l m)//进程数{cout 系统是安全的 endl;cout 安全序列 endl;for (int i 0; i l; i){cout p[i];if (i ! l - 1)cout --;}cout endl endl;return true;}}int main()
{cout ------------------------------------------------ endl;cout endl endl;cout 银行家算法 endl;cout endl endl;cout ------------------------------------------------ endl;bank peter;peter.Init();peter.Safe();peter.Banker();return 0;
}