分区内存管理实验报告

  • 格式:doc
  • 大小:139.00 KB
  • 文档页数:18

分区内存管理实验报告 2 / 18 洛阳理工学院实验报告 系别 计算机与信息工程系 班级 B100503 学号 B10050309 姓名 赵贺龙

课程名称 计算机操作系统 实验日期 2012-11-1 实验名称 分区内存管理 成绩 实验目的: 通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。 实验条件: 装有vc6.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时刻内存的空闲分区。 3 / 18

实验内容: 源代码:包含 头文件link.h,Windows.h和主程序 内存管理.cpp 头文件link.h #include "stdio.h" #include "malloc.h" //进程Pcb类型及系统PCB表(顺序表)的描述

#define maxPCB 15 #define maxPart 10 #define TRUE 1

typedef struct { char name; //进程名 int address,len,valid;//进程所占分区起止和长度, //该PCB有效标示 1有效,0无效。

}PCB; typedef struct { PCB PCBelem[maxPCB]; int total; }PCBseql;

//分区类型及分区说明表(顺序表)的描述 typedef struct { int address,len,valid;

}Part; 4 / 18

typedef struct { Part Partelem[maxPart]; int sum; //该时刻的分区数 }Partseql;

void initPcb(PCBseql* vpcbl,int iosm); //初始化进程表vpcbl; void initpart(); //初始化分区表vpartl; void request(char name,int len); //进程name请求len大小的内存 void release(char name); //回收进程name所占的空间 void getprint(); //输出内存空闲分区

主程序:内存管理.cpp #include "link.h" #include int length = 640 ;//系统有640 的空闲 PCBseql *pcbl = (PCBseql*)malloc(sizeof(PCBseql)); ; Partseql *partl = (Partseql*)malloc(sizeof(Partseql)); void initPcb(PCBseql* vpcbl,int adr) { int i=1; PCB *pcbelem; int tel; char c; pcbelem=vpcbl->PCBelem; while(TRUE) 5 / 18

{ printf("请输入第%d进程名称",i++); vpcbl->total++; scanf("%c",&(pcbelem->name)); printf("请输入进程所需内存"); scanf("%d",&tel); pcbelem->len=tel; pcbelem->address=adr+tel; pcbelem->valid=1; pcbelem++; printf("是否要继续输入进程?(Y/y) 是/(N/n) 否"); fflush(stdin); c = getchar(); fflush(stdin); if(c=='N'||c=='n') { break; } }

} void initpart() { char c,name; int len;

printf("请输入你的操作 R.请求内存;P.输出空闲分区; S. 强制进程结束;(N/n).退出\n"); fflush(stdin); c= getchar(); fflush(stdin); 6 / 18

while(c!='N'||c!='n') {

if(c=='R'||c=='r') { fflush(stdin); //做输入的时候要清空缓冲区 printf("请输入请求内存进程的名称,长度"); scanf("%c,%d",&name,&len); request(name,len); //进程请求内存 } else if(c=='P'||c=='p') { printf("\t*****VIEW begin*****\n"); getprint(); printf("\t*****VIEW end *****\n"); } else if(c=='S'||c=='s') { printf("请输入想要回收的进程名称\n"); scanf("%c",&name); release(name); } printf("请输入你的操作 R.请求内存;P.输出空闲分区; S. 强制进程结束 \n"); fflush(stdin); c= getchar(); fflush(stdin); } } 7 / 18

void init4IOS(int tem) { Part *newPart = &partl->Partelem[0]; tem = tem>0?(tem newPart->address = 0; newPart->len = tem ; newPart->valid = 1; partl->sum++; printf("------->已为操作系统分配了%d kb内存\n",tem); newPart = &partl->Partelem[1]; newPart->address = tem ; length=tem = length -tem; tem = tem<0?(0):tem; newPart->len = tem ; newPart->valid = 0; partl->sum++; printf("------->为操作系统分配后剩余的内存%d kb内存\n",tem); }

int getTagByPcb(char name) { //有提提 /* int i=0; char tem ; PCB * newPcb =0; newPcb = pcbl->PCBelem; while (TRUE) { tem = newPcb->name; if(name!=tem) 8 / 18

{ newPcb++; i++; } else break; } return i; */

int i=0; for(;i<(pcbl->total);i++) { if(name != pcbl->PCBelem[i].name) { i++; } else break; } return i;

} //分配出去就会产生一个碎片 将元素后移动一位 void ArrayToRightOne(int i) { //Part tem ; int leng=partl->sum; while(leng>i) { 9 / 18

partl->Partelem[leng].address = partl->Partelem[leng-1].address; partl->Partelem[leng].len = partl->Partelem[leng-1].len; partl->Partelem[leng].valid = partl->Partelem[leng-1].valid; leng--; } partl->sum++; } int findBylen(int len) { int i=0; while(isum) { if (partl->Partelem[i].valid==0) { if (len<=partl->Partelem[i].len) { return i; } } i++; }

return 0; } void request(char name,int len) { //Part *suipian; char tem; int i; //是name进程的下标 int temBylen;