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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ptmalloc内存分配释放

發(fā)布時間:2024/4/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ptmalloc内存分配释放 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

出處

?

分配:

1)獲取分配區(qū)的鎖,為了防止多個線程同時訪問同一個分配區(qū),在進(jìn)行分配之前需要取得分配區(qū)域的鎖。線程先查看線程私有實(shí)例中是否已經(jīng)存在一個分配區(qū),如果存在嘗試對該分配區(qū)加鎖,如果加鎖成功,使用該分配區(qū)分配內(nèi)存,否則,該線程搜索分配區(qū)循環(huán)鏈表試圖獲得一個空閑(沒有加鎖)的分配區(qū)。如果所有的分配區(qū)都已經(jīng)加鎖,那么ptmalloc會開辟一個新的分配區(qū),把該分配區(qū)加入到全局分配區(qū)循環(huán)鏈表和線程的私有實(shí)例中并加鎖,然后使用該分配區(qū)進(jìn)行分配操作。開辟出來的新分配區(qū)一定為非主分配區(qū),因為主分配區(qū)是從父進(jìn)程那里繼承來的。開辟非主分配區(qū)時會調(diào)用mmap()創(chuàng)建一個sub-heap,并設(shè)置好top chunk。

2)將用戶的請求大小轉(zhuǎn)換為實(shí)際需要分配的chunk空間大小。

3)判斷所需分配chunk的大小是否滿足chunk_size <= max_fast (max_fast 默認(rèn)為64B),如果是的話,則轉(zhuǎn)下一步,否則跳到第5步。

4)首先嘗試在fastbins中取一個所需大小的chunk分配給用戶。如果可以找到,則分配結(jié)束。否則轉(zhuǎn)到下一步。

5)判斷所需大小是否處在smallbins中,即判斷chunk_size <512B是否成立。如果chunk大小處在smallbins中,則轉(zhuǎn)下一步,否則轉(zhuǎn)到第6步。

6)根據(jù)所需分配的chunk的大小,找到具體所在的某個small bin,從該bin的尾部摘取一個恰好滿足大小的chunk。若成功,則分配結(jié)束,否則,轉(zhuǎn)到下一步。

7)到了這一步,說明需要分配的是一塊大的內(nèi)存,或者small bins中找不到合適的chunk。于是,ptmalloc首先會遍歷fastbins中的chunk,將相鄰的chunk進(jìn)行合并,并鏈接到unsorted bin中,然后遍歷unsorted bin中的chunk,如果unsorted bin只有一個chunk,并且這個chunk在上次分配時被使用過,并且所需分配的chunk大小屬于small bins,并且chunk的大小大于等于需要分配的大小,這種情況下就直接將該chunk進(jìn)行切割,分配結(jié)束,否則將根據(jù)chunk的空間大小將其放入small bins或是largebins中,遍歷完成后,轉(zhuǎn)入下一步。

8)到了這一步,說明需要分配的是一塊大的內(nèi)存,或者small bins和unsorted? bin中都找不到合適的chunk,并且fastbins和unsorted bin中所有的chunk都清除干凈了。從large bins中按照“smallest-first,best-fit”原則,找一個合適的chunk,從中劃分一塊所需大小的chunk,并將剩下的部分鏈接回到bins中。若操作成功,則分配結(jié)束,否則轉(zhuǎn)到下一步。

9)如果搜索fastbins和bins都沒有找到合適的chunk,那么就需要操作top? chunk來進(jìn)行分配了。判斷top? chunk大小是否滿足所需chunk的大小,如果是,則從top chunk中分出一塊來。否則轉(zhuǎn)到下一步。

10)到了這一步,說明top chunk也不能滿足分配要求,所以,于是就有了兩個選擇: 如果是主分配區(qū),調(diào)用sbrk(),增加top chunk大小;如果是非主分配區(qū),調(diào)用mmap來分配一個新的sub-heap,增加top chunk大小;或者使用mmap()來直接分配。在這里,需要依靠chunk的大小來決定到底使用哪種方法。判斷所需分配的chunk大小是否大于等于mmap分配閾值,如果是的話,則轉(zhuǎn)下一步,調(diào)用mmap分配,否則跳到第12步,增加top chunk 的大小。

11)使用mmap系統(tǒng)調(diào)用為程序的內(nèi)存空間映射一塊chunk_size align 4kB大小的空間。然后將內(nèi)存指針返回給用戶。

12)判斷是否為第一次調(diào)用malloc,若是主分配區(qū),則需要進(jìn)行一次初始化工作,分配一塊大小為(chunk_size? +? 128KB)? align? 4KB大小的空間作為初始的heap。若已經(jīng)初始化過了,主分配區(qū)則調(diào)用sbrk()增加heap空間,分主分配區(qū)則在top chunk中切割出一個chunk,使之滿足分配需求,并將內(nèi)存指針返回給用戶

?

釋放:

1)free()函數(shù)同樣首先需要獲取分配區(qū)的鎖,來保證線程安全。

2)判斷傳入的指針是否為0,如果為0,則什么都不做,直接return。否則轉(zhuǎn)下一步。

3)判斷所需釋放的chunk是否為mmaped? chunk,如果是,則調(diào)用munmap()釋放mmaped? chunk,解除內(nèi)存空間映射,該該空間不再有效。如果開啟了mmap分配閾值的動態(tài)調(diào)整機(jī)制,并且當(dāng)前回收的chunk大小大于mmap分配閾值,將mmap分配閾值設(shè)置為該chunk的大小,將mmap收縮閾值設(shè)定為mmap分配閾值的2倍,釋放完成,否則跳到下一步。

4)判斷chunk的大小和所處的位置,若chunk_size <= max_fast,并且chunk并不位于heap的頂部,也就是說并不與top? chunk相鄰,則轉(zhuǎn)到下一步,否則跳到第6步。(因為與topchunk相鄰的小chunk也和top? chunk進(jìn)行合并,所以這里不僅需要判斷大小,還需要判斷相鄰情況)

5)將chunk放到fastbins中,chunk放入到fastbins中時,并不修改該chunk使用狀態(tài)位P。也不與相鄰的chunk進(jìn)行合并。只是放進(jìn)去,如此而已。這一步做完之后釋放便結(jié)束了,程序從free()函數(shù)中返回。

6)判斷前一個chunk是否處在使用中,如果前一個塊也是空閑塊,則合并。并轉(zhuǎn)下一步。

7)判斷當(dāng)前釋放chunk的下一個塊是否為top? chunk,如果是,則轉(zhuǎn)第9步,否則轉(zhuǎn)下一步。

8)判斷下一個chunk是否處在使用中,如果下一個chunk也是空閑的,則合并,并將合并后的chunk放到unsorted? bin中。注意,這里在合并的過程中,要更新chunk的大小,以反映合并后的chunk的大小。并轉(zhuǎn)到第10步。

9)如果執(zhí)行到這一步,說明釋放了一個與top chunk相鄰的chunk。則無論它有多大,都將它與top chunk合并,并更新top chunk的大小等信息。轉(zhuǎn)下一步。

10)判斷合并后的chunk 的大小是否大于FASTBIN_CONSOLIDATION_THRESHOLD(默認(rèn)64KB),如果是的話,則會觸發(fā)進(jìn)行fastbins的合并操作,fastbins中的chunk將被遍歷,并與相鄰的空閑chunk進(jìn)行合并,合并后的chunk會被放到unsorted bin中。fastbins將變?yōu)榭?#xff0c;操作完成之后轉(zhuǎn)下一步。

11)判斷top chunk的大小是否大于mmap收縮閾值(默認(rèn)為128KB),如果是的話,對于主分配區(qū),則會試圖歸還top? chunk中的一部分給操作系統(tǒng)。但是最先分配的128KB空間是不會歸還的,ptmalloc 會一直管理這部分內(nèi)存,用于響應(yīng)用戶的分配請求;如果為非主分配區(qū),會進(jìn)行sub-heap收縮,將top chunk的一部分返回給操作系統(tǒng),如果top chunk為整個sub-heap,會把整個sub-heap還回給操作系統(tǒng)。做完這一步之后,釋放結(jié)束,從free()函數(shù)退出。可以看出,收縮堆的條件是當(dāng)前free的chunk大小加上前后能合并chunk的大小大于64k,并且要top? chunk的大小要達(dá)到mmap收縮閾值,才有可能收縮堆。

轉(zhuǎn)載于:https://www.cnblogs.com/snip3r/p/10578926.html

總結(jié)

以上是生活随笔為你收集整理的ptmalloc内存分配释放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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