题目:
在可变分区管理方式下采用最先适应算法实现主 存分配和实现主存回收。 [提示]:
(1)可变分区方式是按作业需要的主存空间大小来分割分 区的。当要装入一个作业时,根据作业需要的主存量查看是 否有足够的空闲空间,若有,则按需要量分割一个分区分配 给该作业;若无,则作业不能装入。随着作业的装入、撤离 ,主存空间被分成许多个分区,有的分区被作业占用,而有 的分区是空闲的。例如:
为了说明哪些区是空闲的,可以用来装入新作业,必须 要有一张空闲区说明表,格式如下:
(2) 当有一个新作业要求装入主存时,必须查空闲区说 明表,从中找出一个足够大的空闲区。有时找到的空闲区可 能大于作业需要量,这时应把原来的空闲区变成两部分:一 部分分给作业占用;另一部分又成为一个较小的空闲区。为 了尽量减少由于分割造成的空闲区,而尽量保存高地址部分 有较大的连续空闲区域,以利于大型作业的装入。为此,在 空闲区说明表中,把每个空闲区按其地址顺序登记,即每个 后继的空闲区其起始地址总是比前者大。为了方便还可以使表格“紧缩” ,总是让“空表目”栏集中在表哥的后部。
(3) 采用最先适应算法(顺序分配算法)分配主存空间。 按照作业的需要量,查空闲区说明表,顺序查看登记栏,找 到第一个能满足要求的空闲区。当空闲区大于需要量时,一 部分用来装入作业,另一部分仍为空闲区登记在空闲区说明 表中。 由于本实验是模拟主存的分配,所以把主存区分配给作 业后并不实际启动装入程序装入作业,而用输出“分配情况 ”来代替。最先适应分配算法如图6-1。
(4) 当一个作业执行结束撤离时,作业所占的区域应该 归还,归还的区域如果与其它空闲区相邻,则应合成一个较 大的空闲区,登记在空闲区说明表中。例如,在提示(1) 中列举的情况下,如果作业2撤离,归还所占主存区域时, 应与上、下相邻的空闲区一起合成一个大的空闲区登记在空 闲区说明表中。归还主存时的回收算法如图6-2。
(5) 请按最先适应算法设计主存分配和回收的程序。然 后按(1)中假设主存中已装入三个作业,且形成两个空闲 区,确定空闲区说明表的初值。现有一个需要主存量为6K 的作业4申请装入主存;然后作业3撤离;再作业2撤离。请 你为它们进行主存分配和回收,把空闲区说明表的初值以及 每次分配或回收后的变化显示出来或打印出来。
数据结构:
struct memory//储存每一块内存
{
int num;//作业号
int start;
int length;
bool panduan;//判断未分配或已分配
};
vector m;//储存内存信息
bool cmp(memory a, memory b)//按内存块起始位置排序
{
return a.start < b.start;
}
void init()//初始化
void print()//打印内存信息
int pan(int n)//判断作业是否已存在
void change(int n, int m1)//更新内存信息
具体代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct memory
{
int num;//作业号
int start;
int length;
bool panduan;//判断未分配或已分配
};
vector<memory> m;
bool cmp(memory a, memory b)
{
return a.start < b.start;
}
void init()
{
memory mem;
mem.num = -1;
mem.start = 0;
mem.length = 512;
mem.panduan = false;
m.push_back(mem);
}
void print()
{
int M=m.size();
int N=0;
sort(m.begin(),m.end(),cmp);
cout << "标识号 作业号 起址 长度 状态" << endl;
for (vector<memory>::iterator iter =m.begin(); iter != m.end(); iter++)
{
cout<<N<<" "; N++;
if(iter->num!=-1)cout<< iter->num<<" ";
else cout<<" ";
cout<<iter->start<<" "<<iter->length<<" ";
if(iter->panduan == 0) cout << "未分配" << endl;
else cout << "已分配" << endl;
}
N=0;
}
int pan(int n)//判断作业是否已存在
{
for (vector<memory>::iterator iter =m.begin(); iter != m.end(); iter++)
{
if (iter->num==n) return 1;
}
return 0;
}
void change(int n, int m1)
{
if(pan(n)==0)
{
bool pwd=false;
for (vector<memory>::iterator iter =m.begin(); iter != m.end(); iter++)
{
if (iter->panduan==0&&iter->length>=m1)
{
memory mem1;
mem1.num=-1;
mem1.start += iter->start + m1;
mem1.length =iter->length-m1;
mem1.panduan = false;
iter->num =n;
iter->length=m1;
iter->panduan = true;
m.push_back(mem1);
cout << "资源分配成功" << endl;
print();
pwd=true;
break;
}
}
if (pwd==false) cout << "没有空闲空间,请等待" << endl;
}
else
{
bool find = false;
cout << "资源释放成功" << endl;
for (vector<memory>::iterator iter =m.begin(); iter != m.end(); iter++)
{
if ((iter+1)->start == iter->start + iter->length&&(iter+1)->panduan==false&&iter->num==n)
{
(iter+1)->start -= iter->length;
(iter+1)->length += iter->length;
if((iter-1)->start+ (iter-1)->length== iter->start &&(iter-1)->panduan==false&&iter->num==n)
{
(iter-1)->length+=(iter+1)->length;
m.erase(iter+1);
}
m.erase(iter);
cout<<"和后面的空闲区合并"<<endl;
find = true;
break;
}
if((iter-1)->start == iter->start - iter->length&&(iter-1)->panduan==false&&iter->num==n)
{
(iter-1)->length += iter->length;
m.erase(iter);
cout<<"和前面的空闲区合并"<<endl;
find = true;
break;
}
if (find == false&&iter->num==n)
{
iter->num = -1;
iter->panduan = false;
}
}
print();
}
}
int main()
{
init();
print();
while (1)
{
int n, m;
cout << "请输入申请或者释放的作业号及资源数量:";
cin >> n >> m;
if (m > 512) cout << "对不起,内存空间不足" << endl;
else change(n, m);
}
}