用C语言模拟内存分区分配管理的最佳适应算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)
//队尾插入结点