堆概述(一)
堆
在程序運行過程中,堆可以提供動態分配的內存,允許程序申請大小未知的內存。堆其實就是程序虛擬地址空間的一塊連續的線性區域,它由低地址向高地址方向增長。我們一般稱管理堆的那部分程序為堆管理器。
堆管理器處于用戶程序與內核中間,主要做以下工作
1.響應用戶的申請內存請求,向操作系統申請內存,然后將其返回給用戶程序。同時,為了保持內存管理的高效性,內核一般都會預先分配很大的一塊連續的內存,然后讓堆管理器通過某種算法管理這塊內存。只有當出現了堆空間不足的情況,堆管理器才會再次與操作系統進行交互。
⒉管理用戶所釋放的內存。一般來說,用戶釋放的內存并不是直接返還給操作系統的,而是由堆管理器進行管理。這些釋放的內存可以來響應用戶新申請的內存的請求。
Linux 中早期的堆分配與回收由Doug Lea實現,但它在并行處理多個線程時,會共享進程的堆內存空間。因此,為了安全性,一個線程使用堆時,會進行加鎖。然而,與此同時,加鎖會導致其它線程無法使用堆,降低了內存分配和回收的高效性。同時,如果在多線程使用時,沒能正確控制,也可能影響內存分配和回收的正確性。Wolfram Gloger在Doug Lea的基礎上進行改進使其可以支持多線程,這個堆分配器就是ptmalloc。在glibc-2.3.x.之后, glibc中集成了ptmalloc2。
堆相關的數據結構
堆的操作相當的復雜,那么在glibc內部必然也有精心設計的數據結構來管理它。與堆相應的數據結構主要分為宏觀結構,包含堆的宏觀信息,可以通過這些數據結構索引堆的基本信息。微觀結構,用于具體處理堆的分配與回收中的內存塊。
該結構體定義了有6個變量
微觀結構 malloc chunk
fd指向下一個元素
bk執向前一個元素
 
一個chunk 在內存中的狀態
這里 上一個chunk加上size 就能找到下一個chunk的位置
當該chunk被釋放的時候
當一個chunk處于使用狀態時,它的下一個chunk的prev_size域無效,所以下一個chunk的該部分也可以被當前chunk使用。這就是chunk中的空間復用。
總結
                            
                        - 上一篇: outguess秘钥加密--[BJDCT
 - 下一篇: CRC32爆破解密脚本工具(三)