分区内存管理实验报告.docx

上传人:b****5 文档编号:7425013 上传时间:2023-01-23 格式:DOCX 页数:14 大小:74.45KB
下载 相关 举报
分区内存管理实验报告.docx_第1页
第1页 / 共14页
分区内存管理实验报告.docx_第2页
第2页 / 共14页
分区内存管理实验报告.docx_第3页
第3页 / 共14页
分区内存管理实验报告.docx_第4页
第4页 / 共14页
分区内存管理实验报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

分区内存管理实验报告.docx

《分区内存管理实验报告.docx》由会员分享,可在线阅读,更多相关《分区内存管理实验报告.docx(14页珍藏版)》请在冰豆网上搜索。

分区内存管理实验报告.docx

分区内存管理实验报告

理工学院实验报告

系别

计算机与信息工程系

班级

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++;

}

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

输出数据:

 

 

 

实验总结:

在这次实验过程中,有很多知识都不是很清楚,很多都要查书才能弄清楚,在编程过程中也出现了很多错误,最终在同学的帮助下完成了这次实验容,从中了解到了自己的编程能力急需要提高,关键还是在于数据结构学的不是很好,下面应该着重把数据结构再好好复习一下。

 

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

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1