操作系统实验:主存管理
题目:
在可变分区管理方式下采用最先适应算法实现主 存分配和实现主存回收。 [提示]:
(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
#include
#include
using namespace std;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()
{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::iterator iter =m.begin(); iter != m.end(); iter++){cout<num!=-1)cout<< iter->num<<" ";else cout<<" ";cout<start<<" "<length<<" ";if(iter->panduan == 0) cout << "未分配" << endl;else cout << "已分配" << endl;}N=0;
}
int pan(int n)//判断作业是否已存在
{for (vector::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::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::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<<"和后面的空闲区合并"<start == iter->start - iter->length&&(iter-1)->panduan==false&&iter->num==n){(iter-1)->length += iter->length;m.erase(iter);cout<<"和前面的空闲区合并"<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); }
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
