可变分区存储管理
问题描述:
编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时要与相邻空闲区的合并。
初始状态信息:假定系统的内存共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语言来实现一种可变分区的内存管理模拟,特别关注最佳适应算法。 **一、可变分区分配** 可变分区分配是一种内存管理策略,它允许内存空间动态地划分成大小不等的分区,以适应不同大小的...
在这个实验中,你需要使用C语言编写一个程序来模拟UNIX系统的可变分区内存管理,特别关注指针的使用和链表操作。 首先,你需要理解可变分区存储管理的基本原理。这种管理方式允许动态地分配和回收内存,每个进程...
### 模拟可变分区算法实现分区与回收 #### 实验背景 在计算机科学领域,内存管理是一项核心技能。为了优化资源使用效率并确保程序稳定运行,开发人员必须熟悉多种内存管理技术。其中,可变分区算法是操作系统内存...
本项目是基于C语言实现的可变分区存储管理的模拟,旨在帮助学生深入理解和实践这一概念。 在《计算机操作系统》这本经典教材中,可变分区存储管理是一个重要的章节,因为它涉及到如何有效地分配有限的内存资源给多...
在本实验中,我们将使用 C 语言来模拟实现可变式分区存储管理。首先,我们需要确定该系统所使用的数据结构。我们可以把内存表示为一个数组的形式,每一个单元都是一个无符号的字符型的数据类型。这样一个单元刚好...
申请内存 mem * Create_memory(mem *head,int length,char name) 收回内存 mem * Free_memory(mem *head,char name)
### 可变分区存储管理方式的内存分配与回收 #### 概述 可变分区存储管理方式是一种在早期操作系统中广泛采用的内存管理技术。它通过动态地将内存划分为不同大小的分区来满足不同程序的内存需求。这种方式能够有效地...
常见的分区分配算法包括固定分区、动态分区(首次适应、最佳适应、最差适应)以及可变分区。这些算法的实现有助于理解操作系统如何管理内存资源。 2. **工资管理**: - 这部分可能涉及到数据结构和数据库的概念,...
### 可变分区存储管理和多级队列调度算法模拟实现 #### 实验要求与目标 本次实验的主要目的是理解和实现可变分区存储管理以及多级队列调度算法,并通过实际编程来加深对这两种技术的认识。实验具体要求如下: 1. ...
设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程最佳适应法 在计算机系统中,存储管理是操作系统的核心组件之一,它负责管理计算机系统的存储资源,包括主存储器和辅助存储器。好的存储...
本实验报告主要涉及在操作系统中实现可变分区管理的模拟,包括分区的分配和回收,并使用了三种不同的分配算法:首次适应算法、循环首次适应算法和最佳适应算法。 首次适应算法是按顺序查找空闲分区,一旦找到能满足...
5. **源代码**:“可变分区存储管理源文件.C”很可能是实现上述分配策略的C程序,通过读取进程请求,调用不同的分配函数,模拟内存分配和回收过程。“可变分区存储管理实验报告.doc”则包含了实验的详细描述和分析,...
一、设计内容 主存储器空间的分配和回收。 二、设计目的 ...主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实习帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。
1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。 2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。 3、在设计好的数据结构上设计一个主存分配算法。 4...
使用C语言实现了操作系统可变分区分配算法,实现了首次。循环首次、最佳、最坏等算法,可以运行在Linux系统上,只是算法的模拟,没有调用Linux系统内核数据
- **程序结构**:程序主要由C语言编写,通过定义节点类型和一系列函数来实现可变分区存储管理的功能。 - **核心函数解析**: - `print()`:打印当前所有分区的起始地址、大小和状态。 - `sort(int k)`:对链表进行...
主存空间的分配与回收。熟悉主存的分配与回收,理解在不同的存储管理方式下,如何实验主存空间的分配与回收...掌握动态分区方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 编译通过,完全没有问题。
使用双向链表的数据结构,用C语言成功实现了可变分区存储管理中的循环首次适应法,实现了对内存区的分配和释放管理。并且考虑了很多分配和释放内存区时的错误,如分配时内存不足,释放越界,重复释放等问题,并给出...