存储管理动态分区分配及回收算法

一、 实验目的

     分区管理是应用较广泛的一种存储管理技术。本实验要求用一种结构化高级语言构造分区描述器,编制动态分区匹配算法和回收算法模拟程序,并讨论不同算法的特点。

二、  实验内容

     1.编写:First Fit Algorithm

     2.编写:Best Fit Algorithm

     3.编写 :空闲区回收算法

 三,提示和说明

   (一)主程序

    1、定义分区描述器node,包括 3个元素:

    (1)adr——分区首地址

    (2)size——分区大小

    (3)next——指向下一个分区的指针

    2、定义 3个指向node结构的指针变量:

    (1)head1——空闲区队列首指针

    (2)back1——指向释放区node结构的指针

    (3)assign——指向申请的内存分区node结构的指针

    3、定义 1个整形变量:

         free——用户申请存储区的大小(由用户键入)

   (二)过程

    1、定义check过程,用于检查指定的释放块(由用户键入)的合法性

    2、定义assignment1过程,实现First Fit Algorithm

    3、定义assignment2过程,实现Best Fit Algorithm

    4、定义acceptment1过程,实现First Fit Algorithm的回收算法

    5、定义acceptment2过程,实现Best Fit Algorithm的回收算法

    6、定义print过程,打印空闲区队列

   (三)执行

    程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。

(四)输出    

    要求每执行一次,输出一次空闲区队列情况,内容包括:

              编号  首址  终址  大小

三、实验过程

1.准备

A. 查阅相关资料;

B. 初步编写程序;

C. 准备测试数据;

2、主要流程和源代码#include<iostream>

#include<stdlib.h>

using namespace std;

#define Free 0 //空闲状态

#define Busy 1 //已用状态

#define OK 1    //完成

#define ERROR 0 //出错

#define MAX_length 32767 //最大内存空间为32767KB

typedef int Status;

int n = 0;

typedef struct freearea//定义一个空闲区说明表结构

{

int ID;   //分区号

long size;   //分区大小

long address; //分区地址

int state;   //状态

}ElemType;

//线性表的双向链表存储结构

typedef struct DuLNode //double linked list

{

ElemType data;

struct DuLNode *prior; //前趋指针

struct DuLNode *next; //后继指针

}DuLNode, *DuLinkList;

DuLinkList block_first; //头结点

DuLinkList block_last; //尾结点

Status alloc(int);//内存分配

Status free(int); //内存回收

Status First_fit(int, int);//首次适应算法

Status Best_fit(int, int); //最佳适应算法

void show();//查看分配

Status Initblock();//开创空间表

Status Initblock()//开创带头结点的内存空间链表

{

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.ID = 0;

block_last->data.state = Free;

return OK;

}

//分配主存

Status alloc(int ch)

{

int ID, request;

cout << "请输入作业(分区号):";

cin >> ID;

cout << "请输入需要分配的主存大小(单位:KB):";

cin >> request;

if (request<0 || request == 0)

{

cout << "分配大小不合适,请重试!" << endl;

return ERROR;

}

if (ch == 2) //选择最佳适应算法

{

if (Best_fit(ID, request) == OK) cout << "分配成功!" << endl;

else cout << "内存不足,分配失败!" << endl;

return OK;

}

else //默认首次适应算法

{

if (First_fit(ID, request) == OK) cout << "分配成功!" << endl;

else cout << "内存不足,分配失败!" << endl;

return OK;

}

}

//首次适应算法

Status First_fit(int ID, int request)//传入作业名及申请量

{

//为申请作业开辟新空间且初始化

DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));

temp->data.ID = ID;

temp->data.size = request;

temp->data.state = Busy;

DuLNode *p = block_first->next;

while (p)

{

if (p->data.state == Free && p->data.size == request)

{//有大小恰好合适的空闲块

p->data.state = Busy;

p->data.ID = ID;

return OK;

break;

}

if (p->data.state == Free && p->data.size>request)

{//有空闲块能满足需求且有剩余"

temp->prior = p->prior;

temp->next = p;

temp->data.address = p->data.address;

p->prior->next = temp;

p->prior = temp;

p->data.address = temp->data.address + temp->data.size;

p->data.size -= request;

return OK;

break;

}

p = p->next;

}

return ERROR;

}

//最佳适应算法

Status Best_fit(int ID, int request)

{

int ch; //记录最小剩余空间

DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));

temp->data.ID = ID;

temp->data.size = request;

temp->data.state = Busy;

DuLNode *p = block_first->next;

DuLNode *q = NULL; //记录最佳插入位置

while (p) //初始化最小空间和最佳位置

{

if (p->data.state == Free &&

(p->data.size>request || p->data.size == request))

{

q = p;

ch = p->data.size - request;

break;

}

p = p->next;

}

while (p)

{

if (p->data.state == Free && p->data.size == request)

{//空闲块大小恰好合适

p->data.ID = ID;

p->data.state = Busy;

return OK;

break;

}

if (p->data.state == Free && p->data.size>request)

{//空闲块大于分配需求

if (p->data.size - request<ch)//剩余空间比初值还小

{

ch = p->data.size - request;//更新剩余最小值

q = p;//更新最佳位置指向

}

}

p = p->next;

}

if (q == NULL) return ERROR;//没有找到空闲块

else

{//找到了最佳位置并实现分配

temp->prior = q->prior;

temp->next = q;

temp->data.address = q->data.address;

q->prior->next = temp;

q->prior = temp;

q->data.address += request;

q->data.size = ch;

return OK;

}

}

//主存回收

Status free(int ID)

{

DuLNode *p = block_first;

while (p)

{

if (p->data.ID == ID)

{

p->data.state = Free;

p->data.ID = Free;

if (p->prior->data.state == Free)//与前面的空闲块相连

{

p->prior->data.size += p->data.size;

p->prior->next = p->next;

p->next->prior = p->prior;

}

if (p->next->data.state == Free)//与后面的空闲块相连

{

p->data.size += p->next->data.size;

p->next->next->prior = p;

p->next = p->next->next;

}

break;

}

p = p->next;

}

return OK;

}

// 显示主存分配情况

void show()

{

cout << "***********-----------------************" << endl;

cout << "****       主 存 分 配 情 况        ****" << endl;

cout << "***********-----------------************" << endl;

DuLNode *p = block_first->next;

while (p)

{

cout << "分 区 号:";

if (p->data.ID == Free) cout << "Free" << endl;

else cout << p->data.ID << endl;

cout << "起始地址:" << p->data.address << endl;

cout << "分区大小:" << p->data.size << " KB" << endl;

cout << "状    态:";

if (p->data.state == Free) cout << "空 闲" << endl;

else cout << "已分配!" << endl;

cout << "-----------------------" << endl;

p = p->next;

}

 

}

//主函数

int main()

{

int ch, d = 0;//算法选择标记

cout << "1.首次适应算法 2.最佳适应算法 0.退出" << endl;

cout << "请选择分配算法:";

cin >> ch;

if (ch == 0 || ch == 1 || ch == 2) d++;

while (d == 0)

{

cout << "请选择正确的数字0 ,1 或2" << endl;

cin >> ch;

if (ch == 0 || ch == 1 || ch == 2) d++;

}

if (ch == 0) exit(0);

if (n == 0) Initblock(); //开创空间表

int choice; //操作选择标记

while (1)

{

cout << "********************************************" << endl;

cout << "**    1: 分配内存        2: 回收内存      **" << endl;

cout << "**    3: 查看分配        0: 返    回      **" << endl;

cout << "********************************************" << endl;

cout << "请输入您的操作 :";

cin >> choice;

if (choice == 1)

{

alloc(ch); // 分配内存

n++;

}

else if (choice == 2) // 内存回收

{

int ID;

cout << "请输入您要释放的分区号:";

cin >> ID;

free(ID);

n++;

}

else if (choice == 3)

{

show();//显示主存

n++;

}

else if (choice == 0)

{

main(); //退出

n++;

}

else //输入操作有误

{

cout << "输入有误,请重试!" << endl;

continue;

}

}

 

}

 

四、实验结果

 

 

 

 

 

 

 

 

 

 

 

3、遇到的主要问题和解决方法

主要问题是在算法的结构的理解。

4、上机调试

 

 

 

内存大小测试,超出内存分配,提示错误

 

 

 

内存合理分配成功

 

 

 

回收未分配区域,会直接返回

 

 

 

回收已分配内存,会自动程序结束。(bug)

五.实验总结

通过本次实验我掌握了对存储管理的知识,提高了在编写代码的时候产生很多问题时解决问题的能力,通过实验熟悉了最佳分配和最先分配算法,在网上也搜索了好几个算法,进行调试,与自己的程序部分进行整合,收获还是挺多的。同时提高了对C语言的理解。

 

posted @ 2021-05-24 16:22  Spongbob  阅读(2469)  评论(0编辑  收藏  举报