可变分区存储管理
问题描述:
编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时要与相邻空闲区的合并。
初始状态信息:假定系统的内存共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");
}
源程序
流程图、运行结果分析、源代码已上传。
分享到:
相关推荐
利用c语言来实现可变分区的模拟,采用的是最佳适应算法。代码内有详细注释!
1. 加深对可变分区存储管理的理解 2. 考察使用C语言编写代码的能力,特别是C语言编程的难点之一:指针的使用 3. 复习使用指针实现链表以及在链表上的基本操作
申请内存 mem * Create_memory(mem *head,int length,char name) 收回内存 mem * Free_memory(mem *head,char name)
源码掉了,文档中含部分源码,比较简单,可以自己补全。
操作系统可变分区存储管理方式的内存分配和回收,可变分区调度算法有:最先适应分配算法,最优适应分配算法,最坏适应算法 用户提出内存空间的申请;系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,...
一、设计内容 主存储器空间的分配和回收。 二、设计目的 ...主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实习帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。
使用C语言实现了操作系统可变分区分配算法,实现了首次。循环首次、最佳、最坏等算法,可以运行在Linux系统上,只是算法的模拟,没有调用Linux系统内核数据
1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。 2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。 3、在设计好的数据结构上设计一个主存分配算法。 4...
操作系统原理课程设计:可变式分区存储管理系统 采用空闲区链实现主存的分配与回收 使用首次适应算法、最优适应算法、最坏适应算法、最后适应算法
主存空间的分配与回收。熟悉主存的分配与回收,理解在不同的存储管理方式下,如何实验主存空间的分配与回收...掌握动态分区方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 编译通过,完全没有问题。
使用双向链表的数据结构,用C语言成功实现了可变分区存储管理中的循环首次适应法,实现了对内存区的分配和释放管理。并且考虑了很多分配和释放内存区时的错误,如分配时内存不足,释放越界,重复释放等问题,并给出...
用于操作系统课程设计,在C语言的开发环境下处理可变分区存储管理
利用操作系统中可变式分配和回收的原理。 模拟空闲区的分配:大于小于等于空闲区的大小 回收:上相邻、下相邻、上下都不相邻、上下都相邻
理解内存分配原理,特别是以页面为单位的虚拟内存分配方法。模拟存储管理中内存空间的管理和分配内存空间的管理分为固定分区管理方式,可变分区管理方式,页式存储管理,段式存储管理。
计算机操作系统实验二,存储管理动态分区分配及回收算法,C语言实现
操作系统 循环首次适应算法 首次适应算法 最佳适应算法 回收内存 分配内存设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法: 首次适应算法 循环首次...
本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。 采用最先适应法、最佳适应法、最坏适应法分配主存空间。 当一个新作业要求装入主存时,必须查空闲区表...
在可变分区管理方式下,采用首次适应算法(最先适应算法)实现主存空间的分配和回收。操作系统课程设计,用C语言实现。在VC6.0上调试通过。
链表实现:系统采用最优适应分配算法为作业分配主存空间,而且具有紧凑技术。请编程完成以下步骤::#define n 10 /*假定系统允许的最大作业 数量为n,n值为10*/ struct {int number; /*序号*/ int address; /*已...