操作系统的课程,课本的知识很容易懂,我的想法是用数组存储内存分配的空闲区,初始的空闲区的个数和大小是固定的,随着后期的回收分配才会有改变,可是这样很麻烦,应该用链表会使回收和分配方便很多
所以运用链表操作首次适应算法时初始化内存分配的空闲区大小是固定的,接下来的代码是初始化的大小为用户输入的max,然后就可以进行分割
回收的时候回考虑三种情况:
一是回收的区域的前一块和后一块均是空闲区,则将三块合为一块
二是只有前一块是空闲区,后一块不是,则将前一块和将回收的区域合并
三是 只有后一块是空闲区,前一块不是,则将后一块和将回收的区域合并
代码是大多参考别人的,也有自己完善的部分
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#define Free 0 //空闲状态
#define Busy 1 //已用状态
#define OK 1 //完成
#define ERROR 0 //出错
typedef int Status;
int flag;
/**
*设置空闲块
*有三个标识符
*address起始地址
*size空闲块大小
*state空闲块状态
*/
typedef struct freearea
{
int address;//空闲区地址
int size;//作业空间大小
int state;//空闲去状态
}ElemType;
/**
*设置链表指针
*/
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
/**
*block_first
*链表首地址
*block_last
*链表尾地址
*/
DuLinkList block_first;
DuLinkList block_last;
void alloc(int);
void free(int);
Status FF(int);
void show();
void initblock();
/**
*初始化内存
*传入用户需设置的内存大小MAX_length
*/
void initblock(int MAX_length)
{
block_first=(DuLinkList)malloc(sizeof(DuLNode));
block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->prior=NULL;
block_first->next=block_last;
block_last->prior=block_first;
block_last->next=NULL;
block_last->data.address=0;
block_last->data.size=MAX_length;
block_last->data.state=Free