CSAPP: Malloc lab

本文档详细介绍了如何使用C语言实现一个动态存储分配器,包括malloc、free、realloc的实现,涉及隐式、显式和分离空闲链表策略,以及首次适配、最佳适配等方法。作者分享了实验过程中的问题解决、优化建议和最终版本的实现思路,如使用segregated free list和best fit策略,并对realloc进行了改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

在该实验中,需要用C语言实现一个动态存储分配器(dynamic storage allocater)。需要实现malloc、free、realloc等功能。当然不仅要正确的实现相关功能也要满足速度效率等要求。

实验准备

  1. 实验材料:
    原始实验包github下载
    原始实验包中测试用的trace不存在,下面下载测试文件的链接:12 traces
    本博主的实现的最终版本mm.c源文件 93/100分

执行make命令时可能出现以下问题
fatal error sys/cdefs.h no such file or directory
致命错误: sys/cdefs.h:没有那个文件或目录
出现此错误是因为在64位Linux操作系统中打算编译出32位的程序,解决方案
如下: sudo apt-get install build-essential libc6-dev libc6-dev-i386

  1. 必要知识:
    《深入理解计算机系统》第二版第9章虚拟存储器的内容需要熟悉。特别是9.9节动态存储器分配中9.9.12节“综合:实现一个简单的分配器”
  2. 存储器实现的必要技术:

    • 针对空闲块的组织方法有以下三种:
      a.隐式空闲链表(implicit free list)
      b.显式空闲链表(explicit free list)
      c.分离空闲链表(segregated free list)

    • 查找空闲块的三个方法:
      a.首次适应(first fit)
      b.最佳适配(best fit)
      c.下一次适配(next fit)

  3. 实验小建议
    a.先最简单的开始实现,也即是书本上的范例隐式空闲链表的实现方法。然后一步步一次实现其他的方法
    以下是我依次实现的其他两个版本
    mm.c 隐式空闲链表+首次适配+原始realloc版
    mm.c 显示空闲链表+首次适配+原始realloc版
    mm.c 分离空闲链表+最佳适配+改进的realloc版

    b.最后的优化需要根据不同的trace进行分析优化

    c.需要用到gdb调试,修改Makefile文件,对于编译命令加入-g字段,并且删除-02优化字段,防止调试时出现怪异问题(i.e 调试时程序不是一行一行顺序 ,而是跳跃的)


最终版本实现的思路

  • 空闲块的组织方法-segregated free list
    segregated free list 中大小类的分类方法如下,并且将该list表放在heap的头部,通过序言块将它与数据隔离。在每一个大小类中,空闲块按照size由大到小排序。
PUT(heap_listp,0);              /*block size list<=32*/
PUT(heap_listp+(1*WSIZE),0);    /*block size list<=64*/
PUT(heap_listp+(2*WSIZE),0);    /*block size list<=128*/
PUT(heap_listp+(3*WSIZE),0);    /*block size list<=256*/
PUT(heap_listp+(4*WSIZE),0);    
malloclabCSAPP(Computer Systems: A Programmer's Perspective)教材中的一个实验项目,旨在帮助学生了解内存管理和动态内存分配的细节。 实验的主要任务是实现一个简单的动态内存分配器。这个内存分配器需要提供malloc、free和realloc函数的功能,来动态管理内存。实验中提供了一个基本的代码框架,学生需要在这个框架上完成具体的实现。 整个实验可以分为三个部分:分配器的初始化、分配和释放内存的处理。 在初始化部分,学生需要定义一个初始的堆,为其分配一块内存,并根据实验要求设置好堆的初始状态。 在分配内存的部分,学生需要实现malloc函数。这个函数接收一个参数(需要分配的字节数)并返回指向分配内存的指针。学生需要根据实验要求分配内存,并保证分配的内存块满足对齐和避免碎片化的要求。 在释放内存的部分,学生需要实现free函数。这个函数接收一个参数(指向待释放内存块的指针)并将该内存块标记为可用。学生需要根据实验要求处理不同的情况,比如释放合并相邻的空闲块。 此外,实验还有一些额外的要求,如实现realloc函数,处理内存使用情况的统计等。 通过完成malloclab实验,学生可以深入了解内存管理和动态内存分配的工作原理。这个实验还提供了一个实践机会,让学生亲自动手实现一个简单的内存分配器,从而更好地理解和掌握相关的概念和技术。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值