CSAPP Lab07——Malloc Lab完成思路

完整代码见:CSAPP/malloclab-handout at main · SnowLegend-star/CSAPP (github.com)

Malloc Lab

按照惯例,我先是上来就把mm.c编译了一番,结果产生如下报错。搜索过后看样子应该是编译器的版本不匹配,得建立条软链接。

经过多番尝试,最后得到正确的链接形式是

“ln -s /usr/include/x86_64-linux-gnu/asm /usr/include/asm”

 

隐式空闲链表

这方法就是把书上的那几个函数搬过来就行,唯一需要自己动手的是realloc()函数。但是书上的那一大块宏定义属实是看得我两眼发昏。特别是NEXT_BLKP(bp)PREV_BLKP(bp)这两个定义,直接把我绕晕了。

后来仔细分析了一番,发现最根本的原因是我把隐式空闲链表的头/尾块和内存块的头/尾部弄混了,导致每次分析堆内块的4byte/尾部分的时候就会不自觉想到链表的头/尾部分。明白两者的不同之后,接下来分析宏定义等就显得直观明了了。

 在排查bug的时候,没有实现把指针ptr定位到堆块的头部再进行指针操作确实是害苦了我。刚才就是一个困扰我很久的问题。

说完指针定位到头部的问题后,再来谈谈void *mm_realloc(void *ptr, size_t size)的实现框架。

1、ptr=NULL,size≠0:调用malloc()

2、ptr≠NULL,size=0:调用free()

3、ptr≠NULL,size≠0:调整size为asize

       3.1、asize=blocksize_Cur:直接分配

       3.2、asize<blocksize_Cur:调用place()把当前块进行分割

       3.3、asize>blocksize_Cur:当前块的大小不足以分配

3.3.1、next block空闲,且两个块的大小和blocksize_Sum>aszie:对下一块使用place()

3.3.2、next block已分配,或者两块大小和blocksize_Sum<aszie:调用find_fit()来寻找一个全新的块进行分配,而不考虑当前块和next block

       3.3.2.1、find_fit()找到了合适的块:调用place()进行分配

3.3.2.2、find_fit()未找到合适的块:先用extend_heap()来申请新的堆空间,再调用place(),最后把原来块的内容拷贝到新块里面,释放原来块的空间。

 

 

 最后得到的测试结果如图。

 

分离空闲链表

对于显式空闲链表,判断节点bp的前驱是否是头结点相当简单,如下

但是对于分离空闲链表来说,就显得比较繁琐了。按照上面的思路,我们得先用一个大循环来遍历24条链表的各个头结点,然后再用上述式子。不如把这个循环遍历做成一个单独的函数,以此来判断前驱是否头结点的问题。

if(isSegList(pred_ptr)){    //如果前驱是头结点

汗流浃背了,代码出了个bug。 

 

然后是调试环节。

我先是一直在那输入“gdb mm”,结果代码在gdb模式下run起来都有问题,让我心生怀疑可能是调试错了文件,最后才发现pdf上写着调试应该是“gdb mdriver”,白忙活一场。由于默认调试的执行文件是“short1-bal.rep”,想要调试其他文件就得改config.h,但是我发现无论怎么修改config.h,都会报下面的错误。这也是浪费最多时间的一部分。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TB作品】msp430g2553,读取SHT31,读取gy-30,显示到lcd12864,温度湿度光强

功能 msp430g2553&#xff0c;读取SHT31&#xff0c;读取gy-30&#xff0c;显示到lcd12864 硬件 /* 12864液晶串行显示测试程序P1.4模拟SID&#xff08;接第5脚&#xff09;&#xff0c;P1.5模拟SCLK&#xff08;接第6脚&#xff09;4脚&#xff08;CS信号&#xff09;接高…

【数据结构】链式二叉树详解

个人主页~ 链式二叉树基本内容~ 链式二叉树详解 1、通过前序遍历的数组来构建二叉树2、二叉树的销毁3、二叉树节点个数4、二叉树叶子节点个数5、二叉树第k层节点个数6、二叉树查找7、前序遍历8、中序遍历9、后序遍历10、层序遍历与检查二叉树是否为完全二叉树Queue.hQueue.c层序…

WordPress子比内容同步插件

1.支持分类替换 将主站同步过来的文章分类进行替换 2.支持本地化文章图片 &#xff08;使用储存桶可能会导致无法保存图片&#xff09; 3.支持自定义文章作者&#xff08;选择多个作者则同步到的文章作者将会随机分配&#xff09; 4.支持将同步过来的文章自定义文章状态&…

Java | Leetcode Java题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution {public int longestConsecutive(int[] nums) {Set<Integer> num_set new HashSet<Integer>();for (int num : nums) {num_set.add(num);}int longestStreak 0;for (int num : num_set) {if (!num_set.contai…

乡村振兴与文化传承:挖掘乡村历史文化资源,传承乡村优秀传统,打造具有地方特色的美丽乡村文化品牌

目录 一、引言 二、乡村历史文化资源的挖掘与保护 &#xff08;一&#xff09;乡村历史文化资源的内涵 &#xff08;二&#xff09;乡村历史文化资源的挖掘 &#xff08;三&#xff09;乡村历史文化资源的保护 三、乡村优秀传统的传承与创新 &#xff08;一&#xff09;…

4.基础纹理

纹理的目的&#xff1a;使用一张图片来控制模型的外观纹理映射技术&#xff1a;把一张图“黏”在模型表面&#xff0c;逐纹素&#xff08;与像素不同&#xff09;地控制模型颜色通常在建模软件中利用纹理展开技术实现&#xff0c;把纹理映射坐标存储在每个顶点上纹理映射坐标&a…

php--无回显情况下的命令执行

免责声明:本文仅做技术交流与学习... 目录 绕过模版: 1. 写入文件、二次返回: 2. DNS信道: 3.http信道: 4.反弹shell信道 -->公网IP 5.延时 sleep 3 建立通道(信道) --数据传输的路径 shell_exec 与 system 相比&#xff0c;shell_exec没有回显结果. 绕过模版:…

Java中的Instant

在Java中&#xff0c;Instant 是 java.time 包中的一个类&#xff0c;用于表示时间轴上的一个瞬时点&#xff0c;通常以纳秒精度表示。它通常用于表示机器可读的时间戳&#xff0c;而不是人类可读的时间表示&#xff08;如日期和时间&#xff09;。 Instant 主要用于时间计算和…

数学基础——微积分在机器/深度学习上的应用

目录 微分学 导数 偏导数 梯度 梯度下降算法 反向传播算法 自动求导 计算图 正则化与过拟合 L1正则化 L2正则化 Dropout正则化 拉格朗日对偶问题 拉格朗日乘数法 凸优化 对偶问题 KKT条件 Slater条件 积分学 笔记内容 微积分是17世纪后半叶发展起来的数…

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 买卖股票的最佳时机含冷冻期(难度⭐⭐)(79)

1. 题目解析 题目链接&#xff1a;309. 买卖股票的最佳时机含冷冻期 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 二、算法思路 1. 状态表示 dp[i][0]&#xff1a;表示第 i 天结束后&#xff0c;处于「买入」状态…

【计算机毕业设计】331基于微信小程序的家庭财务管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

freebsd 14.0 golang qt 修改源码并正确的安装方法

看了网的方法&#xff0c;包括官方的&#xff0c;没有一种方法能安装成功&#xff0c;这是我通过摸索安装成功的方法&#xff1a; 1. 安装好golang qt5:pkg install liteide qt5 2.qt go源码enn.go修改源码为&#xff1a; path : filepath.Join(QT_DIR(), "" /*QT…

音视频开发15 FFmpeg FLV封装格式分析

FLV(Flash Video)简介 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式&#xff0c;由于其封装后的⾳视频⽂件体积⼩、封装简单等特点&#xff0c;⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤ FLV格式封装的⽂件后缀为.flv。 FLV封装格式的组成 FLV封装…

AI学习指南机器学习篇-逻辑回归算法简介

AI学习指南机器学习篇-逻辑回归算法简介 在机器学习领域&#xff0c;逻辑回归是一种常用的分类算法&#xff0c;它可以用于预测一个事件发生的概率。逻辑回归不同于线性回归&#xff0c;它的输出是一个概率&#xff0c;而不是一个连续的数值。本文将介绍逻辑回归的基本概念&am…

屏幕适配方案

百分比布局 高度固定&#xff0c;宽度使用百分比&#xff0c;通常使用max-width/min-width控制尺寸范围过大或者过小。但是屏幕尺寸相对于设计稿跨度过大的话&#xff0c;会拉伸明显。常用在pc端适配。 flex布局 屏幕尺寸相对于设计稿跨度过大的话&#xff0c;会拉伸明显。常用…

【linux软件基础知识】执行进程切换和switch_to

执行进程切换 进程切换可能只发生在精心定义的点: schedule()函数。这里,我们仅关注内核如何执行一个进程切换,从本质上说,每个进程切换由两步组成, 切换页全局目录以安装一个新的地址空间,切换内核态堆栈和硬件上下文,因为硬件上下文提供了内核执行新进程所需要的所有信息…

牛客BM22 比较版本号【中等 字符串 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/2b317e02f14247a49ffdbdba315459e7 思路 字符串用.分割为数组&#xff0c;然后依次比较大小Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修…

Linux常用命令整理

一、文件和目录操作 1. ls 列出目录内容选项&#xff1a;-l&#xff08;详细列表&#xff09;、-a&#xff08;包括隐藏文件&#xff09;、-h&#xff08;以人类可读的格式显示文件大小&#xff09; 2. cd 改变当前目录用法&#xff1a;cd 目录名 3. pwd 显示当前工作目录…

lvs安装文档

目录 1. 检测内核是否支持了lvs 2. 安装依赖 3. 安装ipvsadm 1. 检测内核是否支持了lvs Centos6.5的内核已经支持了lvs&#xff0c;所有只需要安装lvs的管理工具ipvsadm即可&#xff1b; 检查linux内核是否集成lvs模块&#xff1a;modprobe -l | grep ipvs 开启路由转发功…

欧洲版“OpenAI”——Mistral 举办的 AI 大模型马拉松

近期&#xff0c;法国的 Mistral AI 举办了一场别开生面的 AI 大模型马拉松。要知道&#xff0c;Mistral 可是法国对 OpenAI 的有力回应&#xff0c;而且其技术还是完全开源的呢&#xff01;这场在巴黎举行的黑客马拉松&#xff0c;规模空前盛大&#xff0c;竟然有超过 1000 名…