最佳适应分配算法C语言,用C语言模拟内存分区分配管理的最佳适应算法-(8页)-原创力文档...

编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时要与相邻空闲区的合并。

初始状态信息:假定系统的内存共640K,初始状态为操作系统本身占用64K。

将要申请内存的作业信息(存储在document/job.txt文件中,当前时间是0。

输入:用户打开document/job.txt文件,输入作业信息。

处理:模拟时间逐歩增加,每次加1.采用先来先服务算法调度作业,模拟作业运行,用最坏适应算法进行内存的分配。且进行内存的回收,注意与空闲分区的合并。直到所以作业运行完成程序结束。

输出:把当前时间为0,为1,为2......的内存分配状况和作业信息写入文件

document/information.txt。

设计思路

4.1 结点定义

//空闲区结点描述

typedef struct FreeNode

{

int length; // 分区长度

int address; // 分区起始地址

}FreeNode,*PFreeNode;

//空闲区自由链表的描述

typedef struct FreeLink

{

FreeNode freeNode;

struct FreeLink * next;

}FreeLink,*PFreeLink;

//内存占用区链表描述

typedef struct BusyNode

{

char name[20];//标明此块内存被哪个进程所占用

int length; // 分区长度

int address; // 分区起始地址

}BusyNode,*PBusyNode;

//内存占用区忙碌链表的描述

typedef struct BusyLink

{

BusyNode busyNode;

struct BusyLink * next;

}BusyLink,*PBusyLink;

//作业控制块的结点描述

typedef struct JCBNode

{

char name[20]; //作业名称

int length; //作业申请的内存大小

int start_time; //作业申请内存的时间,即到达后备作业队列的时间

int use_time; //作业占用内存的时间,随着该作业的运行逐渐减小,

int state; //作业内存分配描述:

//0表示未申请内存,此时作业在后备队列

//1表示申请内存成功,作业进入就绪队列

//2表示申请内存失败,此时作业插入到后备队列队尾

//3表示该作业占用cpu,正在运行

//4表示作业运行完成,释放占用的内存

}JCBNode,*PJCBNode;

//作业队列的描述,用带头结点的循环链表实现

typedef struct JCBQueue

{

JCBNode jcbNode;

struct JCBQueue* next;

}JCBQueue,*PJCBQueue;

4.2 全局变量定义

//全局变量

#define ALL_MEMORY 640 //系统总内存

#define OS_MEMORY 64 //操作系统占用的内存

#define SIZE 2 //门限值

PFreeLink freeLink; //空闲区自由链表

PBusyLink busyLink; //内存占用区链表

PJCBQueue jcbQueue; //外存中待分配内存的作业队列

PJCBQueue readyQueue; //已分配内存的就绪队列

PJCBQueue finishQueue; //已完成的作业队列

PJCBNode currentJCB; //当前正在执行的进程(作业

int current_time; //当前时间

4.3 算法流程图(已上传,在此没贴出

1.程序总算法流程图如下:

此流程图描述了作业从外存进入内存,再到进程完毕的过程。以及此过程中系统对内存的分配和回收。

步骤:作业申请内存 --- 作业进入内存 -–作业执行 --- 作业完成,释放内存

涉及到的算法:(1最坏适应算法(2内存回收算法(3先来先服务算法

注:作业进入内存时,此程序并没有模拟创建PCB,而是以JCB代替

2.内存分配最坏适应算法流程图:

3.内存回收算法流程图:

4.先来先服务算法流程图:

代码设计

采用多文件结构:

1. 其中document文件夹下存放输入作业信息的文本文档job.txt和输出信息information.txt

2. BusyLink.c文件定义实现了关于忙碌链表busyLink的操作:

//初始化忙碌链表

void initBusyLink(PBusyLink* pBusyLink

//在指定的结点后面插入新的结点

void insertBusyLink(PBusyLink prio

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值