可变分区存储管理模拟与先来先服务算法(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");

}

源程序

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

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可变分区管理最优分配算法主要有以下几个步骤: 1. 确定分区大小和数量。 2. 初始化空闲分区列表,按照分区大小从小到大排列。 3. 申请内存时,按照所需内存大小在空闲分区列表中查找符合条件的分区。 4. 如果找到合适的分区,则将该分区分割成两个部分,一个部分被占用,一个部分成为空闲分区,并将空闲分区插入到空闲分区列表中。 5. 如果没有找到合适的分区,则需要进行内存整理,将已经释放的空间合并成一个大的空闲分区,然后重新查找符合要求的分区。 6. 释放内存时,将占用分区标记为释放,并将该分区与相邻的空闲分区合并成一个更大的空闲分区。 下面是一个简单的可变分区管理最优分配算法的 C 语言实现,仅供参考: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 struct block { int size; int start; int end; }; struct block heap[MAX_SIZE]; int n = 0; // 当前分区数量 // 初始化空闲分区列表 void init_heap(int size) { heap[n].size = size; heap[n].start = 0; heap[n].end = size - 1; n++; } // 按照分区大小从小到大排列 void sort_heap() { int i, j; struct block temp; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (heap[i].size > heap[j].size) { temp = heap[i]; heap[i] = heap[j]; heap[j] = temp; } } } } // 在空闲分区列表中查找符合条件的分区 int find_block(int size) { int i, block_num = -1; for (i = 0; i < n; i++) { if (heap[i].size >= size) { block_num = i; break; } } return block_num; } // 申请内存 void allocate(int size) { int block_num = find_block(size); if (block_num == -1) { printf("No enough memory!\n"); return; } printf("Memory allocated at block %d.\n", block_num); int start = heap[block_num].start; int end = start + size - 1; heap[block_num].start = end + 1; heap[block_num].size -= size; if (heap[block_num].size == 0) { for (int i = block_num; i < n - 1; i++) { heap[i] = heap[i + 1]; } n--; } else { sort_heap(); } heap[n].size = size; heap[n].start = start; heap[n].end = end; n++; } // 释放内存 void release(int block_num) { heap[block_num].size = heap[block_num].end - heap[block_num].start + 1; if (block_num > 0 && heap[block_num - 1].start + heap[block_num - 1].size == heap[block_num].start) { heap[block_num - 1].size += heap[block_num].size; for (int i = block_num; i < n - 1; i++) { heap[i] = heap[i + 1]; } n--; block_num--; } if (block_num < n - 1 && heap[block_num].start + heap[block_num].size == heap[block_num + 1].start) { heap[block_num].size += heap[block_num + 1].size; for (int i = block_num + 1; i < n - 1; i++) { heap[i] = heap[i + 1]; } n--; } sort_heap(); printf("Memory block %d released.\n", block_num); } int main() { int choice, size, block_num; init_heap(20); init_heap(30); init_heap(10); sort_heap(); while (1) { printf("\n1. Allocate memory\n2. Release memory\n3. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: printf("Enter size of memory to allocate: "); scanf("%d", &size); allocate(size); break; case 2: printf("Enter block number to release: "); scanf("%d", &block_num); release(block_num); break; case 3: exit(0); default: printf("Invalid choice!\n"); break; } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值