CSAPP malloc lab

整体的设计:使用分离存储的方案,维护一个存储空闲链表的数组free_block_list,每个大小类一个空闲链表,根据2的幂来划分大小,块的设计采用书本上介绍的显示空闲链表的方案。

当可供使用的空间不够时,就会扩展堆。在extend_heap中会增加堆顶的大小,并将新的空闲块挂载到free_block_list上。为了减少内存碎片,会根据新申请的块的前一个块是否空闲来决定是否与其合并。

void *extend_heap(size_t size)
{
    void *ptr;
    // align
    size = ALIGN(size);
    // 增加堆的大小
    if ((ptr = mem_sbrk(size)) == (void *)-1)
        return NULL;

    // 初始化新申请的空闲块
    PUT(HDRP(ptr), PACK(size, 0));
    PUT(FTRP(ptr), PACK(size, 0));
    /* 注意这个块是堆的结尾,所以还要设置一下结尾 */
    PUT(HDRP(NEXT_BLKP(ptr)), PACK(0, 1));
    // 将新申请的空闲块挂到free_block_list上
    insert_node(ptr, size);
    // 合并空闲块
    return merge_free_block(ptr);
}

insert_node实现了将一个空闲块插入到free_block_list的操作,free_block_list中一共有16条链表,下标由0到15升序排列,free_block_list中的元素指向队列的队尾
。将ptr插入block_free_list,链表从大到小排序,在insert_node中逆序遍历链表查找到对应的位置,将空闲块插入。需要注意的是,当链表为空时free_block_list中对应的元素为NULL。

void insert_node(void *ptr, size_t size)
{
    int idx = 0;
    void *next_node = NULL;
    void *pre_node = NULL;

    // 找到相应的桶
    for (;(idx < FREE_LIST_LENGTH - 1) && (size > 1); size >>= 1)
        idx++;
    next_node = free_block_list[idx];

    // next_node为pre_node的前一个结点
    for (; (next_node != NULL) && (size > GET_SIZE(HDRP(next_node))); next_node = GET_PRED_NODE(next_node))
        pre_node = next_node;

    if (next_node != NULL && pre_node != NULL) {    // case 1
        ASSIGN(GET_PRED_ADDR(ptr), next_node);
        ASSIGN(GET_NEXT_ADDR(next_node), ptr);
        ASSIGN(GET_NEXT_ADDR(ptr), pre_node);
        ASSIGN(GET_PRED_ADDR(pre_node), ptr);
    }
    else if (next_node != NULL && pre_node ==
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
malloclab是CSAPP(Computer Systems: A Programmer's Perspective)教材中的一个实验项目,旨在帮助学生了解内存管理和动态内存分配的细节。 实验的主要任务是实现一个简单的动态内存分配器。这个内存分配器需要提供malloc、free和realloc函数的功能,来动态管理内存。实验中提供了一个基本的代码框架,学生需要在这个框架上完成具体的实现。 整个实验可以分为三个部分:分配器的初始化、分配和释放内存的处理。 在初始化部分,学生需要定义一个初始的堆,为其分配一块内存,并根据实验要求设置好堆的初始状态。 在分配内存的部分,学生需要实现malloc函数。这个函数接收一个参数(需要分配的字节数)并返回指向分配内存的指针。学生需要根据实验要求分配内存,并保证分配的内存块满足对齐和避免碎片化的要求。 在释放内存的部分,学生需要实现free函数。这个函数接收一个参数(指向待释放内存块的指针)并将该内存块标记为可用。学生需要根据实验要求处理不同的情况,比如释放合并相邻的空闲块。 此外,实验还有一些额外的要求,如实现realloc函数,处理内存使用情况的统计等。 通过完成malloclab实验,学生可以深入了解内存管理和动态内存分配的工作原理。这个实验还提供了一个实践机会,让学生亲自动手实现一个简单的内存分配器,从而更好地理解和掌握相关的概念和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值