内存分配算法 之 首次适应-最佳适应

程序在向操作系统申请内存空间的时候,操作系统会扫描空闲块链表并从中取出一块足够大的分配,与之对应的算法有 首次适应 和 最佳适应,顾名思义,首次适应就是把首次遇到的足够大的空闲块分配给应用程序,最佳适应就是扫描完空闲块链表把大小与申请空间最匹配的空闲块分配给应用程序。

mem.h        程序用到的头文件

main.c       主函数

fit.c        具体的实现函数

这里使用make来编译使用,若是读者还没接触过make的,

请移步参考我写的这篇文章:http://netcake.blog.51cto.com/8663272/1560563

================================================

mem.h

------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

//模拟空闲块链表的节点,其中k代表空闲空间大小
typedef struct po{
    int k;
    struct po *next;
}points;

void initalize(void);//初始化空闲块链表,给节点中代表空闲空间大小k赋值

void print(void);    //打印空闲块链表

void fassign(void);  //first_fit,首次适应算法

void bassign(void);  //best_fit,最佳适应算法

================================================

================================================

main.c

------------------------------------------------

/*
    内存分配适应算法主函数
    
        while(打印提示用户的输入信息)
             等待用户输入
            用户合法,执行相应操作
*/
#include "mem.h"

main()
{
    char c;
    initalize();

printf("p表示打印空闲空间块,m表示要申请一块空闲空间,q表示退出,请输入:");
    while(c = getchar())    
        if(c == ‘\n‘)
            continue;
        else
        {
            switch(c)
            {
                case ‘p‘:
                    print();
                    break;
                case ‘b‘:
                    bassign();
                    break;
                case ‘f‘:
                    fassign();
                    break;
                case ‘q‘:
                    exit(0);
                default:
                    printf("请正确输入!\n");
            }
            printf("p表示打印空闲空间块大小,b表示最佳适应法,f表示首次适应法,q表示退出,请输入:");
        }
}

================================================

fit.c

------------------------------------------------

#include "mem.h"

static points * header;//空闲块链表头节点的全局变量,使用static限定只能在本文件使用
#define MAXSIZE    140

//初始化空闲块链表
void initalize(void)
{
    points *f, *b;
    int i = 6;
        
    header = (points *)malloc(sizeof(points *));
    header->k = 6;//头节点记录空闲块的块数,头节点并不属于要分配的内存的一部分
    header->next = NULL;
    b = header;

while(--i)
    {
        f = (points *)malloc(sizeof(points *));
        f->k = rand()%(MAXSIZE-i*10);
        f->next = NULL;
        
        b->next = f;
        b = f;
        f = f->next;
    }
    f = (points *)malloc(sizeof(points *));
    f->k = MAXSIZE;
    f->next = NULL;
    b->next = f;
}
//打印空闲链表
void print(void)
{
    points *p;
    for(p=header->next; p != NULL; p=p->next)
        printf("%d ", p->k);
    printf("\n");

}
void getsize(int *size)
{
    char a[3], c, *p;
    int i, k;

getchar();//读取在菜单选择时候的回车符

while(1)
    {
        printf("请输入要申请的空间的大小,范围(0-120]:");
        //每次对a初始化是为了避免再输入超3个字符错误之后,输入少于3个字符的情况
        for(i=0;i<3;i++)
            a[i]=‘f‘;
        p = a;
        for(i=0;(c=getchar())!=‘\n‘ && i<3;i++)
            *p++ = c;
        k = i;
        for(i=0; i<k; i++)
            if(a[i] <‘0‘ || a[i]>‘9‘)
            {
                printf("非法输入!\n");
                break;
            }
        if(i == k)
        {
            *size = atoi(a);
            if(*size<=0 || *size>MAXSIZE)
            {
                printf("非法输入!\n");
                continue;
            }
            else
                break;
        }
    }
}
void bassign(void)
{
    int size, far=MAXSIZE, n;
    points *ptr, *p;
    getsize(&size);
    for(p=header->next; p!=NULL; p=p->next)
        if((n=p->k-size) >= 0 && n < far)
        {    
            far = n;
            ptr = p;
        }
    printf("最佳适应法分配的空间块大小是 %d\n", ptr->k);
}
void fassign(void)
{
    int size;
    points *p;

getsize(&size);
    for(p=header->next; p!=NULL; p=p->next)
        if((p->k-size) >= 0 )
            break;
    printf("首次适应法分配的空间块大小是 %d\n", p->k);
}

/*

使用scanf函数并不不能正确处理遇到输入为字符串的情况,这里提供这个一开始

为了简单而暂时使用的处理用户输入的函数

void getsize(int *size)
{
    char *p;
    while(1)
    {
        printf("请输入要申请的空间的大小,范围(0-120]:");
        scanf("%d", size);
        if(*size<=0 || *size>120)
            printf("输入非法!\n");
        else
            break;
    }
}
 
 */

================================================

时间: 2024-08-05 11:09:55

内存分配算法 之 首次适应-最佳适应的相关文章

MINI3内存分配算法

1 最差适应算法 2 #ifdef USING_WORST_FIT 3 { 4 //先找到第一个满足要求的空洞, 5 //再以第一个为标准寻找最适合的空洞. 6 //当最适合的空洞完全吻合 7 //就直接划给它,当空洞较大时就切割. 8 9 //首先注册目标指针.目标前一个指针.头指针 10 //记录目标大小和目前最适合大小 11 register struct hole *hp; 12 register struct hole *prevAim_ptr; 13 register struct

JAVA模拟内存分配与释放——首次适应算法

前言 首次适应算法(FF,first fit)是内存基于顺序搜索的动态分配分区算法,在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后在按照作业的大小从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中.若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给该进程,内存分配失败,返回. 该算法倾向于优先利用内存中低地址部分的空闲分区,从而保留了高地址部分不断被划分.这为以后到达的大作业分配大的的内存空间创造了条件.其缺

操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)

实现动态分区的分配算法. (1) 最佳适配算法:选择内存空闲块中最适合进程大小的块分配. (2) 邻近适配算法:从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程. 模拟添加进程的时候,假定内存是一块完整的空闲区,对于算法(1)来说,分配的时候遍历所有的空闲内存块,找出其中最适合的一块,注意此时内存分区的总块数可能已经发生了变化: 对于算法(2)来说,则需要从上次分配的内存块(使用变量记录即可)接着向下找到第一个满足条件的块即可,内存分区的总块可能也已经发生了变

我所理解的内存分配算法(一)

内存分配从本质上来说是一种空间管理算法,给你一块连续的空间,提供存储服务,那么你的空间管理跟分配要采用什么样的算法才会比较高效? Bump-the-Pointer Bump-the-Pointer是最简单的算法.HotSpot的MM白皮书是这么描述btp的, That is, the end of the previously allocated object is always kept track of. When a new allocation request needs to be s

垃圾收集与内存分配算法

3.1判断对象是否已死引用-计数算法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时候计数器为0的对象就是不可能再被使用的. 3.2判断对象是否已死引用-可达性分析算法 在主流的程序语言中,都是通过可达性分析来判断对象是否存活的.这个算法的基本思路就是通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象至GC Roots没有任何引用链相连时,则证明此对象不可用. 在java语言中

内存分配---FF、BF、WF三种算法

动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块的数据结构.(2)内存块的描述. #define PROCESS_NAME_LEN 32 //进程名长度 #define MIN_SLICE 10 //最小碎片的大小 #define DEFAULT_MEM_SIZE 1024 //内存大小 #define DEFAULT_MEM_START 0 /

内存分配方式及内存碎片

什么是内存碎片? 内部碎片的产生:因为所有的内存分配必须起始于可被 4.8 或 16 整除(视 处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户.假设当某个客户请求一个 43 字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节.48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片.外部碎片的产生: 频繁的分配与回收物理页面会导致大量的.连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片.假 设

c语言 变量的存储类别以及对应的内存分配?

<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程序运行期间由系统分配固定的存储空间的方式(<strong>程序开始执行时分配,在程序完毕时释放,在程序过程中它们占据国定的存储单元,而不是动态分配和释放</strong>).而动态存储方式在运行期间根据需要进行动态存储方式(<strong>在程序过程中申请和释放的一些空间&

内存分配与内存管理的一些理解

内存分配方式与内存分配算法 内存分配方式有两种,连续内存分配方式和离散内存分配方式.不同的分配方式又有不同的分配算法. 内存分配算法,其实就是:有一大块空闲的资源,如何合理地分配资源?内存分配的思想可以用到很多其他的领域. ①连续内存分配方式 1)固定分区分配 将内存划分成若干个固定大小的块.将程序装入块中即可.内存划分成各个块之后,块大小不再改变.当然,划分块的方式有:所有的块大小相等:划分的块大小不相等. 这种方式,在实际的内存分配之前,就已经知道了所有的内存块大小了. 2)动态分区分配 需