内存管理实验报告
题目:编写一个程序来模拟内存的管理
一. 需求分析
1. 编写一个程序来模拟内存的管理,要求:
.采用活动分区方案,但不采用紧凑算法。
.假设系统内存容量为100KB。
.要能处理内存回收的时候上下邻合并的问题。
.能够处理以下的情形:
..(1)、 随机出现的进程i申请jKB内存,程序能判断是否能
分配,如果能分配,要把分配的首地址Handle输出到屏幕
上。不能分配输出字符串“NULL”。
..(2)、释放随机的首地址为Handle的内存块。释放成功返回
Success,否则返回Failure
..(3)、内存情况输出,要求输出内存使用情况和空闲情况。
内存情况输出的格式为:
Haddress该分区的首地址
Eaddress该分区的尾地址
Len 分区长度
Process 如果使用,使用的进程号, 否则为0
二.详细设计
1. 主函数程序
#include "memory.h"
int main()
{ Memory Memo;
int ELen,Len;
int k=1,Ha,H,e=0;
for(int i=0;i<10;i++,e++){
if(i==e)ELen=Random();//产生随机数..
else e=i;
H=Memo.OkorError(ELen);//调用判断函数...
cout<< endl << "The " << i+1 << " process arrive(Len=" << ELen<<")....." << endl; if(H==(-1)){
cout<<"Failure............Wait....."<<endl;
cout<< "The process " << k << " end................"<< endl;
Ha=Memo.FineProcess(k);
Len=Memo.FineLen(k);
Memo.DelProcess(Ha,Len);
cout<< "\t\t MEMORY" << endl;
Memo.PrintMemory();
//cout<< "Any Key Stop........" << endl;//随便按任意键..程序暂停运行..
Lost_Time(2);
i--; k++;
}//if
else{
cout<< "Success..................." << endl;
Memo.GetProcess(H,i+1,ELen);
cout<< "\t\t MEMORY" << endl;
Memo.PrintMemory();
Lost_Time(2);
}//else
}//for
return 0;
}//main()
2. 头文件1
#if !defined(STDAFX)
#define STDAFX
#include <iostream.h>
#include <stdio.h>
#include <cstdlib>
#include <time.h>
#define ALL_LEN 100
extern int Random();
extern void Lost_Time(long tt);
#endif
///////////////////////////////////////////////////////
头文件2
#if !defined(MENORY_H)
#define MENORY_H
#include "StdAfx.h"
class Memory{//定义一个内存的类...
private:
int Eaddress, Haddress;
int Len, User;
int a[ALL_LEN];//虚拟的ALL_LEN长度的内存..数组数值存放使用它的进程. public:
Memory(){
Haddress=0;
Eaddress=0;
Len =ALL_LEN;
User =0;
for(int i=0;i<ALL_LEN;i++)a[i]=0;
}
int OkorError(int ELen);//判断是否可以分配..可以就返回头地址..否则返-1 int FineProcess(int EUser);//查找进程...找到返回该进和头地址...
int FineLen(int EUser);//输入进程号...返回它的长度...
void GetProcess(int EHaddress,int EUser,int ELen);//把进程放入内存.. void DelProcess(int EHaddress,int ELen);//进程从内存中删除.... void PrintMemory();//输出内存状态...
};
#endif
3. 基本操作文件
#include "memory.h"
int Memory::OkorError(int ELen)
{ Len=ELen;
int k=0,pos;
int *p; p=a;
for(int i=0;i<ALL_LEN;i++,p++){
while(*p!=0){
if(i>1){ if(*(p-1)==0)k=0;}//if
break;
}//while
if(*p!=0)continue;
if(*p==0&&k==0)pos=i; k++;
if(k==Len)return pos;
}//for
return (-1);
}//OkorError()
////////////////////////////////////////////////////////////
int Memory::FineProcess(int EUser)
{ User=EUser;
for(int i=0;i<ALL_LEN;i++)if(a[i]==User)break;
return i;
}//FineProcess()
////////////////////////////////////////////////////////////
int Memory::FineLen(int EUser)
{ User =EUser;
int k=0;
for(int i=0;i<ALL_LEN;i++)if(a[i]==User)k++;
return k;
}//FineLen()
////////////////////////////////////////////////////////////
void Memory::GetProcess(int EHaddress,int EUser,int ELen)
{ Haddress=EHaddress;
User =EUser;
Len =ELen;
for(int i=Haddress;i<Len+Haddress;i++)a[i]=User;
}//GetProcess()
////////////////////////////////////////////////////////////
void Memory::DelProcess(int EHaddress,int ELen)
{ Haddress=EHaddress;
Len =ELen;
for(int i=Haddress;i<Len+Haddress;i++)a[i]=0;
}//DelProcess()
///////////////////////////////////////////////////////////
void Memory::PrintMemory()
{ int *p;
int H=-1,E=0;
p=&a[1];
cout<<"Heard Address\t"<<"End Address\t"<<"Len\t"<<"Ueser"<<endl; for(int i=0;i<ALL_LEN;i++,p++){
E=i;
if(*p!=*(p-1)){ cout<<H+1<<"\t\t"<<E<<"\t\t"<<E-H<<"\t"<<*(p-1)<<endl; H=i;
}//if
}//for
}//PrintMemory()
4. 其它函数
#include "StdAfx.h"
void Lost_Time(long tt)//延时函数...
{ time_t t;
time_t k,g;
g=k=time(&t);
while((k=time(&t))-g<tt);//延时约time秒
}//Lost_Time()
int Random()//产生每次运行都不同的随机数
{
time_t t;
srand((unsigned)time(&t));//随机数种子发生器
return rand()%20+20;//20-40的随机数
}//Random()
三.上机运行
1.本程序运行环境为vc++6.0
2.结果见运行情况
第二篇:实验报告三 可变分区内存管理
实验三 可变分区内存管理
班级:网络工程081 学号: 姓名:
实验日期:20##.11.18
实验内容
可变分区内存管理。
实验目的
(1)体会可变分区内存管理方案。
(2)掌握此方案的内存分配过程、内存回收过程和紧凑算法的实现的实现。
实验目标:
编制一个程序模拟实现可变分区内存管理。实验时,假设系统内存容量为100KB。分配时使用my_malloc(i, j)函数实现,作业释放内存时使用my_free(handle)函数实现,内存情况输出用my_memlist( )实现。
实验步骤:
1.编写主界面,界面上有三个选项:分配内存、回收内存、查看内存。选择分配内存时,要求输入作业的进程号和作业长度,然后使用my_malloc分配内存,报告内存分配结果。回收内存时要求输入进程号,使用my_free实现回收。查看内存时,使用my_memlist实现输出内存使用情况和空闲情况。
2.编写my_malloc(i, j)函数,实现进程i申请j KB内存,要求程序判断是否能分配,如果能分配,要把分配的首地址handle输出到屏幕上。不能分配输出字符串“NULL”。要考虑不能简单分配时,是否符合紧凑的条件,如符合则采用紧凑技术。然后再分配。分配时可采用最佳适应算法。
3.编写my_free(handle)函数,释放首地址为handle的内存块。释放成功返回Success,否则返回Failure。
4.编写my_memlist( )函数,要求输出内存使用情况和空闲情况。
5.内存情况输出的格式为:
ID Address Len Process
其中:
ID:内存分区号
Address:该分区的首地址
Len:分区长度
Process:如果使用,则为使用的进程号,否则为NULL
实验设计
数据结构设计:
可变分区管理方式预先不将内存划分为几个区域,而是将内存除操作系统占用区域外的空间看做一个大的空闲区。实现可变内存的分配和回收主要考虑:第一,设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计内存分配算法;第三,在设计的数据表格基础上设计内存回收算法。
所有分区情况随时可能发生变化,数据结构设计必须满足这一特征。由于分配时空闲区有时会变成两个分区—空闲区和已分分区。分配内存和回收内存的主要操作均在空闲区,这样为了方便对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张是记录空闲区的“空闲区表”,一张记录作业占用分区的“已分分区表”。实验中的结构定义如下。
已分配区表的定义:
#define n 10 //假定系统允许的最大进程数为n
struct
{
float address; //已分分区起始地址
float length; //已分分区长度,单位为字节
int ID; //已分分区内存分区号
char process; //已分分区使用的进程号
}used_table[n]; //已分配区表
空闲区表的定义:
#define m 10 //假定系统允许的空闲区表最大为m
struct
{ float address; //空闲区起始地址
float length; //空闲区长度,单位为字节
int ID; //空闲区内存分区号
int process; //空闲区的进程号为0
}free_table[n]
解决方法:
当要装入一个作业时,从空闲区表中查找标志位“为分配”的空闲区,从中找出一个能容纳该作业的空闲区。如果找到空闲区正好等于该作业的长度,则把该分区全部分配给作业。可变分区方式的内存分配流程图如下:
可变分配方式的内存回收:在可变分区方式下回收内存空间时,应该检查是否有与归还区相邻的空闲区,若有,则应该合并成一个空闲区。在实现回收时,首先将作业归还的区域在已分配表中找到,将该栏目的状态变为“空”,然后,检查该空闲区表中标志为“未分配”的栏目,查找是否有相邻空闲区;最后,合并空闲区,修改空闲区表。
实验结果
图一:功能选择菜单
图二:输入进程,进程名分别为a、b,长度分别为32,48
图三:输出空闲分区表
图四:输出内存分配情况
图五:回收内存操作
程序使用说明
在VC++ 6.0中使用该程序,单击运行,会弹出运行菜单,如实验结果中图一所示,选择相应栏目进行可变分区内存分配与回收操作。
实验体会
通过本次实验,我对可变分区内存的分配与回收有了更加深刻的理解,我利用C++编程实现了模拟的可变分区内存分配与回收,这样内存的分配在我脑海中有了更加清晰更加具体的实例加以参考。在本次实验中我采用“最有适应”算法进行内存分配,这使我对基本概念有了更好的理解,也掌握的更加巩固。以后要多对理论知识加以实现,在实践中不断巩固自己所学到的知识。