动态分区分配算法.docx
- 文档编号:24631781
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:17
- 大小:105.03KB
动态分区分配算法.docx
《动态分区分配算法.docx》由会员分享,可在线阅读,更多相关《动态分区分配算法.docx(17页珍藏版)》请在冰豆网上搜索。
动态分区分配算法
题目:
动态分区分配算法
班级:
姓名:
学号:
完成日期:
一、需求分析
1、问题描述:
设计程序模拟四种动态分区分配算法:
首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。
假设内存中空闲分区个数为n,空闲分区大小分别为P1,…,Pn,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1,…,Sm,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。
2、基本要求:
一个完整的系统应具有以下功能:
1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。
2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。
3)输入:
空闲分区个数n,空闲分区大小P1,…,Pn,进程个数m,进程需要的分区大小S1,…,Sm,算法选择1-首次适应算法,2-循环首次适应算法,3-最佳适应算法,4-最坏适应算法。
4)输出:
最终内存空闲分区的分配情况。
3、测试数据:
见上机指导书测试数据。
4、实现提示:
1)程序中变量定义参考(根据需要可添加)如下:
constintMaxNumber=100;
intFreePartition[MaxNumber];
intFirstPartition[MaxNumber];
intCycleFirstPartition[MaxNumber];
intBestPartition[MaxNumber];
intWorstPartition[MaxNumber];
intProcessNeed[MaxNumber];
intPartitionNum,ProcessNum;
2)页面置换的实现过程如下:
Ø变量初始化;
Ø空闲分区个数n,空闲分区大小P1,…,Pn,进程个数m,进程需要的分区大小S1,…,Sm,算法选择1-首次适应算法,2-循环首次适应算法,3-最佳适应算法,4-最坏适应算法;
Ø根据用户选择的算法进行动态分区分配;
Ø输出所有进程分配后的空闲分区分配情况。
二、概要设计
1.变量描述
intm,n;
charResName[MaxNumber];
charProName[MaxNumber];
intAvailable[MaxNumber];
intMax[MaxNumber][MaxNumber];
intAllocation[MaxNumber][MaxNumber];
intNeed[MaxNumber][MaxNumber];
2.主程序的流程以及各程序模块之间的调用关系:
(1).资源分配表初始化(Initialization)
(2).读取资源分配表(Resource)
(3).安全性算法(Safety)
(4).银行家算法(Order)
(5).申请需求后的银行家算法(Request)
(6).结束程序
三.详细设计
#include"suanfa.h"
//--------------------------主函数------------------------------
intmain()
{
cout<<"--------关闭窗口则退出.-----------"< intFreePartition[MaxNumber]; intFirstPartition[MaxNumber]; charName[MaxNumber]; intCycleFirstPartition[MaxNumber]; intBestPartition[MaxNumber]; intWorstPartition[MaxNumber]; intProcessNeed[MaxNumber]; intPartitionNum,ProcessNum; intk=1; while(k) { charchioce; cout<<"请键入一个选择功能符(I: Initialization,F: First,N: Next,"< cout<<"B: Best,W: Worst,Q: Quit): "< cin>>chioce; switch(chioce) { case'I': Initialization(Name,FreePartition,ProcessNeed,ProcessNum,PartitionNum);break;//初始化 case'F': First(Name,FreePartition,ProcessNeed,FirstPartition,ProcessNum,PartitionNum);break;//首次适应算法 case'N': Next(Name,FreePartition,ProcessNeed,CycleFirstPartition,ProcessNum,PartitionNum);break;//循环首次适应算法 case'B': Best(Name,FreePartition,ProcessNeed,BestPartition,ProcessNum,PartitionNum);break;//最佳适应算法 case'W': Worst(Name,FreePartition,ProcessNeed,WorstPartition,ProcessNum,PartitionNum);break;//最坏适应算法 case'Q': k=0;//退出运行 } } return0; } //---------------------------------------------------------------- //==================================================================== #include #include usingnamespacestd; #defineMaxNumber100 //==================================================================== voidInitialization(charName[],intFreePartition[],intProcessNeed[],int&m,int&n) {//将数据写入文件partition.txt中 inti; ofstreamfout("partition.txt"); cout<<"请输入进程个数: m=";// cin>>m; fout< cout<<"请输入空闲分区个数: n=";// cin>>n; fout< char*name=newchar[m]; int*free=newint[n]; int*need=newint[m]; cout<<"请输入"< "; for(i=1;i<=m;i++) { cin>>name[i]; } for(i=1;i<=m;i++) { Name[i]=name[i]; fout< } fout< cout<<"请输入"< ";// for(i=1;i<=m;i++) { cin>>need[i]; } for(i=1;i<=m;i++) { ProcessNeed[i]=need[i]; fout< } fout< cout<<"请输入"< ";// for(i=1;i<=n;i++) { cin>>free[i]; } for(i=1;i<=n;i++) { FreePartition[i]=free[i]; fout< } fout< cout<<"空间分区和进程大小已写入文件partition.txt中。 "< } //-------------------------------------------------------------------- voidPartition(charName[],intFreePartition[],intProcessNeed[],int&m,int&n) {//从partition.txt文件中读取数据 inti; ifstreamfin("partition.txt"); fin>>m; fin>>n; char*name=newchar[m]; int*free=newint[n]; int*need=newint[m]; for(i=1;i<=m;i++) { fin>>name[i]; Name[i]=name[i]; } for(i=1;i<=m;i++) { fin>>need[i]; ProcessNeed[i]=need[i]; } for(i=1;i<=n;i++) { fin>>free[i]; FreePartition[i]=free[i]; } } //-------------------------------------------------------------------- /*voidSelect(intFreePartition[],int&n) {//泡沫排序 intt; for(intj=1;j<=n;j++) { for(inti=1;i<=n-j+1;i++) { if(FreePartition[i-1]>FreePartition[i]) { t=FreePartition[i-1]; FreePartition[i-1]=FreePartition[i]; FreePartition[i]=t; } } } }*/ //-------------------------------------------------------------------- intMin(intFreePartition[],int&n,int&t) {//求最小数 t=FreePartition[1]; for(inti=1;i<=n;i++) { if(FreePartition[i] { t=FreePartition[i]; } } returnt; } //-------------------------------------------------------------------- intMax(intFreePartition[],int&n,int&t) {//求最小数 t=FreePartition[1]; for(inti=1;i<=n;i++) { if(FreePartition[i]>t) { t=FreePartition[i]; } } returnt; } //-------------------------------------------------------------------- voidFirst(charName[],intFreePartition[],intProcessNeed[],intFirstPartition[],int&m,int&n) {//首次适应算法 Partition(Name,FreePartition,ProcessNeed,m,n); inti,j; for(i=1;i<=m;i++) { FirstPartition[i]=0; } for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(ProcessNeed[i]<=FreePartition[j]&&FirstPartition[i]==0) { FirstPartition[i]=j; FreePartition[j]=FreePartition[j]-ProcessNeed[i]; } } } cout<<"首次适应算法: "< for(i=1;i<=n;i++) { cout< for(j=1;j<=m;j++) { if(FirstPartition[j]==i) { cout< } } } cout< } //-------------------------------------------------------------------- voidNext(charName[],intFreePartition[],intProcessNeed[],intCycleFirstPartition[],int&m,int&n) {//循环首次适应算法 Partition(Name,FreePartition,ProcessNeed,m,n); inti,j; for(i=1;i<=m;i++) { CycleFirstPartition[i]=0; } for(i=1;i<=m;i++) { if(i==1) { for(j=1;j<=n;j++) { if(ProcessNeed[i]<=FreePartition[j]&&CycleFirstPartition[i]==0) { CycleFirstPartition[i]=j; FreePartition[j]=FreePartition[j]-ProcessNeed[i]; } } } else { for(j=CycleFirstPartition[i-1];j<=n;j++) { if(ProcessNeed[i]<=FreePartition[j]&&CycleFirstPartition[i]==0) { CycleFirstPartition[i]=j; FreePartition[j]=FreePartition[j]-ProcessNeed[i]; } } } } cout<<"循环首次适应算法: "< for(i=1;i<=n;i++) { cout< for(j=1;j<=m;j++) { if(CycleFirstPartition[j]==i) { cout< } } } cout< } //-------------------------------------------------------------------- voidBest(charName[],intFreePartition[],intProcessNeed[],intBestPartition[],int&m,int&n) {//最佳适应算法 Partition(Name,FreePartition,ProcessNeed,m,n); inti,j,t; int*Order=newint[n]; for(i=1;i<=m;i++) { BestPartition[i]=0; } for(i=1;i<=n;i++) { Order[i]=FreePartition[i]; } for(i=1;i<=m;i++) { for(t=1;t<=n;t++) { Order[t]=100; } for(j=1;j<=n;j++) { if(FreePartition[j]-ProcessNeed[i]>=0) { Order[j]=FreePartition[j]-ProcessNeed[i]; } } for(j=1;j<=n;j++) { if(BestPartition[i]==0&&Order[j]==Min(Order,n,t)) { BestPartition[i]=j; FreePartition[j]=FreePartition[j]-ProcessNeed[i]; } } } cout<<"最佳适应算法: "< for(i=1;i<=n;i++) { cout< for(j=1;j<=m;j++) { if(BestPartition[j]==i) { cout< } } } cout< } //-------------------------------------------------------------------- voidWorst(charName[],intFreePartition[],intProcessNeed[],intWorstPartition[],int&m,int&n) {//最差适应算法 Partition(Name,FreePartition,ProcessNeed,m,n); inti,j,t; int*Order=newint[n]; for(i=1;i<=m;i++) { WorstPartition[i]=0; } for(i=1;i<=n;i++) { Order[i]=FreePartition[i]; } for(i=1;i<=m;i++) { for(t=1;t<=n;t++) { Order[t]=0; } for(j=1;j<=n;j++) { if(FreePartition[j]-ProcessNeed[i]>=0) { Order[j]=FreePartition[j]-ProcessNeed[i]; } } for(j=1;j<=n;j++) { if(WorstPartition[i]==0&&Order[j]==Max(Order,n,t)) { WorstPartition[i]=j; FreePartition[j]=FreePartition[j]-ProcessNeed[i]; } } } cout<<"最差适应算法: "< for(i=1;i<=n;i++) { cout< for(j=1;j<=m;j++) { if(WorstPartition[j]==i) { cout< } } } cout< } //-------------------------------------------------------------------- 三、调试分析 本题中有两种主要算法: Safety和Order的时间复杂度均为O(n*n),本题的空间复杂度亦为O(n*n)。 四、用户手册 1.本程序的运行环境为MicrosoftVisualC++6.0。 2.按提示键入输入选择算法 3.由文件输入测试数据。 4.接受其他命令后即执行相应运算和显示相应结果。 5.关闭窗口则退出程序。 五、测试结果 六、附录 suanfa.h//算法程序 Main.cpp//主程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 分配 算法