linux使用者程序是如何釋放記憶體的
linux程序使用記憶體的基本流程:
見圖1從圖中我們可以看出,程序的堆,並不是直接建立在linux的核心的記憶體分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的動態記憶體分配策略上),堆的管理是由glibc進行的。
所以我們呼叫free對malloc得到的記憶體進行釋放的時候,並不是直接釋放給作業系統,而是還給了glibc的堆管理實體,而glibc會在把實際的物理記憶體歸還給系統的策略上做一些優化,以便優化使用者任務的動態記憶體分配過程。
那麼glibc的堆管理器在什麼時候才把物理記憶體歸還給系統呢?
它會從堆的最大線性位址開始,從後向前計算使用者任務當前有多少空閒的堆記憶體(直到碰到使用中的堆記憶體位址為止),比如在該圖中,
見圖2它會認為有2048k的可釋放記憶體,只有在該值大於某個特定的threshhold時(2.3.6上為64k),它才會把這些記憶體歸還給系統。而在中間的 「未使用」記憶體是不會歸還給系統的,所以系統也不可能再利用這塊物理記憶體頁(我們假設系統沒有swap區和swap檔案),也就是說系統的記憶體會為此減 少,除非在它之前的堆記憶體都用free進行釋放以後,glibc的堆管理器才有可能(只是有可能)把該段記憶體歸還給系統。
由此,我們在使用malloc/free時應該小心,特別是在初始化時分配了好多記憶體,但是在這之後卻再也不需要這麼多的記憶體了,而這塊記憶體又沒有達到 threshhold值或者在堆的最高線性位址處有某塊記憶體沒有釋放,但是它前面的所有堆記憶體都釋放了;這種情況下,使用者任務將會浪費一些物理記憶體,這在 資源比較緊張的嵌入式系統中是不可容忍的。
謝謝!附件: [圖1]
繪圖1.gif (2005-12-27 17:59, 25.98 k)
附件: [圖2]
繪圖2.gif (2005-12-27 17:59, 3.66 k)
使用者程序釋放記憶體
linux使用者程序是如何釋放記憶體的 linux程序使用記憶體的基本流程 見圖1從圖中我們可以看出,程序的堆,並不是直接建立在linux的核心的記憶體分配策略上的,而是建立在glibc的堆管理策略上的 也就是glibc的動態記憶體分配策略上 堆的管理是由glibc進行的。所以我們呼叫free對ma...
Linux的使用者程序是如何使用記憶體
linux的使用者程序是如何使用記憶體的 linux程序使用記憶體的基本流程 圖1從上圖中我們可以看出,程序的堆,並不是直接建立在linux的核心的記憶體分配策略上的,而是建立在glibc的堆管理策略上的 也就是glibc的動態記憶體分配策略上 堆的管理是由glibc進行的。所以我們呼叫free對m...
linux如何手動釋放記憶體?為什麼要釋放記憶體?
前言 當在linux下頻繁訪問檔案後,物理記憶體會很快被用光,當程式結束後,記憶體不會被正常釋放,而是一直作為caching。這個問題,貌似有不少人在問,不過都沒有看到有什麼很好解決的辦法。那麼我來談談這個問題怎麼解決?proc是乙個虛擬檔案系統,可通過對它的讀寫操作做為與kernel實體間進行通訊...