2012-02-07 153 views
3

如何手动管理mips程序集中的堆,特别是SPIM模拟器?mips内存管理

堆,我发现在使用sbrk系统调用时,从0x10040000开始,例如,

li $t0, 1

li $s0, 9

syscall

sw $t0, ($s0) # 1 located at 0x10040000

是这样,没有一个电话SBRK不能保证你会得到下一个空闲的内存插槽?例如,如果我为单个4字节空间调用sbrk,SPIM可能会分配地址:0x10040000-0x10040003。然而,另一个4字节空间的第二次调用可能与先前的4字节分配无关?因此,需要数据结构来跟踪哪些内存插槽已被分配?最后,内存管理器是否尝试通过确定位于由特定数据结构跟踪的地址之间的空闲空间来减少对sbrk的调用次数?

回答

6

在实际系统上,sbrk返回页面粒度分配。我不确定SPIM模拟器是否可用(微薄的在线文档意味着它将返回任何以字节为单位的粒度)。

通常,sbrk系统调用只是设置“结束堆”指针。所有底层操作系统都知道堆的开始(在程序开始时sbrk开始)以及当前的堆结束指针。该界限中的所有内存都被认为是从程序使用的堆内存(从操作系统的角度来看)。

(注意,你的情况我相信SPIM模拟器取整数撞击由指针,所以隐含所有的内存是连续的。我想休息总是不断增加?)

的“malloc的” API通常建立在sbrk基础上的不仅仅是一个简单的连续的,不断增长的内存区域。一个好的malloc库通常可以让你将内存区域标记为“空闲”(所以它可以用来满足后续的malloc调用)。请注意,操作系统通常不知道这个“免费”。 Malloc会记录是否空闲的内存。一般来说,malloc不能将这个堆的任意区域返回给操作系统,因为从操作系统的角度来看,堆是一个连续的区域。

真正的malloc实现必须处理分配请求和页面大小(普通sbrk只返回页面对齐,页面大小分配的倍数)之间的不匹配。你的模拟器案例没有这个问题,因为sbrk是细粒度的。

请注意,跟踪哪些内存正在使用或不需要内存,所以malloc有一些开销。一些实现旨在将大部分簿记存储在“免费”内存中(从而降低客户的明显成本)。还有很多其他策略可以将malloc与sbrk进行匹配....(在你的情况下,将malloc映射到sbrk,并且只要你没有分配太多的内存就可以释放一个不工作的工作)

这里有一个如何mallocsbrk涉及绘制一些ASCII艺术概述我没有耐心去抄写:http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html