日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆概述(一)

發(fā)布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆概述(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在程序運行過程中,堆可以提供動態(tài)分配的內(nèi)存,允許程序申請大小未知的內(nèi)存。堆其實就是程序虛擬地址空間的一塊連續(xù)的線性區(qū)域,它由低地址向高地址方向增長。我們一般稱管理堆的那部分程序為堆管理器。

堆管理器處于用戶程序與內(nèi)核中間,主要做以下工作

1.響應(yīng)用戶的申請內(nèi)存請求,向操作系統(tǒng)申請內(nèi)存,然后將其返回給用戶程序。同時,為了保持內(nèi)存管理的高效性,內(nèi)核一般都會預(yù)先分配很大的一塊連續(xù)的內(nèi)存,然后讓堆管理器通過某種算法管理這塊內(nèi)存。只有當(dāng)出現(xiàn)了堆空間不足的情況,堆管理器才會再次與操作系統(tǒng)進(jìn)行交互。

⒉管理用戶所釋放的內(nèi)存。一般來說,用戶釋放的內(nèi)存并不是直接返還給操作系統(tǒng)的,而是由堆管理器進(jìn)行管理。這些釋放的內(nèi)存可以來響應(yīng)用戶新申請的內(nèi)存的請求。

Linux 中早期的堆分配與回收由Doug Lea實現(xiàn),但它在并行處理多個線程時,會共享進(jìn)程的堆內(nèi)存空間。因此,為了安全性,一個線程使用堆時,會進(jìn)行加鎖。然而,與此同時,加鎖會導(dǎo)致其它線程無法使用堆,降低了內(nèi)存分配和回收的高效性。同時,如果在多線程使用時,沒能正確控制,也可能影響內(nèi)存分配和回收的正確性。Wolfram Gloger在Doug Lea的基礎(chǔ)上進(jìn)行改進(jìn)使其可以支持多線程,這個堆分配器就是ptmalloc。在glibc-2.3.x.之后, glibc中集成了ptmalloc2。

堆相關(guān)的數(shù)據(jù)結(jié)構(gòu)

堆的操作相當(dāng)?shù)膹?fù)雜,那么在glibc內(nèi)部必然也有精心設(shè)計的數(shù)據(jù)結(jié)構(gòu)來管理它。與堆相應(yīng)的數(shù)據(jù)結(jié)構(gòu)主要分為宏觀結(jié)構(gòu),包含堆的宏觀信息,可以通過這些數(shù)據(jù)結(jié)構(gòu)索引堆的基本信息。微觀結(jié)構(gòu),用于具體處理堆的分配與回收中的內(nèi)存塊。

該結(jié)構(gòu)體定義了有6個變量

微觀結(jié)構(gòu) malloc chunk

fd指向下一個元素

bk執(zhí)向前一個元素

一個chunk 在內(nèi)存中的狀態(tài)

這里 上一個chunk加上size 就能找到下一個chunk的位置

當(dāng)該chunk被釋放的時候

當(dāng)一個chunk處于使用狀態(tài)時,它的下一個chunk的prev_size域無效,所以下一個chunk的該部分也可以被當(dāng)前chunk使用。這就是chunk中的空間復(fù)用。

總結(jié)

以上是生活随笔為你收集整理的堆概述(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。