用C语言模拟内存分区分配管理的最佳适应算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

初始状态信息:假定系统的内存共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 prior,BusyNode busyNode)

//在链表尾部插入结点

void insertBusyLinkAtTail(PBusyLink head,BusyNode busyNode)

//判断链表是否为空

int BusyLinkIsEmpty(PBusyLink head)

//根据作业名称删除结点

PBusyNode deleteBusyLinkByName(PBusyLink head,char *str)

3. FreeLink.c文件定义实现了关于自由链表freeLink的操作:

//初始化自由链表

void initFreeLink(PFreeLink* pFreeLink)

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

void insertFreeLink(PFreeLink prior,FreeNode freeNode)

//在链表尾部插入结点

void insertFreeLinkAtTail(PFreeLink head,FreeNode freeNode)

//判断链表是否为空

int FreeLinkIsEmpty(PFreeLink head)

//删除头结点

int deleteFreeLink(PFreeLink head)

//删除指定结点

int deleteFreeLinkByIndex(PFreeLink head,PFreeLink index)

//按空闲区由大到小排序,选择排序法

void sortFreeLink(PFreeLink head)

4. JobQueue定义实现了关于作业队列的操作:

//初始化

void initJCBQueue(PJCBQueue* tail)

//队尾插入结点

相关文档
最新文档