本文共 4371 字,大约阅读时间需要 14 分钟。
非注释版:
#includeusing namespace std;int avallable[100],sum[100],cha[100],need[100][100],allocation[100][100],maxn[100][100],n,m,que[100];bool book[100];bool check(){ memset(book,true,sizeof(book)); int i,j,l,k=0,ans; i=0; ans=i; while(k
这里给出一些样例用以验证:
样例15 424 28 25 31P0 2 17 10 6-1 9 3 2P1 11 6 12 13-9 1 6 5P2 0 0 13 11-0 0 7 4P3 4 15 8 8-1 6 1 2P4 9 11 9 9-5 8 2 9
样例2
5 317 5 20P1 5 5 9-2 1 2P2 5 3 6-4 0 2P3 4 0 11-4 0 5P4 4 2 5-2 0 4P5 4 2 4-3 1 4
以上两组样例都可以完美运行,暂时来看代码没有什么缺陷,如果找到bug再来修复。
注释版:
#includeusing namespace std;int avallable[100];//avallable[a]=b 代表系统中全部资源a总量为bint sum[100];//sum[a]=b 代表编号为a的资源总量为b(已经给进程分配的)int cha[100];//cha[a]=b 代表编号为a的资源还剩b(即资源总量-已经给进程分配的)int need[100][100];//need[a][b]=c 代表编号为a的进程的b类资源还需要cint allocation[100][100];//allocati[a][b]=c 代表已经分配给进程编号为a的b类资源cint maxn[100][100];//maxn[a][b]=c 代表进程编号为a的进程总共需要b类资源cint n,m;//n代表进程个数 m代表资源类数int que[100];//模拟队列 用来保存安全序列bool book[100];//标记数组 查找安全序列的时候需要对已经在队列中的进程标记,防止多次执行同一个进程bool check()//检查函数 用来判断进程序列是否安全 如果安全同时计算出安全序列并把它保存到que数组中{ memset(book,true,sizeof(book));//初始值为true,即所有进程暂时都没有进入安全序列 int i,j,l,k=0,ans;//k用来记录当前安全序列中进程的个数。ans用来记录上一次进入安全序列的进程编号,该变量可以判断进程是否安全 i=0;//对i进行初始化 即首先对编号为0的进程开始检测 ans=i;//让ans等于i while(k
最终版:
//编译语言 c++#include#define Coding author 计科1905孙黎明using namespace std;int avallable[100];//avallable[a]=b 代表系统中全部资源a总量为bint sum[100];//sum[a]=b 代表编号为a的资源总量为b(已经给进程分配的)int cha[100];//cha[a]=b 代表编号为a的资源还剩b(即资源总量-已经给进程分配的)int need[100][100];//need[a][b]=c 代表编号为a的进程的b类资源还需要cint allocation[100][100];//allocati[a][b]=c 代表已经分配给进程编号为a的b类资源cint maxn[100][100];//maxn[a][b]=c 代表进程编号为a的进程总共需要b类资源cint n,m;//n代表进程个数 m代表资源类数int que[100];//模拟队列 用来保存安全序列bool book[100];//标记数组 查找安全序列的时候需要对已经在队列中的进程标记,防止多次执行同一个进程void initialization()//清空函数,把所有变量清空,为下一次计算安全序列做准备{ memset(sum,0,sizeof(sum)); memset(cha,0,sizeof(cha)); memset(need,0,sizeof(need)); memset(que,0,sizeof(que));}bool check()//检查函数 用来判断进程序列是否安全 如果安全同时计算出安全序列并把它保存到que数组中{ memset(book,true,sizeof(book));//初始值为true,即所有进程暂时都没有进入安全序列 int i,j,l,k=0,ans;//k用来记录当前安全序列中进程的个数。ans用来记录上一次进入安全序列的进程编号,该变量可以判断进程是否安全 i=0;//对i进行初始化 即首先对编号为0的进程开始检测 ans=i;//让ans等于i while(k
输入样例1:
5 424 28 25 31P0 2 17 10 6 1 9 3 2P1 11 6 12 13 9 1 6 5P2 0 0 13 11 0 0 7 4P3 4 15 8 8 1 6 1 2P4 9 11 9 9 5 8 2 9P10 1 0 1
输出样例1:
1.此时系统中可利用的资源向量ABCD为:A:8B:4C:6D:92.利用银行家算法判断此时刻系统状态是否安全:安全3.安全序列为:P2 P4 P0 P1 P34.若进程x提出请求y,系统能否将资源分配给它?系统能否把资源预分配给它?能预分配后安全序列为:P2 P4 P0 P1 P3
输入样例2:
5 317 5 20P1 5 5 9 2 1 2P2 5 3 6 4 0 2P3 4 0 11 4 0 5P4 4 2 5 2 0 4P5 4 2 4 3 1 4P20 3 4
输出样例2:
1.此时系统中可利用的资源向量ABC为:A:2B:3C:32.利用银行家算法判断此时刻系统状态是否安全:安全3.安全序列为:P4 P5 P1 P2 P3 4.若进程x提出请求y,系统能否将资源分配给它?系统能否把资源预分配给它?不能因为预分配后系统状态不安全,所以无法给出安全序列。
输入样例3:
5 317 5 20P1 5 5 9 2 1 2P2 5 3 6 4 0 2P3 4 0 11 4 0 5P4 4 2 5 2 0 4P5 4 2 4 3 1 4P42 0 1
输出样例3:
1.此时系统中可利用的资源向量ABC为:A:2B:3C:32.利用银行家算法判断此时刻系统状态是否安全:安全3.安全序列为:P4 P5 P1 P2 P3 4.若进程x提出请求y,系统能否将资源分配给它?系统能否把资源预分配给它?能预分配后安全序列为:P4 P5 P1 P2 P3
一、算法或原理的实现思想:算法:算法的话是银行家算法,用于判断给定的序列是否安全,系统能否给他们分配相应的资源。实现思想:我个人的实现思想就是模拟,银行家算法总的来说并不难,但是可能比较麻烦,需要一步步模拟,计算出每个进程所需要的资源,系统中每个资源所剩的数目等等。遇到的困难:总体来说还可以,只要理解银行家算法整个过程,写起来就很好写了,要说难点的话,我代码的难点主要在check函数(检查函数)中,也是我整个代码最核心的部分,用来判断序列是否安全,以及求出相应的安全序列。我用了while循环,由于不确定循环次数,其中i%n也是很重要的,因为要保证编号位于[0,1)之前,同时用que数组模拟队列,用来保存安全序列,其中在进行预分配前需要把之前计算的一些数据清零(因为那是前一次处理的参与数据,不清零的话会影响后续数据的计算),在敲的时候我没有意识到这一点,然后测数据的时候出现了错误,我才意识到需要清零。可以改进的地方:我的代码中有一部分用了两次,就是/***/框中的那部分,其实可以把它单独写成一个处理函数,这样在对它进行二次调用的时候就可以直接调用函数了,思路上并没有什么改变,但是可以使代码看起来更整洁。ps:我所测得数据均是网络信息综合教育平台上《操作系统》的在线测试题,即银行家算法随堂测试1和银行家算法随堂测试2四、参考文献:参考网址:http://etcnew.sdut.edu.cn/meol/jpk/course/layout/newpage1/index.jsp?courseId=45133(山东理工大学网络信息综合教育平台《操作系统》在线测试)参考输入样例和答案。没有参考其它书籍和同学交流。五、感想体会或收获:更加熟悉银行家算法了,因为在敲代码之前我又复习了一下银行家算法,把网络教学平台上的两个在线测试又做了一遍,复习了一下,然后就开始敲代码,在理解了算法之后敲代码就比较简单了,就是按照做题思路来敲,锻炼了动手能力,也对银行家算法了解更深了。注:另外还有一些完整的解题思路以及我改代码的整个过程都放到了博客:https://blog.csdn.net/qq_34035720/article/details/109998841上。