内存管理实验报告

更新时间:2024-06-03 00:56:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

课程名称: 实验项目: 实验地点: 指导教师: 日期: 实验类型: (验证性实验 综合性实验 设计性实验) 专业: 计算机外包 班级: 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); } }

四、实验步骤(或过程)

五、实验结论

1、实验结果

2、分析讨论

六、指导教师评语及成绩

本文来源:https://www.bwwdw.com/article/sle6.html

Top