歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 挖掘Linux操作系統堆內存釋放的奧秘

挖掘Linux操作系統堆內存釋放的奧秘

日期:2017/2/27 14:16:44   编辑:更多Linux

  今天上午得到了一些高手指點,終於弄懂了堆內存釋放的奧秘,特總結出來與大家分享!

  Linux用戶進程是如何釋放內存的

  Linux進程使用內存的基本流程:  

  從圖中我們可以看出,進程的堆,並不是直接建立在Linux的內核的內存分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的動態內存分配策略上),堆的管理是由glibc進行的。所以我們調用free對malloc得到的內存進行釋放的時候,並不是直接釋放給操作系統,而是還給了glibc的堆管理實體,而glibc會在把實際的物理內存歸還給系統的策略上做一些優化,以便優化用戶任務的動態內存分配過程。

  那麼glibc的堆管理器在什麼時候才把物理內存歸還給系統呢?

  它會從堆的最大線性地址開始,從後向前計算用戶任務當前有多少空閒的堆內存(直到碰到使用中的堆內存地址為止),比如在該圖中:

  它會認為有2048k的可釋放內存,只有在該值大於某個特定的threshhold時(2.3.6上為64k),它才會把這些內存歸還給系統。而在中間的“未使用”內存是不會歸還給系統的,所以系統也不可能再利用這塊物理內存頁(我們假設系統沒有swap區和swap文件),也就是說系統的內存會為此減少,除非在它之前的堆內存都用free進行釋放以後,glibc的堆管理器才有可能(只是有可能)把該段內存歸還給系統。

  由此,我們在使用malloc/free時應該小心,特別是在初始化時分配了好多內存,但是在這之後卻再也不需要這麼多的內存了,而這塊內存又沒有達到threshhold值或者在堆的最高線性地址處有某塊內存沒有釋放,但是它前面的所有堆內存都釋放了;這種情況下,用戶任務將會浪費一些物理內存,這在資源比較緊張的嵌入式系統中是不可容忍的。




Copyright © Linux教程網 All Rights Reserved