`
Touch_2011
  • 浏览: 287269 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

可变分区存储管理模拟与先来先服务算法(C语言实现)

阅读更多

可变分区存储管理

问题描述:

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

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

//队尾插入结点

void inseartJCBQueue(PJCBQueue* tail,JCBNode jcbNode)

//判断队列是否为空

int JCBQueueIsEmpty(PJCBQueue* tail)

//队头删除结点

PJCBNode deleteJCBQueue(PJCBQueue* tail)

//取队头元素

PJCBNode getFrontJCBQueue(PJCBQueue tail)

//按申请内存的时间先后排序(选择排序)

void sortJCBQueue(PJCBQueue tail)

5.       Memory.c实现了各个算法:

void  init();                   // 设置系统初始状态

int  freeMemo(JCBNode);      //模拟内存回收

int  requireMemo(JCBNode);   //模拟内存分配

void timePast();                //模拟系统时间

void write();           //把当前时间的内存信息,作业信息写入文件information.txt

//主函数

void main()

{

      //1.初始化系统

     init();

      //2.时间逐步加1

    timePast();

      //3.提示信息

printf("各个时间的内存及作业信息已存入document/information.txt文件中\n\n");

}

源程序

    流程图、运行结果分析、源代码已上传。

 

 

 

 

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics