分区内存管理实验报告.doc
- 文档编号:234713
- 上传时间:2022-10-07
- 格式:DOC
- 页数:16
- 大小:127KB
分区内存管理实验报告.doc
《分区内存管理实验报告.doc》由会员分享,可在线阅读,更多相关《分区内存管理实验报告.doc(16页珍藏版)》请在冰豆网上搜索。
洛阳理工学院实验报告
系别
计算机与信息工程系
班级
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++; } else break; } returni; } //分配出去就会产生一个碎片将元素后移动一位 void ArrayToRightOne(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分区 内存 管理 实验 报告