您好,欢迎来到尔游网。
搜索
您的当前位置:首页分区内存管理实验报告

分区内存管理实验报告

来源:尔游网
洛阳理工学院实验报告

系别 计算机与信息工程系 课程名称 实验名称 计算机操作系统 分区内存管理 实验日期 成绩 2012-11-1 班级 B100503 学号 B10050309 姓名 赵贺龙 实验目的: 通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。 实验条件: 装有vc6.0的微机一台。 实验原理: 设计程序模拟内存的动态分区内存管理方法。内存空闲区使用分区(说明)表进行管理,采用最先适应算法从分区表中寻找空闲区进行分配,内存回收时不考虑与相邻空闲区的合并。 假定系统的内存共0K,初始状态为操作系统本身占用40K。t1时刻,为作业A、B、C分配80K、60K、100K、的内存空间;t2时刻作业B完成;t3时刻为作业D分配50K的内存空间;t4时刻作业C、A完成;t5时刻作业D完成。要求编程序分别输出t1、t2、t3、t4、t5时刻内存的空闲分区。 1 / 16

实验内容: 源代码:包含 头文件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 { }Part; 2 / 16

int address,len,valid; 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 = 0 ;//系统有0 的空闲 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) 3 / 16

//输出内存空闲分区 { printf(\"请输入第%d进程名称\vpcbl->total++; scanf(\"%c\printf(\"请输入进程所需内存\"); scanf(\"%d\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); 4 / 16

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

void init4IOS(int tem) { Part *newPart = &partl->Partelem[0]; tem = tem>0?(temaddress = 0; } int getTagByPcb(char name) { //有提提 newPart->len = tem ; newPart->valid = 1; partl->sum++; printf(\"------->已为操作系统分配了%d kb内存\\n\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\/* int i=0; char tem ; PCB * newPcb =0; newPcb = pcbl->PCBelem; while (TRUE) { tem = newPcb->name; if(name!=tem) 6 / 16

} } { } else break; newPcb++; i++; return i; */ int i=0; for(;i<(pcbl->total);i++) { } return i; if(name != pcbl->PCBelem[i].name) { } else break; i++; //分配出去就会产生一个碎片 将元素后移动一位 void ArrayToRightOne(int i) { //Part tem ; int leng=partl->sum; while(leng>i) { 7 / 16

partl->Partelem[leng].address = partl->Partelem[leng-1].address; } int findBylen(int len) { int i=0; while(isum) { if (partl->Partelem[i].valid==0) { if (len<=partl->Partelem[i].len) { return i; } partl->sum++; partl->Partelem[leng].len = partl->Partelem[leng-1].len; partl->Partelem[leng].valid = partl->Partelem[leng-1].valid; leng--; } } } void request(char name,int len) { //Part *suipian; char tem; return 0; } i++; int i; //是name进程的下标 int temBylen; 8 / 16

int temByPcb ; temByPcb=getTagByPcb(name); while (temByPcb>pcbl->total){ printf(\"找不到进程名%c,重新输入Y/N\ fflush(stdin); tem = getchar(); if(tem=='Y'){ fflush(stdin); //做输入的时候要清空缓冲区 printf(\"请输入请求内存进程的名称,长度\"); scanf(\"%c,%d\ if (len>pcbl->PCBelem[temByPcb].len){ printf(\"您请求的容量大于您进程最大要求量%d,\ return; } } if (tem=='N') { return ; } } //找到一块len内存 if(findBylen(len)==0) { } { } //分配出去就会产生一个碎片 将元素后移动一位 9 / 16

//sort2part(); //收集内存 代码没写 if((i=findBylen(len))==0) printf(\"警告内存已满,无法分配\\n\");

ArrayToRightOne(i); //直接对partl->Partelem[i]赋值 并加入一个碎片 temBylen = partl->Partelem[i].len-len; partl->Partelem[i].len = len; partl->Partelem[i].valid = 1; //新的碎片 partl->Partelem[i+1].address = partl->Partelem[i].address+partl->Partelem[i].len; partl->Partelem[i+1].len =temBylen; partl->Partelem[i+1].valid=0; //更新pcb的状态和容量 pcbl->PCBelem[temByPcb].address = partl->Partelem[i].address; pcbl->PCBelem[temByPcb].len = pcbl->PCBelem[temByPcb].len-len ;//更新pcb的len pcbl->PCBelem[temByPcb].valid = 1 ; } void release(char name) { int i=0; int adress,len; if(( getTagByPcb(name))<0) { printf(\"找不到进程名%c\\n\ return ; } else if(pcbl->PCBelem[getTagByPcb(name)].valid=0) { printf(\"%c还没有运行,请先运行\\n\ } printf(\"现在正回收%c的内存\\n\ adress = pcbl->PCBelem[getTagByPcb(name)].address; 10 / 16

len = pcbl->PCBelem[getTagByPcb(name)].len; } void getprint() { int i; printf(\"------空闲分区begin---------\\n\"); while (isum) { } if (adress==partl->Partelem[i].address) { } i++; partl->Partelem[i].valid=0; for (i=0;isum;i++) { if (partl->Partelem[i].valid==0) { printf(\"第%d块空闲内存 起止为%d,容量为%d\\n\ } } } 11 / 16

printf(\"------空闲分区 end---------\\n\"); void main() { char tem; int k,OSsize = 40; const int M=25; partl->sum=0; pcbl->total=0; system(\"color fc\"); //初始化操作系统 printf(\"\\n\"); printf(\"\\n\"); printf(\"\\n\"); printf(\"\\n\"); printf(\"\\n\"); printf(\"\\n\"); printf(\"\\n\"); printf(\"\\n\"); printf(\"程序加载中●〓>>>\"); for(k=1;kinit4IOS(OSsize); //为进程分配内存 initPcb(pcbl,OSsize); initpart(); scanf(\"%c\ } 原始数据纪录: 输入数据:a,80,b60,c,100,P;R,a,60,R,b,50,R,c,100 S,b P,S,a,P 输出数据: 13 / 16

14 / 16

实验总结: 在这次实验过程中,有很多知识都不是很清楚,很多都要查书才能弄清楚,在编程过程中也出现了很多错误,最终在同学的帮助下完成了这次实验内容,从中了解到了自己的编程能力急需要提高,关键还是在于数据结构学的不是很好,下面应该着重把数据结构再好好复习一下。 15 / 16

16 / 16

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- axer.cn 版权所有 湘ICP备2023022495号-12

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务