动态分区分配算法

时间:2024.5.4

操作系统实验四

题目 : 动态分区分配算法

班级 : 姓名 : 学号 : 完成日期 :

一、 需求分析

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)程序中变量定义参考(根据需要可添加)如下:

const int MaxNumber=100; int FreePartition[MaxNumber]; int FirstPartition[MaxNumber]; int CycleFirstPartition[MaxNumber]; int BestPartition[MaxNumber]; int WorstPartition[MaxNumber]; int ProcessNeed[MaxNumber]; int PartitionNum,ProcessNum;

2)页面置换的实现过程如下:

? 变量初始化;

? 空闲分区个数n,空闲分区大小P1, … ,Pn,进程个数m,进程需要的分区大小

S1, … ,Sm,算法选择1-首次适应算法,2-循环首次适应算法,3-最佳适应算法,4-最坏适应算法;

? 根据用户选择的算法进行动态分区分配;

? 输出所有进程分配后的空闲分区分配情况。

二、 概要设计

1. 变量描述

int m,n; char ResName[MaxNumber]; char ProName[MaxNumber];

操作系统实验四

2. int Available[MaxNumber]; int Max[MaxNumber][MaxNumber]; int Allocation[MaxNumber][MaxNumber]; int Need[MaxNumber][MaxNumber]; 主程序的流程以及各程序模块之间的调用关系:

(1). 资源分配表初始化(Initialization)

(2). 读取资源分配表(Resource)

(3). 安全性算法(Safety)

(4). 银行家算法(Order)

(5). 申请需求后的银行家算法(Request)

(6). 结束程序

三.详细设计

#include"suanfa.h"

//-------------------------- 主函数 ------------------------------

int main()

{

cout<<"--------关闭窗口则退出.-----------"<<endl; int FreePartition[MaxNumber]; int FirstPartition[MaxNumber]; char Name[MaxNumber]; int CycleFirstPartition[MaxNumber]; int BestPartition[MaxNumber]; int WorstPartition[MaxNumber]; int ProcessNeed[MaxNumber]; int PartitionNum,ProcessNum; int k=1; while(k) { char chioce; cout<<"请键入一个选择功能符(I:Initialization,F:First,N:Next,"<<endl; cout<<"B:Best,W:Worst,Q:Quit):"<<endl; 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,Part } case'Q':k=0; //退出运行 } itionNum);break; //最坏适应算法 return 0;

//----------------------------------------------------------------

//==================================================================== #include<iostream>

#include<fstream>

using namespace std;

#define MaxNumber 100

//==================================================================== void Initialization(char Name[],int FreePartition[],int ProcessNeed[],int &m,int &n)

{ //将数据写入文件partition.txt中

int i; ofstream fout("partition.txt"); cout<<"请输入进程个数:m = "; // cin>>m; fout<<m<<endl; cout<<"请输入空闲分区个数:n = "; // cin>>n; fout<<n<<endl; char *name=new char[m]; int *free=new int[n]; int *need=new int[m]; cout<<"请输入"<<m<<"个进程名称:"; for (i=1;i<=m;i++) { cin>>name[i]; } for (i=1;i<=m;i++) {

操作系统实验四

Name[i]=name[i]; fout<<Name[i]<<" "; } fout<<endl; cout<<"请输入"<<m<<"个进程需求大小:"; // for (i=1;i<=m;i++) { } for (i=1;i<=m;i++) { ProcessNeed[i]=need[i]; fout<<ProcessNeed[i]<<" "; cin>>need[i]; } fout<<endl; cout<<"请输入"<<n<<"个空闲分区大小:"; // for (i=1;i<=n;i++) { cin>>free[i]; } for (i=1;i<=n;i++) { FreePartition[i]=free[i]; } fout<<FreePartition[i]<<" "; fout<<endl; cout<<"空间分区和进程大小已写入文件partition.txt中。"<<endl;

}

//--------------------------------------------------------------------

void Partition(char Name[],int FreePartition[],int ProcessNeed[],int &m,int &n)

{ //从partition.txt文件中读取数据

int i; ifstream fin("partition.txt"); fin>>m; fin>>n; char *name=new char[m]; int *free=new int[n]; int *need=new int[m]; for (i=1;i<=m;i++) { fin>>name[i];

操作系统实验四

} Name[i]=name[i]; for (i=1;i<=m;i++) { } for (i=1;i<=n;i++) { } fin>>free[i]; FreePartition[i]=free[i]; fin>>need[i]; ProcessNeed[i]=need[i];

}

//-------------------------------------------------------------------- /*void Select(int FreePartition[],int &n)

{ //泡沫排序

int t; for (int j=1;j<=n;j++) { for (int i=1;i<=n-j+1;i++) { if (FreePartition[i-1]>FreePartition[i]) { } } t=FreePartition[i-1]; FreePartition[i-1]=FreePartition[i]; FreePartition[i]=t;

}

}*/

//-------------------------------------------------------------------- int Min(int FreePartition[],int &n,int &t)

{ //求最小数

t=FreePartition[1]; for (int i=1;i<=n;i++) { if (FreePartition[i]<t) { t=FreePartition[i]; } } return t;

操作系统实验四

}

//--------------------------------------------------------------------

int Max(int FreePartition[],int &n,int &t)

{ //求最小数

} t=FreePartition[1]; for (int i=1;i<=n;i++) { } if (FreePartition[i]>t) { } t=FreePartition[i]; return t;

//--------------------------------------------------------------------

void First(char Name[],int FreePartition[],int ProcessNeed[],int FirstPartition[],int &m,int &n) { //首次适应算法

Partition(Name,FreePartition,ProcessNeed,m,n); int i,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<<"首次适应算法: "<<endl; for (i=1;i<=n;i++) { cout<<FreePartition[i]<<" "; for (j=1;j<=m;j++) { if (FirstPartition[j]==i) { } cout<<Name[j]<<" ";

操作系统实验四

}

}

cout<<endl;

}

//--------------------------------------------------------------------

void Next(char Name[],int FreePartition[],int ProcessNeed[],int CycleFirstPartition[],int &m,int &n)

{ //循环首次适应算法

Partition(Name,FreePartition,ProcessNeed,m,n);

int i,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++) { } } 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]; if (ProcessNeed[i]<=FreePartition[j]&&CycleFirstPartition[i]==0) { } CycleFirstPartition[i]=j; FreePartition[j]=FreePartition[j]-ProcessNeed[i]; } } cout<<"循环首次适应算法: "<<endl; for (i=1;i<=n;i++) { cout<<FreePartition[i]<<" "; for (j=1;j<=m;j++)

操作系统实验四

} } { } if (CycleFirstPartition[j]==i) { cout<<Name[j]<<" "; } cout<<endl;

//--------------------------------------------------------------------

void Best(char Name[],int FreePartition[],int ProcessNeed[],int BestPartition[],int &m,int &n) { //最佳适应算法

Partition(Name,FreePartition,ProcessNeed,m,n); int i,j,t; int *Order=new int[n]; for (i=1;i<=m;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]; BestPartition[i]=0; for (i=1;i<=n;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<<"最佳适应算法: "<<endl; for (i=1;i<=n;i++) { cout<<FreePartition[i]<<" "; for (j=1;j<=m;j++) { } if (BestPartition[j]==i) { } cout<<Name[j]<<" "; } cout<<endl;

}

//--------------------------------------------------------------------

void Worst(char Name[],int FreePartition[],int ProcessNeed[],int WorstPartition[],int &m,int &n) { //最差适应算法

Partition(Name,FreePartition,ProcessNeed,m,n); int i,j,t; int *Order=new int[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<<"最差适应算法: "<<endl; for (i=1;i<=n;i++) { } cout<<FreePartition[i]<<" "; for (j=1;j<=m;j++) { } if (WorstPartition[j]==i) { } cout<<Name[j]<<" "; cout<<endl;

//--------------------------------------------------------------------

三、 调试分析

本题中有两种主要算法:Safety和Order的时间复杂度均为O(n*n),本题的空间复杂度亦为O(n*n)。

四、 用户手册

1. 本程序的运行环境为Microsoft Visual C++ 6.0。

2. 按提示键入输入选择算法

3. 由文件输入测试数据。

4. 接受其他命令后即执行相应运算和显示相应结果。

5. 关闭窗口则退出程序。

五、 测试结果

操作系统实验四

六、 附录

suanfa.h //算法程序 Main.cpp //主程序

动态分区分配算法

更多相关推荐:
动态分析调整

3动态分析调整由于社会环境家庭环境组织环境个人成长曲线等变化以及各种不可预测因素的影响一个人的职业生涯发展往往不是一帆风顺的为了更好地主动把握人生适应千变万化的职场世界拟定一份备选的职业生涯规划方案是十分必要的...

思想动态分析

年月职工思想动态分析一支局职工支局完成了年月至月新华人寿期缴竞赛目标区局竞赛奖金至今未下发还有年第一季度期缴趸缴均完成了竞赛目标而竞赛奖金区局仍未下发但保险每月未开单的考核是每月业务酬金中就扣除了看起来就像是只...

工务段职工思想动态分析报告

职工思想动态分析报告进入二季度以来工务段坚持贯彻职代会会议精神以两会为契机广泛动员广大党员群众积极参与到企业文化建设中来使广大职工保持了良好的精神状态营造了的良好的工作环境通过采取无记名问卷约谈职工入户调查等方...

员工季度思想动态分析报告

一季度员工思想动态分析一员工思想现状进入一季度以来新闻中心继续坚持贯彻职代会会议精神以两会为契机广泛动员广大党员群众积极参与到企业文化建设中来使广大员工保持了良好的精神状态营造了的良好的工作环境二思想现状存在的...

《专业前沿技术发展动态》课程分析报告20xx0529

天津理工大学专业前沿技术发展动态实验教学指导书课程代码19xx006课程名称专业前沿技术发展动态开课院系实验室华信软件学院C408机房适用专业软件工程实验指导书名称自编指导教师张一鸣实验软件开发项目管理过程的分...

20xx年度设备部 季度员工思想动态分析报告

20xx年设备部一季度思想动态分析报告20xx年一季度设备部党支部认真贯彻20xx年集团公司分公司公司工作会及职代会会议精神同时认真贯彻学习两会精神在公司形势严峻工作任务艰巨的情况下干部职工仍保持了良好的精神状...

员工思想动态调查问卷分析报告

物业服务公司员工思想动态调查问卷分析报告为全面掌握物业服务公司工作人员思想动态了解员工实际所需为今后公司发展及员工关怀找准方向20xx年2月26日至29日在物业服务公司各项目开展了员工思想动态调研工作共发放调查...

20xx-20xx年中国精子分析仪行业市场分析及投资可行性研究报告

中金企信北京国际信息咨询有限公司国统调查报告网20xx20xx年中国精子分析仪行业市场分析及投资可行性研究报告报告目录第一部分行业发展现状第一章精子分析仪行业发展概述第一节精子分析仪的相关知识一精子分析仪的定义...

20xx-20xx年中国精子处理洗涤液市场分析及发展趋势研究预测报告

中金企信北京国际信息咨询有限公司国统调查报告网20xx20xx年中国精子处理洗涤液市场分析及发展趋势研究预测报告报告目录第一章世界精子处理洗涤液行业发展态势分析第一节世界精子处理洗涤液市场发展状况分析一世界精子...

20xx-20xx年中国精子分析仪行业市场发展战略分析及投资前景预测报告

中金企信北京国际信息咨询有限公司国统调查报告网20xx20xx年中国精子分析仪行业市场发展战略分析及投资前景预测报告报告目录第一部分行业发展现状第一章精子分析仪行业发展概述第一节精子分析仪的相关知识一精子分析仪...

干部职工思想动态分析报告

干部职工思想动态分析报告宣传群工部根据关于报送干部职工思想动态分析报告的通知的要求为全面客观了解职工思想状况把握职工思想脉搏有针对性地做好思想政治工作服务改革发展大局增强职工队伍的凝聚力和战斗力科技处深入开展职...

20xx-20xx年中国精子处理洗涤液行业市场分析及投资可行性研究报告

中金企信北京国际信息咨询有限公司国统调查报告网20xx20xx年中国精子处理洗涤液行业市场分析及投资可行性研究报告报告目录第一部分行业发展现状第一章精子处理洗涤液行业发展概述第一节精子处理洗涤液的相关知识一精子...

动态分析调整(2篇)