ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-06-11 23:01:54  阅读:198  来源: 互联网

标签:存储管理 adr 分区 after next 算法 printf size before


一、目的和要求

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

 

二、实验内容

    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. 编写:First Fit Algorithm

编写:Best Fit Algorithm

编写:空闲区回收算法编写两种调度算法程序:

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

3. 将程序源代码和运行截图写入实验报告并提交。

、实验步骤

  1. 实验准备

(1) 查阅相关资料;

编写两种地址分配算法的程序参考了比较多的内容,首先参考了教材,将两种地址分配算法又重新复习了一下,增加了一下理论的掌握情况,然后又根据实验报告上的要求进行了主体的搭建,具体细节的实现主要参考了一些网上的文章。主要包括下面三篇文章。

https://www.doc88.com/p-1146521830717.html?s=rel&id=1

https://www.doc88.com/p-9197402934769.html?s=rel&id=4

 

https://blog.csdn.net/c1194758555/article/details/53047570?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165142364816782248521163%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165142364816782248521163&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-13-53047570.142^v9^pc_search_result_cache,157^v4^control&utm_term=%E6%97%B6%E9%97%B4%E7%89%87%E8%BD%AE%E8%BD%AC%E7%AE%97%E6%B3%95%E5%92%8C%E4%BC%98%E5%85%88%E7%BA%A7%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187

 

(2) 初步编写程序;

进程调度算法程序主体框架:

void menu() {

//菜单及主要过程

char chose;

int ch,num=0, r, add, rd;

while (1) {

system("cls");//清屏 

printf("选择最先适应算法输入F,选择最佳适应算法请输入B,退出程序请输入E\n\n");

printf("请选择你的输入:");

scanf("%c", &chose);

if (chose == 'e' || chose == 'E')

exit(0);

else {

system("cls");

while (1) {

if (chose == 'f' || chose == 'F')

printf("最先适应算法(First-Fit)模拟:\n");

if (chose == 'b' || chose == 'B')

printf("最佳适应算法(Best-Fit)模拟:\n");

printf("1.分配内存,2.回收内存,3.查看内存,4.返回\n\n");

printf("请输入你的选择:");

scanf("%d", &ch);

fflush(stdin);//清除输入缓冲区中的数据 

switch (ch) {

case 1:

printf("输入申请的分区大小:");

scanf("%d", &r);

if (chose == 'f' || chose == 'F')

assign = assignment1(num, r);

else {

assign = assignment2(num, r);

}

 

if (assign->adr == -1) {

printf("分配内存失败!\n");

}

else {

printf("分配内存成功!分配的首地址为:%d\n", assign->adr);

}

break;

case 2:

printf("输入释放的内存的首地址:");

scanf("%d", &add);

printf("输入释放内存的大小:");

scanf("%d", &r);

printf("输入释放内存的编号:");

scanf("%d", &rd);

if (check(add, r, chose)) {

if (chose == 'f' || chose == 'F')

acceptment1(add, r, rd);

if (chose == 'b' || chose == 'B')

acceptment2(add, r, rd);

}

break;

case 3:

print(chose);

break;

case 4:

menu();

break;

}

}

}

}

}

 

(3) 准备测试数据;

进程调度模拟算法,数据输入格式

首先选择算法类型,然后进行分配内存、回收内存、查看内存、返回,等一系列的选择,如下图所示:

 

  1. 上机调试

 

 

 

 

 

 

 

源代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)
#define MAX_SIZE 32767 
typedef struct node {
    int id;
    int adr;
    int size;
    struct node* next;
}Node;
Node* head1, * head2, * back1, * back2, * assign;
int request;
//add释放内存的首地址 siz释放内存大小 c算法类型 
int check(int add, int siz, char c) {
    Node* p, * head;
    int check = 1;
    if (add < 0 || siz < 0)
        check = 0;//地址和大小不能为负
    if (c == 'f' || c == 'F')
        head = head1;
    else
        head = head2;
    p = head->next;
    while ((p != NULL) && check)
        //两个判断条件,释放地址小于首址,但释放的末地址大于首址。释放地址大于首址,且小于末地址 
        if (((add < p->adr) && (add + siz > p->adr)) || ((add >= p->adr) && (add < p->adr + p->size)))
            check = 0;
        else
            p = p->next;
    if (check == 0)
        printf("\t 输入释放区地址或大小有错误\n");
    return check;
}

void init() {
    Node* p;
    head1 = (Node*)malloc(sizeof(Node));
    head2 = (Node*)malloc(sizeof(Node));
    p = (Node*)malloc(sizeof(Node));
    head1->next = p;
    head2->next = p;
    p->size = MAX_SIZE;
    p->adr = 0;
    p->next = NULL;
    p->id = 0;

}
//首次适应算法分配内存 
Node* assignment1(int num, int req) {
    printf("%d %d", num, req);
    Node* before, * after, * ass;
    ass = (Node*)malloc(sizeof(Node));
    before = head1;
    after = head1->next;
    ass->id = num;
    ass->size = req;
    //将after指针指向大小刚好适应需求的空闲地址
    while (after->size < req) {
        before = before->next;
        after = after->next;
    }
    if (after == NULL) {
        ass->adr = -1;
    }
    else {
        //地址与需求地址相等 
        if (after->size == req) {
            before->next = after->next;
            ass->adr = after->adr;
        }
        else {
            //地址比需求地址大 
            after->size -= req;
            ass->adr = after->adr;
            after->adr += req;
        }
    }
    return ass;
}
//首先分配算法回收内存 
void acceptment1(int address, int siz, int rd) {
    Node* before, * after;
    int insert = 0;
    back1 = (Node*)malloc(sizeof(Node));
    before = head1;
    after = head1->next;
    back1->adr = address;
    back1->size = siz;
    back1->id = rd;
    back1->next = NULL;
    printf("%d,%d", head1->adr, head1->size);
    while (!insert && after) {
        //将要被收回的分区插入到 空闲区(按首地址从小到大插入)
        //back1地址的大小位于after和before之间 
        if ((after == NULL) || ((back1->adr <= after->adr) && (back1->adr >= before->adr))) {
            before->next = back1;
            back1->next = after;
            insert = 1;
        }
        else {
            before = before->next;
            after = after->next;
        }
    }
    if (insert) {
        //back1的首地址刚好等于before的末地址 
        if (after && back1->adr + back1->size == after->adr) {
                    //back1的 
                    //和后边分区合并
                    back1->size += after->size;
                    back1->next = after->next;
                    back1->id = after->id;
                    free(after);
        }
        if (back1->adr == before->adr + before->size) {
            //和前面分区合并
            before->size += back1->size;
            before->next = back1->next;
            free(back1);
        }
        
        printf("\t 首先分配算法回收内存成功\n");
    }
    else {
        printf("\t首先分配算法回收内存失败\n");
    }
}
// 最佳适应算法分配内存 
Node* assignment2(int num, int req) {
    Node* before, * after, * ass, * q;
    ass = (Node*)malloc(sizeof(Node));
    q = (Node*)malloc(sizeof(Node));
    before = head2;
    after = head2->next;
    ass->id = num;
    ass->size = req;
    while (after->size < req) {
        before = before->next;
        after = after->next;
        //printf("while");
    }
    if (after == NULL) {
        ass->adr = -1;
        printf("null");
    }
    else {
        if (after->size == req) {
            printf("==");
            before->next = after->next;
            ass->adr = after->adr;
        }
        else {
            //after->size > req
            //q是前去req之后的空白分区
            q = after;
            before->next = after->next;
            ass->adr = q->adr;
            q->size -= req;
            q->adr += req;
            //将q插入到空白链表的对应位置
            before = head2;
            after = head2->next;
            if (after == NULL) {
                before->next = q;
                q->next = NULL;
            }
            else {
                while (after!=NULL&&(after->size) < (q->size)) {
                    before = before->next;
                    after = after->next;
                    //ass->adr=after->adr;
                }
                before->next = q;
                q->next = after;
            }
        }
    }
    return (ass);
}
//最佳适应算法回收内存
void acceptment2(int address, int siz, int rd) {
    Node* before, * after;
    int insert = 0;
    back2 = (Node*)malloc(sizeof(Node));
    before = head2;
    after = head2->next;
    back2->adr = address;
    back2->size = siz;
    back2->id = rd;
    back2->next = NULL;
    if (head2->next == NULL) {
        //空闲队列为空
        head2->next = back2;
        head2->size = back2->size;
        //printf("null");
    }
    else {
        //空闲队列不为空
        while (after) {
            if (back2->adr == after->adr + after->size) {
                //和前面空闲分区合并
                before->next = after->next;
                after->size += back2->size;
                back2 = after;
            }
            else {
                before = before->next;
                after = after->next;
            }
        }
        before = head2;
        after = head2->next;
        //printf("%d %d\n",before->adr,after->adr);
        while (after) {
            if (after->adr == back2->adr + back2->size) {
                //和后边空闲区合并
                before->next = after->next;
                back2->size += after->size;
            }
            else {
                before = before->next;
                after = after->next;
            }
        }
        before = head2;
        after = head2->next;
        //printf("%d %d\n",before->adr,after->adr);
        //printf("%d,%d,%d\n",after->size,before->size,back2->size);
        while (!insert) {
            //printf("%d,%d,%d\n",after->size,before->size,back2->size);
            //将被回收的快插入到恰当的位置(按分区大小从小到大)
            if (after == NULL || ((after->size > back2->size))) {
                before->next = back2;
                back2->next = after;
                insert = 1;
                break;
            }
            else {
                before = before->next;
                after = after->next;
                //    printf("%d\n",before->adr);
            }
        }
    }
    if (insert)
        printf("\t最佳适应算法回收内存成功\n");
    else
        printf("\t最佳适应算法回收内存失败\n");
}

void print(char choice) {
    //输出空闲区队列信息
    Node* p;
    if (choice == 'f' || choice == 'F')
        p = head1->next;
    else
        p = head2->next;
    if (p) {
        printf("\n空闲队列的情况为:\n");
        printf("\t编号\t首址\t终址\t大小\n");
        while (p) {
            printf("\t%d\t%d\t%d\t%d\n", p->id, p->adr, p->adr + p->size - 1, p->size);
            p = p->next;
        }
    }
}

void menu() {
    //菜单及主要过程
    char chose;
    int ch,num=0, r, add, rd;
    while (1) {
        system("cls");//清屏 
        printf("选择最先适应算法输入F,选择最佳适应算法请输入B,退出程序请输入E\n\n");
        printf("请选择你的输入:");
        scanf("%c", &chose);
        if (chose == 'e' || chose == 'E')
            exit(0);
        else {
            system("cls");
            while (1) {
                if (chose == 'f' || chose == 'F')
                    printf("最先适应算法(First-Fit)模拟:\n");
                if (chose == 'b' || chose == 'B')
                    printf("最佳适应算法(Best-Fit)模拟:\n");
                printf("1.分配内存,2.回收内存,3.查看内存,4.返回\n\n");
                printf("请输入你的选择:");
                scanf("%d", &ch);
                fflush(stdin);//清除输入缓冲区中的数据 
                switch (ch) {
                case 1:
                    printf("输入申请的分区大小:");
                    scanf("%d", &r);
                    if (chose == 'f' || chose == 'F')
                        assign = assignment1(num, r);
                    else {
                        assign = assignment2(num, r);
                    }

                    if (assign->adr == -1) {
                        printf("分配内存失败!\n");
                    }
                    else {
                        printf("分配内存成功!分配的首地址为:%d\n", assign->adr);
                    }
                    break;
                case 2:
                    printf("输入释放的内存的首地址:");
                    scanf("%d", &add);
                    printf("输入释放内存的大小:");
                    scanf("%d", &r);
                    printf("输入释放内存的编号:");
                    scanf("%d", &rd);
                    if (check(add, r, chose)) {
                        if (chose == 'f' || chose == 'F')
                            acceptment1(add, r, rd);
                        if (chose == 'b' || chose == 'B')
                            acceptment2(add, r, rd);
                    }
                    break;
                case 3:
                    print(chose);
                    break;
                case 4:
                    menu();
                    break;
                }
            }
        }
    }
}

int main() {
    //主函数
    init();
    menu();
    return 0;
//}

 

标签:存储管理,adr,分区,after,next,算法,printf,size,before
来源: https://www.cnblogs.com/wfswf/p/16367057.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有