Linux用戶進程是如何釋放內存的
Linux用戶進程是如何釋放內存的
Linux進程使用內存的基本流程:

從圖中我們可以看出,進程的堆,并不是直接建立在Linux的內核的內存分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的動態(tài)內存分配策略上),堆的管理是由glibc進行的。所以我們調用free對malloc得到的內存進行釋放的時候,并不是直接釋放給操作系統(tǒng),而是還給了glibc的堆管理實體,而glibc會在把實際的物理內存歸還給系統(tǒng)的策略上做一些優(yōu)化,以便優(yōu)化用戶任務的動態(tài)內存分配過程。
那么glibc的堆管理器在什么時候才把物理內存歸還給系統(tǒng)呢?
它會從堆的最大線性地址開始,從后向前計算用戶任務當前有多少空閑的堆內存(直到碰到使用中的堆內存地址為止),比如在該圖中:

它會認為有2048k的可釋放內存,只有在該值大于某個特定的threshhold時(2.3.6上為64k),它才會把這些內存歸還給系統(tǒng)。而在中間的“未使用”內存是不會歸還給系統(tǒng)的,所以系統(tǒng)也不可能再利用這塊物理內存頁(我們假設系統(tǒng)沒有swap區(qū)和swap文件),也就是說系統(tǒng)的內存會為此減少,除非在它之前的堆內存都用free進行釋放以后,glibc的堆管理器才有可能(只是有可能)把該段內存歸還給系統(tǒng)。
由此,我們在使用malloc/free時應該小心,特別是在初始化時分配了好多內存,但是在這之后卻再也不需要這么多的內存了,而這塊內存又沒有達到threshhold值或者在堆的最高線性地址處有某塊內存沒有釋放,但是它前面的所有堆內存都釋放了;這種情況下,用戶任務將會浪費一些物理內存,這在資源比較緊張的嵌入式系統(tǒng)中是不可容忍的。
相關文章
- 用free -m查看的結果: # free -m total used free shared buffers cached Mem: 504 471 32 0 19 269 -/+ buffers/cache: 183 321 Swap: 996 0 996 查看/proc/kcore文件的2009-03-10
- 先看看內存使用狀況 [root@node1 ~]# free -m total used free shared buffers cached Mem: 8004 6557 1446 0 163 5630 -/+ buffers/cache: 763 7240 Swap: 12008-09-08
- linux下由top命令計算每個用戶使用內存的大小,此功能該如何實現,本為將詳細介紹2012-11-27
linux free命令參數及用法詳解(linux查看內存命令)
free指令會顯示內存的使用情況,包括實體內存,虛擬的交換文件內存,共享內存區(qū)段,以及系統(tǒng)核心使用的緩沖區(qū)等2012-07-21- free命令可以顯示Linux系統(tǒng)中空閑的、已用的物理內存及swap內存,及被內核使用的buffer。在Linux系統(tǒng)監(jiān)控的工具中,free命令是最經常使用的命令之一2014-04-09
Linux中 如何查看Ubuntu內存信息? 查看內存信息的命令
在Linux系統(tǒng)中如何查看Ubuntu內存信息?這篇文章主要講述了查看Ubuntu內存信息的命令,很實用,需要的朋友可以參考下2014-10-23- 使用top工具查看到Suse Linux的內存占用率很大,可能97%以上,我知道這是Linux的內存使用機制,先將內存整個管理起來,需要的時候在分配給單個進程。但是如果我需要查看系2014-12-18

