动态分区分配算法

设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,Pn,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, … ,Sm,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。

程序要求

1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。

2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。

3)输入:空闲分区个数n,空闲分区大小P1, … ,Pn,进程个数m,进程需要的分区大小S1, … ,Sm,算法选择1-首次适应算法,2-循环首次适应算法,3-最佳适应算法,4-最坏适应算法。

4)输出:最终内存空闲分区的分配情况。

完整代码
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
const int MaxNumber=100;
int  FreePartition[MaxNumber];	//空闲分区 
int  FirstPartition[MaxNumber];  //首次适应
int  CycleFirstPartition[MaxNumber];  // 循环首次适应
int  BestPartition[MaxNumber];  //最佳适应 
int  WorstPartition[MaxNumber];  //最坏适应 
int  ProcessNeed[MaxNumber];	//进程所需分区大小 
int  CopyPartition[MaxNumber];	//复制进程 
int n, m; //n分区,m进程 
 
void output() {
	cout<<"进程信息如下:"<<endl;
	cout<<"---------------------------------------------------"<<endl;
	cout<<left<<setw(12)<<"分区号"<<setw(12)<<"分区大小"<<setw(12)<<"剩余大小"<<setw(12)<<"分区是否被使用"<<endl;
	cout<<"---------------------------------------------------"<<endl;
}
//输出首次适应 
void outFirst() {
	output();
	for(int i=0;i<n;i++){
		cout<<left<<setw(12)<<i;
		cout<<setw(12)<<CopyPartition[i];
		cout<<setw(12)<<CopyPartition[i]-FirstPartition[i];
		if(FreePartition[i] != CopyPartition[i]){
			cout<<"true";
		}else{
			cout<<"false";
		}
		cout<<endl;
	}
	cout<<"---------------------------------------------------"<<endl;
}
//首次适应 
void first() {
	for(int i = 0; i < n; i++) {
		FirstPartition[i] = 0;
	}
	for(int i = 0; i < m; i++) {
		for(int j = 0; j < n; j++) {
			if(ProcessNeed[i] <= FreePartition[j]) {//可以分配 
				FirstPartition[j] += ProcessNeed[i];
				FreePartition[j] -= ProcessNeed[i];
				//cout<<FreePartition[j]<<endl;
				cout<<"进程"<<i<<"分配给"<<j<<"号空闲区"<<endl;
				break;
			}
		}
	}
	cout<<endl;
	outFirst();
}
//输出循环首次适应 
void outCircleFirst() {
	output();
	for(int i=0;i<n;i++){
		cout<<left<<setw(12)<<i;
		cout<<setw(12)<<CopyPartition[i];
		cout<<setw(12)<<CopyPartition[i]-CycleFirstPartition[i];
		if(FreePartition[i] != CopyPartition[i]){
			cout<<"true";
		}else{
			cout<<"false";
		}
		cout<<endl;
	}
	cout<<"---------------------------------------------------"<<endl;
}
 
//循环首次适应 
void circleFirst() {
	for(int i = 0; i < n; i++) {
		CycleFirstPartition[i] = 0;
	}
	int pointer = 0;//记录上次查找的位置 
	for(int i = 0; i < m; i++) {
		for(int j = pointer; j < n; j++) {
			if(ProcessNeed[i] <= FreePartition[j]) {//可以分配 
				CycleFirstPartition[j] += ProcessNeed[i];
				FreePartition[j] -= ProcessNeed[i];
				pointer = j;
				cout<<"进程"<<i<<"分配给"<<j<<"号空闲区"<<endl;
				break;
			}
			if(j == n - 1) {
				pointer = 0;
			}
		}
	}
	cout<<endl;
	outCircleFirst();
}
//输出最佳适应 
void outBest() {
	output();
	for(int i=0;i<n;i++){
		cout<<left<<setw(12)<<i;
		cout<<setw(12)<<CopyPartition[i];
		cout<<setw(12)<<CopyPartition[i]-BestPartition[i];
		if(FreePartition[i] != CopyPartition[i]){
			cout<<"true";
		}else{
			cout<<"false";
		}
		cout<<endl;
	}
	cout<<"---------------------------------------------------"<<endl;
}
 

//最佳适应   先给小的区分配 
void best() {
	
	for(int i = 0; i < n; i++) {
		BestPartition[i] = 0;
	}
	for(int i = 0; i < m; i++) {
		int min = 100000; //表示无穷大 
		int flag = -1;
		for(int j = 0; j < n; j++) {
			if(FreePartition[j] - ProcessNeed[i] < min && ProcessNeed[i] <= FreePartition[j]) {
				min = FreePartition[j] - ProcessNeed[i];
				flag = j;
			}
		}cout<<"进程"<<i<<"分配给"<<flag<<"号空闲区"<<endl;
		if(flag != -1) {
			BestPartition[flag] += ProcessNeed[i];
			FreePartition[flag] -= ProcessNeed[i];
		}
	}
	cout<<endl;
	outBest();
}
//输出最坏适应  
void outWorse() {
	output();
	for(int i=0;i<n;i++){
		cout<<left<<setw(12)<<i;
		cout<<setw(12)<<CopyPartition[i];
		cout<<setw(12)<<CopyPartition[i]-WorstPartition[i];
		if(FreePartition[i] != CopyPartition[i]){
			cout<<"true";
		}else{
			cout<<"false";
		}
		cout<<endl;
	}
	cout<<"---------------------------------------------------"<<endl;
}
//最坏适应  按照空闲区从大到小分配 
void worse() {
	for(int i = 0; i < n; i++) {
		WorstPartition[i] = 0;
	}
	for(int i = 0; i < m; i++) {
		int max = 0; //表示无穷大 
		int flag = -1;
		for(int j = 0; j < n; j++) {
			if(FreePartition[j] - ProcessNeed[i] > max && ProcessNeed[i] <= FreePartition[j]) {
				max = FreePartition[j] - ProcessNeed[i];
				//cout<<"进程"<<i<<"分配给"<<j<<"号空闲区"<<endl;
				flag = j;
			}
		}
		cout<<"进程"<<i<<"分配给"<<flag<<"号空闲区"<<endl;
		if(flag != -1) {
			WorstPartition[flag] += ProcessNeed[i];
			FreePartition[flag] -= ProcessNeed[i];
		}
	}
	cout<<endl;
	outWorse();
}
 
void menu(){
	cout<<endl;
	cout<<"算法清单"<<endl;
	cout<<"1.首次适应算法(FF)"<<endl;
	cout<<"2.循环首次适应算法(NF)"<<endl;
	cout<<"3.最佳适应算法(BF)"<<endl;
	cout<<"4.最坏适应算法(WF)"<<endl;
	cout<<"0.退出程序(EXIT)"<<endl;
	cout<<endl;
}

int main() {
	cout<<"--------------------动态分区分配算法--------------------"<<endl; 
	int choice;
	cout<<"请输入空闲分区数"<<endl;
	cin>>n;
	cout<<"请输入"<<n<<"个空闲分区的大小"<<endl;
	for(int i = 0; i < n; i++) {
		cin>>FreePartition[i];
	}
	for(int i = 0; i < n; i++) {
		CopyPartition[i] = FreePartition[i];
	}
	cout<<"请输入进程个数"<<endl;
	cin>>m;
	cout<<"请输入"<<m<<"个进程的大小"<<endl;
	for(int i = 0; i < m; i++) {
		cin>>ProcessNeed[i];
	}
	do{
		menu();
		cout<<"请选择要进行的操作:";
		cin>>choice;
		cout<<endl;
		switch(choice){
			case 1:
				cout<<"使用首次适应算法"<<endl;
				first();
				break;
			case 2:
				cout<<"使用循环首次适应算法"<<endl;
				circleFirst();
				break;
			case 3:
				cout<<"使用最佳适应算法"<<endl;
				best();
				break;	
			case 4:
				cout<<"使用最坏适应算法"<<endl;
				worse();
				break; 
			case 0:
				cout<<"程序终止!"<<endl;
				return 0;
		}
		cout<<endl;
		system("pause");
	}while(choice);
	return 0;
}

实例运行结果截图:

空闲分区数:9

9个空闲分区的大小:16 16 8 32 64 32 8 16 64

进程个数:6

6个进程的大小:7 18 9 20 35 8

首次适应算法:

循环首次适应算法:

最佳适应算法:

最坏适应算法:

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Issme

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值