Linux Mini CRT堆疊管理的實現解析

2021-07-15 07:45:34 字數 1299 閱讀 5487

程式在執行過程中,對於堆記憶體的申請和釋放主要是靠malloc()

和free()

兩個函式實現,當然堆記憶體的管理方式有很多,在不同的作業系統平台上有不同的實現,在遵循minicrt

(c執行時庫)的原則下,我們將mini

crt堆的實現歸納為以下幾條:

1.實現乙個以空閒鍊錶演算法為基礎的堆空間分配演算法。

2.堆的大小在程式執行時,根據需要會自動向後拓展,使用brk()

函式將堆的結束位址向後調整,調整之後的空間作為堆空間;

下面是程式設計師的自我修養一書中演算法的原始碼部分:

從上面的**我們可以看出:

1.對於每乙個堆空閒塊都有16位元組大小的heap_header的結構體來記錄,這個結構體中含有三個成員:type(用來記錄該塊空間是否被利用),next(下乙個空閒塊的位址),prev(上乙個空閒塊的位址),以及當前空閒塊的大小;

2.(void *)brk(0)的呼叫 是為了獲取program break的位址(關於這一點還有待**),目前暫時將它理解為向作業系統獲取可分配空間的起始位址,將從起始位址開始的30m空間劃分成程式的堆;

3.在malloc函式中,分配過程分以下幾個步驟:

a.首先找到第乙個空閒塊

b.將這個空閒塊的大小在區間(size+16,size+32)之間,則說明這塊空閒塊是最佳匹配的,否則繼續查詢;

c.如果在步驟b中沒有找到最佳匹配,而堆中有一塊足夠的空間來分配就要將它進行切割,然後return addr_add(header,header_size)返回除了頭部的空間的位址;然後我們看到next-size大小始終是初始整個對空間的大小減去每次malloc(unsiged size)中size的大小,也就是說(剩下的空間包括所有heap_header的大小)(個人覺得不大好),對於已分配的區塊,其大小為header->size=size+header_size;

個人覺得這個演算法太簡陋!!!!!

堆 棧和堆疊

要點 堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結 構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式...

堆,棧,堆疊的區別

乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...

佇列 堆 棧 堆疊的區別?

佇列是先進先出 就像一條路,有乙個入口和乙個出口,先進去的就可以先出去。而棧就像乙個箱子,後放的在上邊,所以後進先出。程序中每個執行緒都有自己的堆疊,這是一段執行緒建立時保留下的位址區域。我們的 棧記憶體 即在此。至於 堆 記憶體,我個人認為在未用new定義時,堆應該就是未 保留 未 提交 的自由空...