操作系统实验:主存管理

题目:

在可变分区管理方式下采用最先适应算法实现主 存分配和实现主存回收。 [提示]:
(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);	
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值