zoukankan      html  css  js  c++  java
  • 存储管理动态分区分配及回收算法

    一、 实验目的

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

    二、  实验内容

         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语言的理解。

  • 相关阅读:
    基于注解的springmvc开发
    判断两数之和
    redux-saga call 和 fork的区别
    滚动轴滚动方向判断
    原生方法scrollTo支持滚动特效
    npm下载包失败的几个原因
    关闭vscode打开新文件自动关闭预览文件功能
    在本地文件当中package.json的作用
    解决crlf 和 lf不同带来的冲突问题
    package-lock.json 文件的作用
  • 原文地址:https://www.cnblogs.com/xiangyu721/p/14941387.html
Copyright © 2011-2022 走看看