内存管理实验报告

时间:2024.4.25

内存管理实验报告

题目:编写一个程序来模拟内存的管理

一. 需求分析

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++编程实现了模拟的可变分区内存分配与回收,这样内存的分配在我脑海中有了更加清晰更加具体的实例加以参考。在本次实验中我采用“最有适应”算法进行内存分配,这使我对基本概念有了更好的理解,也掌握的更加巩固。以后要多对理论知识加以实现,在实践中不断巩固自己所学到的知识。

更多相关推荐:
操作系统“内存管理”实验报告

洛阳理工学院实验报告1828384858687888

操作系统 内存管理实验报告

同组同学学号同组同学姓名注实验内容及步骤项目的内容如果较多可以加附页

内存管理实验报告

操作系统实验报告院别:计算机学院班级:学号:序号:姓名:XX实验:内存管理实验一、实验目的1、通过本次试验体会操作系统中内存的分配模式;2、掌握内存分配的方法(FF,BF,WF);3、学会进程的建立,当一个进程…

操作系统内存管理实验报告

实验报告12345678910111213

分区内存管理实验报告

洛阳理工学院实验报告1162163164165166167168169161016111612161316141615161616

20xx211320周俊霞-内存管理实验报告

操作系统实验内存管理20xx211320周俊霞操作系统实验内存管理实验报告周俊霞20xx21132020xx211307班实习2内存管理实验一目的在本次实验中需要从不同的侧面了解Windows20xxXP的虚拟...

OS实验报告之内存管理

OS实验报告之内存管理软工0801罗小兰U20xx18069实验目的理解操作系统虚拟存储管理的原理理解程序执行局部性的概念实验内容设计一个虚拟存储区和内存工作区并使用下列算法计算访问命中率1进先出的算法FIFO...

linux内存管理实验报告

操作系统实验报告院别XXXXXX班级XXXXXX学号XXXXXX姓名稻草人实验题目内存管理实验一实验目的1通过本次试验体会操作系统中内存的分配模式2掌握内存分配的方法FFBFWF3学会进程的建立当一个进程被终止...

实验三 内存管理

操作系统实验报告实验报告三内存管理器专业班级jk0701学生姓名舒月学号07281011实验题目内存管理器实验一实验目的设计和实现关于内存管理的内存布局初始化及内存申请分配内存回收等基本功能操作函数尝试对用25...

操作系统实验报告Lab2物理内存管理(含challenge)

Lab2实验报告一练习0填写已有实验利用Understand中的Compare完成此练习二练习1实现firstfit连续物理内存分配算法大体思路物理内存页管理器顺着双向链表进行搜索空闲内存区域直到找到一个足够大...

内存管理 操作系统实验 代码

实验报告撰写要求实验报告要求具有以下内容一实验目的二实验内容三实验要求四算法流程图五给出测试数据及运行结果六实验体会或对改进实验的建议操作系统实验课第三次实验及代码实验3内存管理2学时一实验目的通过实验加强对内...

《操作系统》实验报告2 可变分区存储管理方式的内存分配回收

《操作系统》实验报告2 可变分区存储管理方式的内存分配回收,内容附图。

内存管理实验报告(25篇)