ptmalloc堆內存管理機制(主要討論Linux x86下32位系統)

  1. bin(chunk容器)

ptmalloc將相似大小的 chunk 用雙向鏈表鏈接起來,這樣的一個鏈表被稱為一個 bin。 Ptmalloc 一共維護了 128 個 bin,并使用一個數組來存儲這些 bin,這個數組被成為bin數組。

bin數組結構如下:
在這里插入圖片描述
在32位平臺下,bin[0] 和 bin[127] 是不存在的,因為最小的 chunk 為 16B, small bin 一共 62 個, large bin 一共 63 個,算上 bin[1] 加起來一共 128 個 bin。

其中 small bin 可以看成是公差為8的等差數列,其相鄰兩個 bin 的 chunk 的大小相差8B,如上圖所示。large bin 的每個 bin 中的 chunk 大小不是一個固定的等差數列,而是分成六組,每組 bin 是一個固定公差的等差數列,每組的 bin 數量依次為 32、 16、 8、 4、 2、 1,公差依次為 64B、 512B、4096B、32768B、 262144B 等。
正是基于 bin 數組的這種關系,當用戶給出一個需要申請的空間大小,ptmalloc 會很容易的確定改大小空間在哪個 bin 里。


fast bin:

  • 不大于 max_fast(默認值為 64B)的 chunk 被釋放后,首先會被放到 fast bin 中, fast bin 中的 chunk 并不改變它的使用標志 P。 這樣也就無法將它們合并, 當需要給用戶分配的 chunk 小于或等于 max_fast 時, ptmalloc 首先會在 fast bin 中查找相應的空閑塊,然后才會去查找 bin 中的空閑 chunk。在某個特定的時候(在內存釋放合并 top chunk 時,如果合并后的 chunk 的大小大于 FASTBIN_CONSOLIDATION_THRESHOLD(默認64KB), 會觸發進行 fast bins 的合并操作),ptmalloc會遍歷 fast bin中的 chunk,18將相鄰的空閑 chunk 進行合并, 并將合并后的 chunk 加入 unsorted bin 中,然后再將 usorted bin 里的 chunk 加入 bins 中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385286.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385286.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385286.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線程屬性的修改

(1)線程屬性 Linux下線程的屬性是可以根據實際項目需要,進行設置,之前我們討論的線程都是采用線程的默認屬性,默認屬性已經可以解決絕大多數開發時遇到的問題。如我們對程序的性能提出更高的要求那么需要設置線程屬性…

NPTL(Native POSIX Thread Library)

1.NPTL(Native POSIX Thread Library)為POSIX標準線程庫,查看當前Linux系統的pthread庫(線程庫)版本的命令為:getconf GNU_LIBPTHREAD_VERSION。 [rootlocalhost 01_pthread_test]# getconf GNU_LIBPTHREA…

線程使用注意事項

1.主線程退出其他線程不退出,主線程應調用pthread_exit; 2.避免僵尸線程:pthread_join、pthread_detach、pthread_create指定分離屬性。被join線程可能在join函數返回前就釋放完自己的所有內存資源,所以不應當返回被回收線程棧中…

線程同步的概念

所謂同步,即同時起步,協調一致。不同的對象,對“同步”的理解方式略有不同。如,設備同步,是指在兩個設備之間規定一個共同的時間參考;數據庫同步,是指讓兩個或多個數據庫內容保持一致&#xff0…

互斥量(mutex)

Linux中提供一把互斥鎖mutex(也稱之為互斥量)。每個線程在對資源操作前都嘗試先加鎖,成功加鎖才能操作,操作結束解鎖。資源還是共享的,線程間也還是競爭的,但通過“鎖”就將資源的訪問變成互斥操作&#xf…

洗牌算法

參考資料: 1. 洗牌算法匯總以及測試洗牌程序的正確性 2. 三種洗牌算法shuffle

Bloom Filter算法

一、概念 Bloom Filter的中文翻譯叫做布隆過濾器,是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法,缺點是有一定的誤…

237. 刪除鏈表中的節點

請編寫一個函數,使其可以刪除某個鏈表中給定的(非末尾)節點,你將只被給定要求被刪除的節點。 現有一個鏈表 -- head [4,5,1,9],它可以表示為: 示例 1: 輸入: head [4,5,1,9], node 5 輸出: [4,1,9] 解釋: 給定你鏈表…

151. 翻轉字符串里的單詞

輸入: " hello world! " 輸出: "world! hello" 解釋: 輸入字符串可以在前面或者后面包含多余的空格,但是反轉后的字符不能包括。 示例 3: 輸入: "a good example" 輸出: "example good a" 解釋: 如果兩個單…

進程間同步(互斥量、信號量)

進程間同步可以使用互斥量mutex(互斥鎖)、信號量和文件鎖。 進程間同步使用信號量: int sem_init(sem_t *sem, int pshared, unsigned int value); 用于進程間同步此時第二個參數不能取0了,取非0值用于進程間同步,一…

1059 Prime Factors(25 分)

Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N p?1???k?1????p?2???k?2?????p?m???k?m????. Input Specification: Each input file contains one test case which gives a…

STL源碼剖析

1. 當vector的內存用完了,它是如何動態擴展內存的?它是怎么釋放內存的?用clear可以釋放掉內存嗎?是不是線程安全的? vector內存用完了,會以當前size大小重新申請2* size的內存,然后把原來的元素…

C++ 內存管理機制

內存分配方式 簡介 在C中,內存分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。 棧:在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存…

哲學家用餐模型

分析: 為了避免死鎖,做了如下規定:每個哲學家先拿自己左手邊的筷子,然后再去拿右手邊的筷子,如果不能同時得到兩支筷子,則該哲學家放下手中已有的筷子。這種規定依然會因為振蕩而產生死鎖,例如…

【C++ Primer | 16】std::move和std::forward、完美轉發

右值引用應該是C11引入的一個非常重要的技術,因為它是移動語義(Move semantics)與完美轉發(Perfect forwarding)的基石: 移動語義:將內存的所有權從一個對象轉移到另外一個對象,高效…

循環引用

1. 測試代碼 #include <iostream> #include <memory> using namespace std;class B; class A { public:shared_ptr<B> pb;~A() { cout << "kill A\n";} };class B { public:shared_ptr<A> pa;~B() { cout << "kill B\n&q…

8. 字符串轉換整數 (atoi)

請你來實現一個 atoi 函數&#xff0c;使其能將字符串轉換成整數。 首先&#xff0c;該函數會根據需要丟棄無用的開頭空格字符&#xff0c;直到尋找到第一個非空格的字符為止。 當我們尋找到的第一個非空字符為正或者負號時&#xff0c;則將該符號與之后面盡可能多的連續數字組…

【C++ Primer | 16】容器適配器全特化、偏特化

上面對模板的特化進行了總結。那模板的偏特化呢&#xff1f;所謂的偏特化是指提供另一份模板定義式&#xff0c;而其本身仍為模板&#xff1b;也就是說&#xff0c;針對模板參數更進一步的條件限制所設計出來的一個特化版本。這種偏特化的應用在STL中是隨處可見的。比如 1.測試…

select、poll、epoll優缺點

select的缺點&#xff1a; 單個進程能夠監視的文件描述符的數量存在最大限制&#xff0c;通常是1024&#xff0c;當然可以更改數量&#xff0c;但由于select采用輪詢的方式掃描文件描述符&#xff0c;文件描述符數量越多&#xff0c;性能越差&#xff1b;內核/用戶空間內存拷貝…

vector源碼剖析

一、vector定義摘要&#xff1a; template <class T, class Alloc alloc> class vector { public:typedef T value_type;typedef value_type* pointer;typedef const value_type* const_pointer;typedef value_type* iterator;typ…