可变分区存储管理
问题描述:
初始状态信息:假定系统的内存共640K,初始状态为操作系统本身占用64K。
将要申请内存的作业信息(存储在document/job.txt文件中),当前时间是0。
输入:用户打开document/job.txt文件,输入作业信息。
处理:模拟时间逐歩增加,每次加1.采用先来先服务算法调度作业,模拟作业运行,用最坏适应算法进行内存的分配。且进行内存的回收,注意与空闲分区的合并。直到所以作业运行完成程序结束。
输出:把当前时间为0,为1,为2......的内存分配状况和作业信息写入文件document/information.txt。
//空闲区结点描述
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;
//全局变量
#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; //当前时间
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");
}
流程图、运行结果分析、源代码已上传。