分区内存管理实验报告Word格式.docx
- 文档编号:20535834
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:14
- 大小:74.45KB
分区内存管理实验报告Word格式.docx
《分区内存管理实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《分区内存管理实验报告Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
#include"
stdio.h"
malloc.h"
//进程Pcb类型与系统PCB表(顺序表)的描述
#definemaxPCB15
#definemaxPart10
#defineTRUE1
typedefstruct
{
charname;
//进程名
intaddress,len,valid;
//进程所占分区起止和长度,
//该PCB有效标示1有效,0无效。
}PCB;
typedefstruct
PCBPCBelem[maxPCB];
inttotal;
}PCBseql;
//分区类型与分区说明表(顺序表)的描述
}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;
请输入你的操作R.请求存;
P.输出空闲分区;
S.强制进程完毕;
(N/n).退出\n"
c=getchar();
while(c!
='
||c!
if(c=='
R'
r'
{
//做输入的时候要清空缓冲区
请输入请求存进程的名称,长度"
scanf("
%c,%d"
name,&
len);
request(name,len);
//进程请求存
elseif(c=='
P'
p'
\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;
len=tem;
valid=1;
partl->
sum++;
------->
已为操作系统分配了%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)
returni;
//分配出去就会产生一个碎片将元素后移动一位
voidArrayToRightOne(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){
找不到进程名%c,重新输入Y/N"
name);
tem=getchar();
if(tem=='
Y'
){
fflush(stdin);
if(len>
PCBelem[temByPcb].len){
您请求的容量大于您进程最大要求量%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;
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
PCBelem[temByPcb].valid=1;
voidrelease(charname)
intadress,len;
if((getTagByPcb(name))<
0)
找不到进程名%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()
------空闲分区begin---------\n"
for(i=0;
if(partl->
第%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"
//初始化操作系统
\n"
程序加载中●〓>
>
"
for(k=1;
k<
M;
k++)
▊"
Sleep(200);
cls"
\t\t\t******************************\n"
\t\t\t*欢迎使用分区存管理模拟系统*\n"
\t\t\t*请你按照提示操作*\n"
Sleep(3000);
init4IOS(OSsize);
//为进程分配存
initPcb(pcbl,OSsize);
initpart();
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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分区 内存 管理 实验 报告