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.gif
繪圖2.gif
Linux使用者程序是如何釋放記憶體的 zt
linux使用者程序是如何釋放記憶體的 linux程序使用記憶體的基本流程 見圖1從圖中我們可以看出,程序的堆,並不是直接建立在linux的核心的記憶體分配策略上的,而是建立在glibc的堆管理策略上的 也就是glibc的動態記憶體分配策略上 堆的管理是由glibc進行的。所以我們呼叫free對ma...
程序退出以及記憶體釋放
程序退出表示程序即將結束執行。1.正常退出 2.異常退出 程序退出後都會將所有已開啟的檔案描述符關閉,釋放它所占用的記憶體和其他資源 各種退出方式之間的比較 父子程序終止的先後順序回產生不同的結果,子程序退出前父程序先退出,則會產生孤兒程序,由init程序接管。當子程序先於父程序終止,而父程序又沒有...
mysql記憶體釋放 MySQL記憶體不釋放
歡迎進入linux社群論壇,與200萬技術人員互動交流 進入 連線了一下,並進行了一次查詢操作 root nj 245 thu apr 24 16 38 38 2014 information schema select count from client statistics count 5 1 ...