C++模拟可变分区存储管理

可变分区方式是按作业需要的主存空间大小来分区。当装入一个作业时,首先要查看是否有足够的空闲空间来分配,若有则按指定的分配方式进行分配;否则作业不能装入。

  • 首次适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入第一个满足条件的空间中去。
  • 最佳适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最小的一个空间中去。
  • 最坏适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最大的一个空间中去。

其实3种方式只是对空闲分区的选择策略不同。

#include <iostream>
#include <list>
#include <string>
#include <fstream>

using namespace std;
//这里必须要给个名字,负责重载运算符会报错
typedef struct Job
{
	int start;			//起始地址
	int lenght;		    //长度
	int tag;			//名称
	//重载==,后面从list移除Job要用到
	bool operator == (const Job &a)const {
		return a.start==start&&a.lenght==lenght;
	}
}Job;
//排序的规则 递增
bool excellentCompare(Job & a,Job & b){
	return a.lenght<b.lenght;
}
//递减
bool worstCompare(Job & a, Job & b) {
	return a.lenght > b.lenght;
}
list<Job> frees;	//空闲区表
list<Job> occupys;	//已分配区表
void view();	//显示分区信息
void earliest();	//最先适应分配算法
void excellent();	//最优适应分配算法
void worst();	//最坏适应算法
void select();

int main(){
	//这里用一个文件保存:开始地址 大小
	//比如
	/*
	20 30
	100 20
	160 5
	210 46
	*/
	ifstream file("mem.txt");
	cout<<"加载空闲表文件:"<<endl;
	cout<<"始址\t大小"<<endl;
	
	while(!file.eof()){
		Job job;
		file>>job.start>>job.lenght;
		job.tag=-1;
		if(file.fail())break;
		cout<<job.start<<"\t"<<job.lenght<<endl;
		frees.push_back(job);
	}
	file.close();
	//调用算法
	//earliest();
	//excellent();
	worst();
	view();
	frees.clear();
	occupys.clear();
	system("pause");
	return 0;
}

void view(){
	cout<<"空闲分区表"<<endl;
	cout<<"序号\t始址\t大小"<<endl;
	int i=1;
	list<Job>::iterator it;
	for(it=frees.begin();it!=frees.end();it++){
		cout<<i++<<'\t'<<it->start<<'\t'<<it->lenght<<endl;
	}
	i=1;
	cout<<"已分空闲分区表"<<endl;
	cout<<"序号\t始址\t大小\t状态"<<endl;
	for(it=occupys.begin();it!=occupys.end();it++){
		cout<<i++<<'\t'<<it->start<<'\t'<<it->lenght<<"\t作业"<<it->tag<<endl;
	}
}
void earliest(){
	cout << "最先适应分配算法:" << endl;
	select();
}
void excellent(){
	cout << "最优适应分配算法:" << endl;
	frees.sort(excellentCompare);
	select();
}
void worst(){
	cout << "最坏适应算法:" << endl;
	frees.sort(worstCompare);
	select();
}
void select() {
	cout << "请输入作业请求序列:" << endl;
	cout << "作业名\t作业大小" << endl;
	Job job;
	list<Job>::iterator it;
	while (!cin.eof()) {
		cin >> job.tag >> job.lenght;
		if (cin.fail())break;
		bool isOk = false;
		//查询第一个满足的分区
		for (it = frees.begin(); it != frees.end(); it++) {
			//找到了
			if (it->lenght >= job.lenght) {
				Job used = (*it);
				frees.remove(*it);
				//没有用完 
				if (used.lenght != job.lenght) {
					Job free = { used.start + job.lenght,used.lenght - job.lenght,-1 };
					frees.push_back(free);
				}
				used.lenght = job.lenght;
				used.tag = job.tag;
				occupys.push_back(used);
				isOk = true;
				break;
			}
		}
		if (!isOk) {
			cout << "无法分配 作业"<<job.tag<< endl;
		}
	}
}

运行效果:
3种算法的运行结果

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态分区分配是一种内存分配方式,它将可用内存空间分成若干个动态的分区,每个分区都可以被分配给进程使用。首次适应算法是其一种常用的分配算法,它会在空闲分区链表从头开始查找,找到第一个能满足进程需要的分区进行分配。 针对首次适应算法的实验结果分析,我们可以从以下几个方面进行考虑: 1. 内存利用率:首次适应算法的内存利用率与空闲分区链表的组织方式有关,如果空闲分区链表分区大小差异较大,可能会导致某些较小的分区无法被利用。因此,实验我们需要考虑不同的分区大小分布情况,以评估算法的内存利用率。 2. 分配速度:首次适应算法的分配速度受到空闲分区链表的长度和组织方式的影响。较长的链表可能导致搜索时间较长,从而降低分配速度。因此,实验我们需要考虑不同的分区数量和分布情况,以评估算法的分配速度。 3. 碎片情况:由于首次适应算法会在空闲分区链表找到第一个满足需求的分区进行分配,可能会导致剩余的空间无法被利用,从而产生碎片。因此,实验我们需要考虑不同的分区大小和分布情况,以评估算法的碎片情况。 通过对以上几个方面的考虑,我们可以得出首次适应算法的实验结果分析。具体分析结果需要根据实验的具体情况进行评估和总结。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值