计算机操作系统课程设计报告(4)

2019-03-16 11:43

程序运行结果及分析

16

实验三:模拟动态分区首次适应分配和回收算法

实验目的:

通过本实验,可加深理解动态分区分配、回收程序的功能和具体实现,特别是对回收分区的合并的理解。

实验内容:

1、 设计动态分区首次适应分配、回收算法。 2、 设计“未分配区说明表”,格式为:

序号 1 始址 60k 长度 200 状态 1 0 3、设计“已分配区说明表”,格式为:

作业名 始址 长度 状态 0 0 4、 设计显示程序,将“未分配区说明表”和“已分配区说明表”的内容,显示在屏幕上。 初始分配从一个空闲区分配起,回收时要合并空区。

实验步骤:

1、 系统要求分配一个分区时,应输入:作业名、作业长度。

2、 回收一个分区时,应输入:回收的作业名。回收的分区请注意是否需要进行合并。

实验代码:

#include #include

int MAX_SEGMENT=10;//最大碎片值 struct Partition //分区表目

17

{ int Par_Size; //分区大小 int Par_No; //分区序号或者名字 int Addr; //分区地址

int IsUse; //分区使用情况,0表示空闲,1表示使用

Partition *pri; //前向指针

Partition *next;

//后向指针

};

Partition * Int()//函数,返回Partition类型指针 {

//初始化空闲分区表

Partition *list,*H,*H1;

list=(struct Partition *)malloc(sizeof(struct Partition));//malloc申请动态分配空间 list->next=NULL; H=list;

if(!list) { printf(\错误,内存初始化分配失败!程序结束\ exit(1);

}

H1=(struct Partition *)malloc(sizeof(struct Partition)); printf(\请预先输入分区总大小(以KB为单位):\ scanf(\

H1->Addr=0; H1->Par_No=0; H1->IsUse=0; H1->pri=H;

H1->next=NULL; H->next=H1;////list--->H1 return list;

}

Partition * InitFP() { //初始化已分配分区表 Partition *FP,*F,*H; int i;

FP=(struct Partition *)malloc(sizeof(struct Partition)); FP->next=NULL; H=FP;

for(i=0;i<10;i++) //已分配区先暂定分配十个表目

{ F=(struct Partition *)malloc(sizeof(struct Partition));

if(!F) { printf(\错误,内存分配失败!程序结束\

exit(1);

18

}

}

}

F->Par_Size=0; F->Addr=0; F->Par_No=0; F->IsUse=0; F->next=NULL; H->next=F; F->pri=H; H=H->next;

return FP;

Partition * New_Process( Partition *list, Partition *FP) { //为新的进程分配资源

Partition *H,*P,*H1; int Size,Name,L;

H=list;

H1=FP->next; H=H->next;

printf(\请输入新作业的名称和大小(整数)\\n\printf(\作业名称:\scanf(\

printf(\作业大小(整数):\scanf(\while(H) {

if(!H) {

//表目已查完,无法分配

printf(\已无空闲分区,本次无法分配!\return list;

} else{ if(H->IsUse==0) //if(H->Par_Size>=Size)

if(H->Par_Size>=Size) {

//空表目

//大小满足,空闲分区大小》要分配的大小 //大小满足,

bool temp=false; if((H->Par_Size-Size)<=MAX_SEGMENT){//空闲分区大小-要分配的大小<碎片值,会产生碎片,将整块内存大小分配出去,

Size=H->Par_Size;//分配的大小为整块内存 temp=true;//会产生碎片

}

//其他情况就分配大小为请求大小,不会产生碎片, L=H->Addr;//保存空闲分地址

19

去!\

if(temp){ printf(\该次内存分配会产生碎片,将整块内存大小%d分配出}else{ printf(\该次内存分配不会产生碎片\

} break;

} }

H=H->next;

//否则,继续往下查找

} if(H) {

if(H->Par_Size>Size) {

//大小满足,空闲分区大小》要分配的大小

//分配新的表目,

P=(struct Partition *)malloc(sizeof(struct Partition)); P->IsUse=1;

P->Addr=L;//指向空闲分区地址 P->next=H;

//修改指针

H->pri->next=P;

P->pri=H->pri; H->pri=P;

P->Par_Size=Size;//分配大小为要请求分配的大小 P->Par_No=Name;//名称

处理一条数据,分配一次内存

H->Par_Size-=Size; //修改空闲分区,H所指区块大小减Size H->Addr+=Size;//H所指区块地址加Size

}else { H->IsUse=1; }

while(H1) {

if(H1->IsUse==0) { }

H1=H1->next;

//大小相等的,把当前表项设置空表目

H1->Par_No=Name;

H1->Par_Size=Size;

H1->Addr=L;//保存已分配地址

H1->IsUse=1;//在已分配表中设置为已分配 break;

} }else

20


计算机操作系统课程设计报告(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:关于5S管理工作推进的通知

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: