高级农民
- 积分
- 1513
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-12-2
- 最后登录
- 1970-1-1
|
本帖最后由 lalxyy 于 2020-12-13 13:33 编辑
这个事情有点久远了,和现在上课的情况应该有点出入。这个事除了因为作业很难,重要的原因还是自己大意了。
上15-513(用CSAPP做教材)这门课的时候有一个作业是自己设计栈内存分配并实现malloc,叫做malloc lab. 这个作业分成两个阶段,评估内存占用率和运行时间时采用不同的指标。第一个阶段的性能要求非常容易达到,按照课上ppt的要求去写代码就能过。当时是大学毕业后的暑假,写了两三天代码过了第一个checkpoint之后误以为malloc lab不过如此,就把作业放下了,一直到final due的前五天才慢慢开始提升自己代码的性能。我本以为非常简单,final test吃了几个零蛋之后傻眼了。
malloc lab的精妙之处就在于除非你动手实现自己的方案,很难靠思考推理出来最终的内存占用情况,因为测试样例实在是太庞大,而且malloc lab需要同时支持模拟32 bit和64 bit的内存分配,还需要注意计算过程中是否有bit溢出了。当时我最有信心的方案是先把内存分配成较大的单位(比如0x100 bytes),在这些较大的内存块上保留head和tail元信息,然后再将大内存块拆分给小内存。但是实际测试的时候发现要么很难追踪小内存块的占用情况导致内存浪费进而stack overflow,要么使用很多时间在分配小的内存块上导致执行超时,两个问题永远不能同时解决。因为此前摸鱼摸大了,这个方案确定不可行的时候,只有不到三天到final ddl(而且我已经用过late day了),我开始感到一种透心凉的绝望,因为这个作业在513成绩占比非常高,如果按此时零分上交作业,此后513哪怕及格可能都很困难。
那几天基本是不想睡觉也不想吃饭。每天早上睁开眼睛,似乎漂浮的是各种malloc的可能实现方案,并且脑子里面不由自主地分析一个算法需要多长时间实现,预期的性能是多少。预估出来的往往不准,但是当全身心动员起来就为了解决这一个问题的时候,我发现很难让自己冷静下来。为了缓解压力,我开始看一些快手老铁类的视频,就是为了把自己的情绪调动起来,哪怕当时看过一些视频就是嘿嘿一笑就过去了而对于作业没有任何的收获,我都会感到非常满足,能够把自己从一蹶不振的深渊中拉回来。
最后我无意中在很多方案里面尝试了把最初版本的内存分配中的head和tail精简一下,节省这些区域一半的内存使用,最终分数到了98%。那个时候我已经没有兴趣做任何改进了,匆忙写了代码注释,修改了coding style,然后就把代码扔给测试网站了。随之而来的是紧张的心理状态结束之后扎心的胃痛,很久才消失。
|
|