当前位置:文档之家› 内存管理实验报告

内存管理实验报告

内存管理实验报告
内存管理实验报告

内存管理实验报告

信息科学与技术学院实验报告

课程名称: 实验项目: 实验地点:指导教师: 日期:

实验类型:(验证性实验综合性实验设计性实验)

专业: 计算机外包班级: 14外三姓名: 周鹏飞学号: 1414104033 一、实验目的及要求

通过此次实验,加深对内存管理的认识,进一步掌握内存的分配,回收算法的思想。

二、实验仪器、设备或软件

Windows操作系统PC一台;VC++6.0

三、实验内容及原理

原理:设计程序模拟内存的动态分区内存管理方法。内存空闲区使用空闲分区表进行管理,采用最先适应算法从空闲分区表中寻找空闲区进行分配,内存回收时不考虑与相邻空闲分区的合并。

假定系统的内存共640k,初始状态为操作系统本身占用40k.t1时刻,为作业A,B,C分配80k,60k,100k的内存空间;t2时刻作业B完成;t3时刻为作业D分配50k的内存空间;t4时刻作业C,A完成;t5时刻作业D完成。要求编程序分别输出t1,t2,t3,t4,t5时刻内存的空闲区的状态。

实验内容:

#include

#include

#define maxPCB 6 //最大进程数

#define maxPart 6 //最大空闲分区数

#define size 10 //不再切割剩余分区的大小

typedef struct PCB_type

{

char name;//进程名

int address;//进程所占分区首地址

int len;//进程所占分区的长度

int valid;//PCB标识符(有效,无效)

}PCB;

Typedef struct seqlist //进程信息队列

{

PCB PCBelem[maxPCB];// maxPCB为为系统中允许的最多进程数

int total; //系统中实际的进程数

}PCBseql;//分区类型的描述

typedef struct Partition

{

int address;//分区起址

int len;//分区的长度

int valid;//有标识符(有效,无效)

}Part;//内存空闲分区表(顺序表)描述

typedef struct Partlist //空白分区链

Part Partelem[maxPart];//maxPart为系统中可能的最多空闲分区数 int sum;//系统中世纪的分区数

}Partseql;//全局变量

PCBseql *pcbl;//进程队列指针

Partseql *part1;//空闲队列指针

#intclude “MainManager.h”

void initpcb() //初始化进程表vpcb1

{

int i;

pcb1->PCBelem[0].address=0;

pcb1->PCBelem[0].len=0;

pcb1->PCBelem[0].name=’s’;

pcb1->PCBelem[0].valid=1;

pcb1->total=0;

for(i=1;i

{

pcb1->PCBelem[0].name=’\0’;

pcb1->PCBelem[0].address=0;

pcb1->PCBelem[0].len=0;

pcb1->PCBelem[0]. valid =0;

}

}

void initpart() //初始化空闲分区表vpart1

{

int I;

pcb1->PCBelem[0].address=40;

pcb1->PCBelem[0].len=600;

pcb1->PCBelem[0]. valid =1;

for(i=1;i

{

pcb1->PCBelem[0].address=0;

pcb1->PCBelem[0].len=0;

pcb1->PCBelem[0]. valid =0;

}

part1->sum=1;

}

void request(char name,int len) //进程name请求len大小的内存{

int i,j,k;

int address;

for(i=0;isum;i++)

{

if(partl->Partelem[i].len>=len)

{

address=partl->Partelem[i].address;

if(partl->Partelem[i].len-len>=size)

{

partl->Partelem[i].address+=len;

partl->Partelem[i].len-=len;

partl->Partelem[i].valid=1;

}

else

{

for(j=i;j

{

partl->Partelem[j]=partl->Partelem[j+1];

partl->Partelem[j].valid=0;

partl->Partelem[j].address=0;

partl->Partelem[j].len=0;

partl->sum--;

}

for (k=0;k

{

if (pcbl->PCBelem[k].valid==0)

{

pcbl->PCBelem[k].address=address;

pcbl->PCBelem[k].len=len;

pcbl->PCBelem[k].name=name;

pcbl->PCBelem[k].valid=1;

pcbl->total++;

break;

}

}

break;

}

else printf(“内存紧张,暂时不予分配,请等候!”);

void release(char name) //回收name进程所占的内存空间

int i;

for(i=0;i

{

if(pcb1->PCBelem[i].name==ame)

{

if (pcb1->PCBelem[i].valid==0)

printf(“%c进程非运行进程,无法结束!”,name);

else

{

pcb->PCBelem[i].valid=0;

pcb->total--;

part->Partelem[part1->sum].address=pcb1->PCBelem[i].address;

part1->Partelem[part1->sum].valid=1;

part1->sum++;

}

}

}

void print()//输出内存空闲分区

{

int i;

printf(“当前的进程有:\n”);

printf(“name address length\n”);

for(i=1;i

{

if(pcb1->PCBelem[i].name,pcb1->PCBelem[i].address,pcb->PCBelem[i]. len);

}

printf(“当前的空闲分区有:\n”);

printf(“address length\n”);

for(i=0;i

{

if(part1->Partelem[i].valid==1)

printf(“%d %d\n”,part1->Partelem[i].address,part1->Partelem[i].len );

}

}

void main()

{

char ch;

char pcbname;

int pcblen;

PCBseql pcb;

Partseql pcb;

Pcb1=%part;

initpcb();

initpart();

printf(“\t*********************MENU***********************\n”);

printf(“\t***************** Enter:r 请求分配内存*******************\n”)

printf(“\t***************** Enter:s 进程结束*******************\n”)

printf(“\t***************** Enter:p 打印分配情况*******************\n”)

printf(“\t***************** Enter:e 退出*******************\n”)

ch=get char();

fflush(stdin);

while(ch!=’e’)

{

switch(ch)

{

case’r’:

printf(“请输入请求进程的name,len:”);

scanf(“%c %d”,&pcbname,&pcblen);

fflush(stdin);

request(pcbname,ocblen);

break;

case’s’:

printf(“请输入要结束进程的name:”);

scanf(“%c”,&pcbname);

fflush(stdin);

request(pcbname);

break;

case’p’:

printf();

break;

case’e’:

exit(0);

}

ch=getchar();

fflush(stdin);

}

}

相关主题
文本预览
相关文档 最新文档