哈尔滨理工大学课程设计报告
(3)最坏适应算法Worst_fit(int,int); 流程图(图5)
哈尔滨理工大学课程设计报告
开始 subAreaNode*p= subHead.nxt Y P是否空且N P是否满足最佳分配空间 N p=p-Y tar=p,mm=遍Y 历空闲链表,p=subHead.nxt寻找最大的Y tarN 为Y 是否小tar->size-size于等于内存碎片 N 切割tar,分配给作业,并把剩余内存重新链入链Y tar全部分配给作业 结束 图
哈尔滨理工大学课程设计报告
4.程序的技术路线
本程序采用C语言编写,在windows下的Visual C++中编译,模拟可变分区存储管理方式的内存分配与回收。假定系统的最大内存空间为1000kb,判断是否划分空闲区的最小限值为MINSIZE=5。初始化用户可占用内存区的首地址为0,大小为0B。定义一个结构体及其对象subHead实现内存的分配回收及分配表和空闲表的登记。用最佳分配算法实现动态分配时,调用int bestFit(int taskId, int size)内存分配函数,设定循环条件查找最佳空闲分区,根据找到的空闲区大小和作业大小判断是整个分配给作业还是切割空闲区后再分配给作业,并在“内存分配表”和“空闲分区表”中作登记。调用int freeSubArea(int taskId)函数实现内存的回收。顺序循环“内存分配表”找到要回收的作业,设置标志位flag,当flag=1时表示回收成功。回收内存时需考虑内存的4种合并方式,即合并上下分区、合并上分区、合并下分区、上下分区都不合并。
五、 带有详细注解的源程序
#include
#define SIZE 1000 // 内存初始大小 #define MINSIZE 5 // 碎片最小值 enum STATE { Free, Busy }; static int ss=0,ee=0; struct subAreaNode {
int addr; // 起始地址 int size; // 分区大小 int taskId; // 作业号
哈尔滨理工大学课程设计报告
STATE state; // 分区状态 subAreaNode *pre; // 分区前向指针 subAreaNode *nxt; // 分区后向指针 }subHead;
// 初始化空闲分区链 void intSubArea() {// 分配初始分区内存
subAreaNode *fir = (subAreaNode *)malloc(sizeof(subAreaNode)); // 给首个分区赋值 fir->addr = 0; fir->size = SIZE; fir->state = Free; fir->taskId = -1; fir->pre = &subHead; fir->nxt = NULL; // 初始化分区头部信息 subHead.pre = NULL; subHead.nxt = fir; }
// 首次适应算法
int firstFit(int taskId, int size) { subAreaNode *p = subHead.nxt; while(p != NULL) {
if(p->state == Free && p->size >= size) { // 找到要分配的空闲分区 if(p->size - size <= MINSIZE) {
哈尔滨理工大学课程设计报告
// 整块分配 p->state = Busy; p->taskId = taskId; } else {
// 分配大小为size的区间
subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode)); node->addr = p->addr + size; node->size = p->size - size; node->state = Free; node->taskId = -1; // 修改分区链节点指针 node->pre = p; node->nxt = p->nxt; if(p->nxt != NULL) { p->nxt->pre = node; }
p->nxt = node; // 分配空闲区间 p->size = size; p->state = Busy; p->taskId = taskId; }
printf(\内存分配成功!\\n\ return 1; } p = p->nxt; }