malloc原理和模拟实现

malloc原理malloc它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足 用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传 给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。...
摘要由CSDN通过智能技术生成

malloc原理

malloc它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足 用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传 给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片 段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检 查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。

查询链表的方法:

 break指针

Linux维护一个break指针,这个指针指向堆空间的某个地址。从堆起始地址到break之间的地址空间为映射好的,可以供进程访问;而从break往上,是未映射的地址空间,如果访问这段空间则程序会报错。我们用malloc进行内存分配就是从break往上进行的。

  • First fit:从头开始,使用第一个数据区大小大于要求size的块所谓此次分配的块。首次适配有更好的运行效率。
  • Best fit:从头开始,遍历所有块,使用数据区大小大于size且差值最小的块作为此次分配的块。最佳适配具有较高的内存使用率。
int brk(void *addr);
void *sbrk(intptr_t increment);

brk将break指针直接设置为某个地址;
而sbrk将break从当前位置移动increment所指定的增量,如果将increment设置为0,则可以获得当前break的地址。

malloc实现: 

void* malloc(unsigned size);
在堆内存中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度。

#include <sys/types.h>
#include <unistd.h>

typedef struct s_block *t_block;

struct s_block {
    size_t size;          // 数据区大小 
    t_block next;         // 指向下个块的指针 
    int free;             // 是否是空闲块 
    int padding;          // 填充4字节,保证meta块长度为8的倍数 
    char data[1]          // 这是一个虚拟字段,表示数据块的第一个字节,长度不应计入meta 
};

//首次适配
t_block find_block(t_block *last, size_t size) {
    t_block b = first_block;
    while(b && !(b->free && b->size >= size)) {
        *last = b;
        b = b->next;
    }
    return b;
}

//如果现有bl
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值