操作系统实验报告操作系统实验报告ch3实验三 可变分区存储管理方式的内存分配回收
一.实验目的
(1)深入了解可变分区存储管理方式的内存分配回收的实现。
二.实验内容
编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表,并采用最优适应算法完成内存的分配与回收。
三.实验原理
在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。在...
实验三 可变分区存储管理方式的内存分配回收
一.实验目的
(1)深入了解可变分区存储管理方式的内存分配回收的实现。
二.实验
编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表,并采用最优适应算法完成内存的分配与回收。
三.实验原理
在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。可变分区的回收算法较为复杂,当一个作业撤离时,可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B),其两边均为空闲区。尤其重要的是,在程序中利用“new类型T(初值列表)”申请分配用于存放T类型数据的内存空间,利用“delete指针名”释放指针所指向的内存空间。
四.实验部分源程序
#include
using namespace std;
typedef struct SNode { // Space Node
int start,end; // 起始,结束
int length; // 长度大小
struct SNode *next; // 指向下一结点的指针
}* SP;
SP Head=(SP)malloc(sizeof(SNode)); // 全局变量,内存空间头结
void DispSpace() { // 显示内存空间分配情况
SP p=Head->next;
cout<<"\n 空闲区说明表 \n"
<<"---地址--长度---\n";
while (p)
{
cout<<" "<start
<<" "<length<next;
}
cout<<"----------------\n";
}
void Initial() { // 初始化说明表
SP p,q;
p=(SP)malloc(sizeof(SNode));
q=(SP)malloc(sizeof(SNode));
p->start=14; p->length=12; p->end=26;
q->start=32; q->length=96; q->end=128; // 指导书上的作业分配
Head->next=p; // 与头结点连接
p->next=q;
q->next=NULL;
DispSpace();
}
void Allocation(int len) { // 分配内存给新作业
SP p=Head->next,q;
while (p)
{
if (p->length < len)
p=p->next;
else if (p->length > len)
{
p->start=p->start+len;
p->length=p->length-len;
cout<<"分配成功!\n";
DispSpace(); return;
}
else
{//当两者长度相等
q=p->next;
p->next=q->next;
cout<<"分配成功!\n";
DispSpace(); return;
}
}
cout<<"分配失败!\n";
DispSpace(); return;
}
void CallBack(int sta,int len) { // 回收内存
SP p=Head,q=p->next,r; // 开始地址和长度
p->end=0;
int en=sta+len;
while (q) {
if (sta == 0) { // 初始地址为0
if (en == q->start) { // 正好回收
q->start=0;
q->length=q->end;
return;
}
else {
r=(SP)malloc(sizeof(SNode));
r->start=sta; r->length=len; r->end=en;
p->next=r;
r->next=q;
return;
}
}
else if ((p->end < sta) && (q->start > en)) { // 上邻区
r=(SP)malloc(sizeof(SNode));
r->start=sta; r->length=len; r->end=en;
p->next=r;
r->next=q;
return;
}
else if ((p->end < sta) && (q->start == en)) { // 邻区相接
q->start=sta;
q->length=q->end-sta;
return;
}
else if ((p->end == sta) && (q->start < en)) { // 下邻区
p->end=en;
p->length=en-p->start;
return;
}
else if (p->end==sta && q->start==en) { // 邻区相接
p->end=q->end;
p->length=p->end-p->start;
p->next=q->next;
return;
}
else {
p=p->next;
q=q->next;
}
}
}
void main() {
Initial();
cout<<"现在分配大小为 6K 的作业 4 申请装入主存: ";
Allocation(6); // 分配时参数只有长度
//--------指导书测试数据演示----------
cout<<"现回收作业 3 (起址10,长度4)\n";
CallBack(10,4);
DispSpace();
cout<<"现回收作业 2 (起址26,长度6)\n";
CallBack(26,6);
DispSpace();
//---------------演示结束-------------
system("pause");
}
五.实验结果与体会
我的体会:
本文档为【操作系统实验报告操作系统实验报告ch3】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。