3 回答

TA貢獻1815條經(jīng)驗 獲得超10個贊
簡單地說,malloc和自由工作是這樣的:
malloc提供對進程堆的訪問。堆是C核心庫(通常為libc)中的構(gòu)造,該構(gòu)造允許對象獲取對該進程堆上某些空間的排他訪問。
堆上的每個分配稱為堆單元。它通常由一個包含有關(guān)單元大小的信息的頭以及指向下一個堆單元的指針組成。這有效地使堆成為鏈表。
當啟動一個進程時,堆包含一個單元,該單元包含啟動時分配的所有堆空間。該單元格存在于堆的空閑列表中。
當一個調(diào)用malloc時,內(nèi)存將從大堆單元中獲取,這由malloc返回。其余部分組成一個新的堆單元,該堆單元由其余所有內(nèi)存組成。
當一個人釋放內(nèi)存時,堆單元將添加到堆的空閑列表的末尾。隨后的malloc在空閑列表中查找合適大小的單元。
可以預(yù)見的是,堆可能會碎片化,并且堆管理器可能會不時嘗試合并相鄰的堆單元。
當空閑列表上沒有剩余內(nèi)存可用于所需分配時,malloc調(diào)用brk或sbrk,這是系統(tǒng)調(diào)用,要求操作系統(tǒng)提供更多內(nèi)存頁。
現(xiàn)在進行了一些修改以優(yōu)化堆操作。
對于較大的內(nèi)存分配(通常> 512字節(jié)),堆管理器可能會直接進入OS并分配完整的內(nèi)存頁面。
堆可以指定最小分配大小,以防止發(fā)生大量碎片。
堆也可以將自身劃分為bin,一個用于較小的分配,另一個用于較大的分配,以更快地進行較大的分配。
還有一些優(yōu)化多線程堆分配的巧妙機制。
- 3 回答
- 0 關(guān)注
- 496 瀏覽
添加回答
舉報