可变分区方式是按作业需要的主存空间大小来分区。当装入一个作业时,首先要查看是否有足够的空闲空间来分配,若有则按指定的分配方式进行分配;否则作业不能装入。
- 首次适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入第一个满足条件的空间中去。
- 最佳适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最小的一个空间中去。
- 最坏适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最大的一个空间中去。
其实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;
}
}
}
运行效果: