2012-02-07 120 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