分区内存管理实验报告Word文件下载.doc

上传人:wj 文档编号:1457776 上传时间:2023-04-30 格式:DOC 页数:16 大小:127KB
下载 相关 举报
分区内存管理实验报告Word文件下载.doc_第1页
第1页 / 共16页
分区内存管理实验报告Word文件下载.doc_第2页
第2页 / 共16页
分区内存管理实验报告Word文件下载.doc_第3页
第3页 / 共16页
分区内存管理实验报告Word文件下载.doc_第4页
第4页 / 共16页
分区内存管理实验报告Word文件下载.doc_第5页
第5页 / 共16页
分区内存管理实验报告Word文件下载.doc_第6页
第6页 / 共16页
分区内存管理实验报告Word文件下载.doc_第7页
第7页 / 共16页
分区内存管理实验报告Word文件下载.doc_第8页
第8页 / 共16页
分区内存管理实验报告Word文件下载.doc_第9页
第9页 / 共16页
分区内存管理实验报告Word文件下载.doc_第10页
第10页 / 共16页
分区内存管理实验报告Word文件下载.doc_第11页
第11页 / 共16页
分区内存管理实验报告Word文件下载.doc_第12页
第12页 / 共16页
分区内存管理实验报告Word文件下载.doc_第13页
第13页 / 共16页
分区内存管理实验报告Word文件下载.doc_第14页
第14页 / 共16页
分区内存管理实验报告Word文件下载.doc_第15页
第15页 / 共16页
分区内存管理实验报告Word文件下载.doc_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

分区内存管理实验报告Word文件下载.doc

《分区内存管理实验报告Word文件下载.doc》由会员分享,可在线阅读,更多相关《分区内存管理实验报告Word文件下载.doc(16页珍藏版)》请在冰点文库上搜索。

分区内存管理实验报告Word文件下载.doc

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2