操作系统中,进程调度是一个非常重要的问题。每个进程都需要一定的资源才能顺利执行,进程执行过程中使用的资源在进程结束时都会释放。不同的资源分配策略会对系统的运行效率产生很大的影响,甚至可能导致死锁。 现某系统中现有n个进程和m种资源。每个进程开始时得到部分资源,但不足以使得进程顺利执行,还需要得到其它资源才能执行。已知该系统中各类可用资源的总量,给定已知的进程及其资源分配和需求情况,你能帮忙检查这些进程能够顺利执行吗? 输入数据: 输入数据有若干组,每组输入数据的第一行包含两个正整数n,m(0<n≤50000,0<m≤l00),表示当前系统中进程的总数和资源的种类。随后的m行中,每行有n个整数,为各个进程得到的资源数。之后的m行中,每行也有n个整数,表示进程还需要的资源数。之后的一行中包含m个整数,为系统中当前可用资源的数量。保证所有的整数值小于或等于10°。 输出数据: 对每组输入数据,在单独的行中输出结果。若所有进程均能顺利完成,输出Yes,否则输出No。 样例输入: 样例输出: 解题思路: 下面为实现代码:
题目描述
4 3 1 6 2 0 0 1 1 0 0 2 1 2 2 0 1 4 2 0 0 2 2 1 3 0 0 1 1 4 3 2 5 2 0 0 1 1 0 1 1 1 2 1 1 1 4 2 0 0 2 1 2 3 0 0 1 1
Yes No
使用银行家算法来实现。
如果不太清楚银行家算法的具体过程,可以参考下面的链接。
操作系统—银行家算法/* * @Description: 银行家算法 * @Author: sikaozhifu * @Date: 2020-06-12 14:33:49 * @LastEditTime: 2020-06-12 15:41:03 * @LastEditors: Please set LastEditors */ #include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; int n,m;//n 表示进程总数,m 表示资源种类数 //Max 表示最大需求数 //Allocation 表示已经分配的资源数 //Need 表示还需要分配的资源数 //表示系统可用的资源数 int **Max,**Allocation,**Need,*Available; //Work 动态存储当前Available的值 //Finish 表示当前进程是否为安全序列之一 int *Work,*Finish; vector<int> result; //判断是否为安全序列 bool check(){ Work = new int[m]; for(int i = 0;i < m;i++){ Work[i] = Available[i]; } Finish = new int[n]; fill(Finish,Finish + n, 0); for(int k = 0;k < n;k++){//n 个进程需要遍历n次 for(int i = 0;i < n;i++){ if (Finish[i] == 0) { //判断需求数是否满足当前可用资源数 int count = 0; for(int j = 0;j < m;j++){ if(Need[i][j] <= Work[j]){ count++; } } if(count == m){ //表示满足当前需求数 for(int j = 0;j < m;j++){ //更新当前的可用资源数 Work[j] += Allocation[i][j]; } Finish[i] = 1; result.push_back(i); break; } } } } for(int i = 0;i < m;i++){ if(Finish[i] == 0){ return false; } } return true; } int main(){ cin >> n >> m; Max = (int **)new int* [n]; Allocation = (int **)new int* [n]; Need = (int **)new int* [n]; for(int i = 0;i < n;i++){ Max[i] = new int[m]; Allocation[i] = new int[m]; Need[i] = new int[m]; } Available = new int[m]; for(int i = 0;i < m;i++){ for(int j = 0;j < n;j++){ cin >> Allocation[j][i]; } } for(int i = 0;i < m;i++){ for(int j = 0;j < n;j++){ cin >> Need[j][i]; } } for(int i = 0;i < m; i++){ cin >> Available[i]; } if(check()){ cout << "Yes" << endl; }else{ cout << "No" << endl; } system("pause"); return 0; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算