分区内存管理系统实验报告材料.docx
- 文档编号:1710582
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:14
- 大小:74.73KB
分区内存管理系统实验报告材料.docx
《分区内存管理系统实验报告材料.docx》由会员分享,可在线阅读,更多相关《分区内存管理系统实验报告材料.docx(14页珍藏版)》请在冰点文库上搜索。
分区内存管理系统实验报告材料
洛阳理工学院实验报告
系别
计算机与信息工程系
班级
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时刻内存的空闲分区。
实验内容:
源代码:
包含头文件link.h,Windows.h和主程序内存管理.cpp
头文件link.h
#include"stdio.h"
#include"malloc.h"
//进程Pcb类型及系统PCB表(顺序表)的描述
#definemaxPCB15
#definemaxPart10
#defineTRUE1
typedefstruct
{
charname;//进程名
intaddress,len,valid;//进程所占分区起止和长度,
//该PCB有效标示1有效,0无效。
}PCB;
typedefstruct
{
PCBPCBelem[maxPCB];
inttotal;
}PCBseql;
//分区类型及分区说明表(顺序表)的描述
typedefstruct
{
intaddress,len,valid;
}Part;
typedefstruct
{
PartPartelem[maxPart];
intsum;//该时刻的分区数
}Partseql;
voidinitPcb(PCBseql*vpcbl,intiosm);//初始化进程表vpcbl;
voidinitpart();//初始化分区表vpartl;
voidrequest(charname,intlen);//进程name请求len大小的内存
voidrelease(charname);//回收进程name所占的空间
voidgetprint();//输出内存空闲分区
主程序:
内存管理.cpp
#include"link.h"
#include
intlength=640;//系统有640的空闲
PCBseql*pcbl=(PCBseql*)malloc(sizeof(PCBseql));;
Partseql*partl=(Partseql*)malloc(sizeof(Partseql));
voidinitPcb(PCBseql*vpcbl,intadr)
{
inti=1;
PCB*pcbelem;
inttel;
charc;
pcbelem=vpcbl->PCBelem;
while(TRUE)
{
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;
}
}
}
voidinitpart()
{
charc,name;
intlen;
printf("请输入你的操作R.请求内存;P.输出空闲分区;S.强制进程结束;(N/n).退出\n");
fflush(stdin);
c=getchar();
fflush(stdin);
while(c!
='N'||c!
='n')
{
if(c=='R'||c=='r')
{
fflush(stdin);//做输入的时候要清空缓冲区
printf("请输入请求内存进程的名称,长度");
scanf("%c,%d",&name,&len);
request(name,len);//进程请求内存
}
elseif(c=='P'||c=='p')
{
printf("\t*****VIEWbegin*****\n");
getprint();
printf("\t*****VIEWend*****\n");
}
elseif(c=='S'||c=='s')
{
printf("请输入想要回收的进程名称\n");
scanf("%c",&name);
release(name);
}
printf("请输入你的操作R.请求内存;P.输出空闲分区;S.强制进程结束\n");
fflush(stdin);
c=getchar();
fflush(stdin);
}
}
voidinit4IOS(inttem)
{
Part*newPart=&partl->Partelem[0];
tem=tem>0?
(tem tem: length): 0; newPart->address=0; newPart->len=tem; newPart->valid=1; partl->sum++; printf("------->已为操作系统分配了%dkb内存\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("------->为操作系统分配后剩余的内存%dkb内存\n",tem); } intgetTagByPcb(charname) { //有提提 /*inti=0; chartem; PCB*newPcb=0; newPcb=pcbl->PCBelem; while(TRUE) { tem=newPcb->name; if(name! =tem) { newPcb++; i++; } elsebreak; } returni; */ inti=0; for(;i<(pcbl->total);i++) { if(name! =pcbl->PCBelem[i].name) { i++; } elsebreak; } returni; } //分配出去就会产生一个碎片将元素后移动一位 voidArrayToRightOne(inti) { //Parttem; intleng=partl->sum; while(leng>i) { 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++; } intfindBylen(intlen) { inti=0; while(i { if(partl->Partelem[i].valid==0) { if(len<=partl->Partelem[i].len) { returni; } } i++; } return0; } voidrequest(charname,intlen) { //Part*suipian; chartem; inti;//是name进程的下标 inttemBylen; inttemByPcb; temByPcb=getTagByPcb(name); while(temByPcb>pcbl->total){ printf("找不到进程名%c,重新输入Y/N",name); fflush(stdin); tem=getchar(); if(tem=='Y'){ fflush(stdin);//做输入的时候要清空缓冲区 printf("请输入请求内存进程的名称,长度"); scanf("%c,%d",&name,&len); if(len>pcbl->PCBelem[temByPcb].len){ printf("您请求的容量大于您进程最大要求量%d,",pcbl->PCBelem[temByPcb].len); return; } } if(tem=='N') { return; } } //找到一块len内存 if(findBylen(len)==0) { //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; } voidrelease(charname) { inti=0; intadress,len; if((getTagByPcb(name))<0) { printf("找不到进程名%c\n",name); return; } elseif(pcbl->PCBelem[getTagByPcb(name)].valid=0) { printf("%c还没有运行,请先运行\n",name); } printf("现在正回收%c的内存\n",name); adress=pcbl->PCBelem[getTagByPcb(name)].address; len=pcbl->PCBelem[getTagByPcb(name)].len; while(i { if(adress==partl->Partelem[i].address) { partl->Partelem[i].valid=0; } i++; } } voidgetprint() { inti; printf("------空闲分区begin---------\n"); for(i=0;i { if(partl->Partelem[i].valid==0) { printf("第%d块空闲内存起止为%d,容量为%d\n",i,partl->Partelem[i].address,partl->Partelem[i].len); } } printf("------空闲分区end---------\n"); } voidmain() { chartem; intk,OSsize=40; constintM=25; partl->sum=0; pcbl->total=0; system("colorfc"); //初始化操作系统 printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("程序加载中●〓>>>"); for(k=1;k { printf("▊"); Sleep(200); } system("cls"); printf("\t\t\t******************************\n"); printf("\t\t\t*欢迎使用分区内存管理模拟系统*\n"); printf("\t\t\t******************************\n"); printf("\t\t\t*请你按照提示操作*\n"); printf("\t\t\t******************************\n"); Sleep(3000); system("cls"); init4IOS(OSsize); //为进程分配内存 initPcb(pcbl,OSsize); initpart(); scanf("%c",&tem); } 原始数据纪录: 输入数据: a,80,b60,c,100,P;R,a,60,R,b,50,R,c,100S,bP,S,a,P 输出数据: 实验总结: 在这次实验过程中,有很多知识都不是很清楚,很多都要查书才能弄清楚,在编程过程中也出现了很多错误,最终在同学的帮助下完成了这次实验内容,从中了解到了自己的编程能力急需要提高,关键还是在于数据结构学的不是很好,下面应该着重把数据结构再好好复习一下。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分区 内存 管理 系统 实验 报告 材料