分区内存管理实验报告Word文件下载.doc
《分区内存管理实验报告Word文件下载.doc》由会员分享,可在线阅读,更多相关《分区内存管理实验报告Word文件下载.doc(16页珍藏版)》请在冰点文库上搜索。
#definemaxPart10
#defineTRUE1
typedefstruct
{
charname;
//进程名
intaddress,len,valid;
//进程所占分区起止和长度,
//该PCB有效标示1有效,0无效。
}PCB;
typedefstruct
PCBPCBelem[maxPCB];
inttotal;
}PCBseql;
//分区类型及分区说明表(顺序表)的描述
intaddress,len,valid;
}Part;
PartPartelem[maxPart];
intsum;
//该时刻的分区数
}Partseql;
voidinitPcb(PCBseql*vpcbl,intiosm);
//初始化进程表vpcbl;
voidinitpart();
//初始化分区表vpartl;
voidrequest(charname,intlen);
//进程name请求len大小的内存
voidrelease(charname);
//回收进程name所占的空间
voidgetprint();
//输出内存空闲分区
主程序:
内存管理.cpp
link.h"
#include<
Windows.h>
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));
请输入进程所需内存"
);
%d"
tel);
pcbelem->
len=tel;
address=adr+tel;
valid=1;
pcbelem++;
printf("
是否要继续输入进程?
(Y/y)是/(N/n)否"
fflush(stdin);
c=getchar();
if(c=='
N'
||c=='
n'
)
{
break;
}
}
}
voidinitpart()
charc,name;
intlen;
printf("
请输入你的操作R.请求内存;
P.输出空闲分区;
S.强制进程结束;
(N/n).退出\n"
fflush(stdin);
c=getchar();
while(c!
='
||c!
{
if(c=='
R'
r'
{
//做输入的时候要清空缓冲区
printf("
请输入请求内存进程的名称,长度"
scanf("
%c,%d"
name,&
len);
request(name,len);
//进程请求内存
elseif(c=='
P'
p'
printf("
\t*****VIEWbegin*****\n"
getprint();
\t*****VIEWend*****\n"
S'
s'
请输入想要回收的进程名称\n"
name);
release(name);
S.强制进程结束\n"
voidinit4IOS(inttem)
Part*newPart=&
partl->
Partelem[0];
tem=tem>
0?
(tem<
length?
tem:
length):
0;
newPart->
address=0;
newPart->
len=tem;
valid=1;
partl->
sum++;
printf("
------->
已为操作系统分配了%dkb内存\n"
tem);
newPart=&
Partelem[1];
address=tem;
length=tem=length-tem;
tem=tem<
(0):
tem;
valid=0;
为操作系统分配后剩余的内存%dkb内存\n"
intgetTagByPcb(charname)
//有提提
/* inti=0;
chartem;
PCB*newPcb=0;
newPcb=pcbl->
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)
else break;
returni;
//分配出去就会产生一个碎片将元素后移动一位
void ArrayToRightOne(inti)
//Parttem;
intleng=partl->
sum;
while(leng>
i)
partl->
Partelem[leng].address=partl->
Partelem[leng-1].address;
Partelem[leng].len=partl->
Partelem[leng-1].len;
Partelem[leng].valid=partl->
Partelem[leng-1].valid;
leng--;
intfindBylen(intlen)
while(i<
sum)
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("
if(len>
PCBelem[temByPcb].len){
printf("
您请求的容量大于您进程最大要求量%d,"
pcbl->
PCBelem[temByPcb].len);
return;
}
}
if(tem=='
{
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;
Partelem[i].valid=1;
//新的碎片
Partelem[i+1].address=partl->
Partelem[i].address+partl->
Partelem[i].len;
Partelem[i+1].len=temBylen;
Partelem[i+1].valid=0;
//更新pcb的状态和容量
pcbl->
PCBelem[temByPcb].address=partl->
Partelem[i].address;
PCBelem[temByPcb].len=pcbl->
PCBelem[temByPcb].len-len;
//更新pcb的len
pcbl->
PCBelem[temByPcb].valid=1;
voidrelease(charname)
intadress,len;
if((getTagByPcb(name))<
0)
{
printf("
找不到进程名%c\n"
return;
}
elseif(pcbl->
PCBelem[getTagByPcb(name)].valid=0)
%c还没有运行,请先运行\n"
现在正回收%c的内存\n"
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;
voidgetprint()
inti;
------空闲分区begin---------\n"
for(i=0;
if(partl->
{
printf("
第%d块空闲内存起止为%d,容量为%d\n"
i,partl->
Partelem[i].address,partl->
Partelem[i].len);
}
------空闲分区end---------\n"
voidmain()
intk,OSsize=40;
constintM=25;
sum=0;
total=0;
system("
colorfc"
//初始化操作系统
printf("
\n"
程序加载中●〓>
>
"
for(k=1;
k<
M;
k++)
▊"
Sleep(200);
system("
cls"
\t\t\t******************************\n"
\t\t\t*欢迎使用分区内存管理模拟系统*\n"
\t\t\t*请你按照提示操作*\n"
Sleep(3000);
init4IOS(OSsize);
//为进程分配内存
initPcb(pcbl,OSsize);
initpart();
scanf("
tem);
原始数据纪录:
输入数据:
a,80,b60,c,100,P;
R,a,60,R,b,50,R,c,100S,bP,S,a,P
输出数据:
实验总结:
在这次实验过程中,有很多知识都不是很清楚,很多都要查书才能弄清楚,在编程过程中也出现了很多错误,最终在同学的帮助下完成了这次实验内容,从中了解到了自己的编程能力急需要提高,关键还是在于数据结构学的不是很好,下面应该着重把数据结构再好好复习一下。
16/16