分区内存管理实验报告.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?
(temtem:
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(isum)
{
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(isum)
{
if(adress==partl->Partelem[i].address)
{
partl->Partelem[i].valid=0;
}
i++;
}
}
voidgetprint()
{
inti;
printf("------空闲分区begin---------\n");
for(i=0;isum;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
输出数据:
实验总结:
在这次实验过程中,有很多知识都不是很清楚,很多都要查书才能弄清楚,在编程过程中也出现了很多错误,最终在同学的帮助下完成了这次实验容,从中了解到了自己的编程能力急需要提高,关键还是在于数据结构学的不是很好,下面应该着重把数据结构再好好复习一下。