您的位置:網站首頁 > 家電維修資料網 > 正文 >
挖掘Linux操作系統堆內存釋放
來源: 日期:2013-10-24 19:26:40 人氣:標簽:
今天上午得到了一些指點,終于弄懂了堆內存釋放的奧秘,特總結出來與大家分享!
Linux用戶進程是如何釋放內存的
Linux進程使用內存的基本流程:
從中我們可以看出,進程的堆,并不是直接建立在Linux的內核的內存分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的動態內存分配策略上),堆的管理是由glibc進行的。所以我們調用free對malloc得到的內存進行釋放的時候,并不是直接釋放給操作系統,而是還給了glibc的堆管理實體,而glibc會在把實際的物理內存歸還給系統的策略上做一些優化,以便優化用戶任務的動態內存分配過程。
那么glibc的堆管理器在什么時候才把物理內存歸還給系統呢?
它會從堆的 大線性地址開始,從后向前計算用戶任務當前有多少空閑的堆內存(直到碰到使用中的堆內存地址為止)。
它會認為有2048k的可釋放內存,只有在該值大于某個特定的threshhold時(2.3.6上為64k),它才會把這些內存歸還給系統。而在中間的“未使用”內存是不會歸還給系統的,所以系統也不可能再利用這塊物理內存頁(我們假設系統沒有swap區和swap文件),也就是說系統的內存會為此減少,除非在它之前的堆內存都用free進行釋放以后,glibc的堆管理器才有可能(只是有可能)把該段內存歸還給系統。
由此,我們在使用malloc/free時應該小心,特別是在初始化時分配了好多內存,但是在這之后卻再也不需要這么多的內存了,而這塊內存又沒有達到threshhold值或者在堆的 高線性地址處有某塊內存沒有釋放,但是它前面的所有堆內存都釋放了;這種情況下,用戶任務將會浪費一些物理內存,這在資源比較緊張的嵌入式系統中是不可容忍的。
【看看這篇文章在百度的收錄情況】
相關文章
- 上一篇: 虛擬內存 手動設置虛擬內存
- 下一篇: 內存的單面與雙面的區別