Linux用戶進程是如何釋放內(nèi)存的

Linux用戶進程是如何釋放內(nèi)存的
Linux進程使用內(nèi)存的基本流程:
從圖中我們可以看出,進程的堆,并不是直接建立在Linux的內(nèi)核的內(nèi)存分配策略上的,而是建立在glibc的堆管理策略上的(也就是glibc的動態(tài)內(nèi)存分配策略上),堆的管理是由glibc進行的。所以我們調(diào)用free對malloc得到的內(nèi)存進行釋放的時候,并不是直接釋放給操作系統(tǒng),而是還給了glibc的堆管理實體,而glibc會在把實際的物理內(nèi)存歸還給系統(tǒng)的策略上做一些優(yōu)化,以便優(yōu)化用戶任務(wù)的動態(tài)內(nèi)存分配過程。
那么glibc的堆管理器在什么時候才把物理內(nèi)存歸還給系統(tǒng)呢?
它會從堆的最大線性地址開始,從后向前計算用戶任務(wù)當前有多少空閑的堆內(nèi)存(直到碰到使用中的堆內(nèi)存地址為止),比如在該圖中:
它會認為有2048k的可釋放內(nèi)存,只有在該值大于某個特定的threshhold時(2.3.6上為64k),它才會把這些內(nèi)存歸還給系統(tǒng)。而在中間的“未使用”內(nèi)存是不會歸還給系統(tǒng)的,所以系統(tǒng)也不可能再利用這塊物理內(nèi)存頁(我們假設(shè)系統(tǒng)沒有swap區(qū)和swap文件),也就是說系統(tǒng)的內(nèi)存會為此減少,除非在它之前的堆內(nèi)存都用free進行釋放以后,glibc的堆管理器才有可能(只是有可能)把該段內(nèi)存歸還給系統(tǒng)。
由此,我們在使用malloc/free時應(yīng)該小心,特別是在初始化時分配了好多內(nèi)存,但是在這之后卻再也不需要這么多的內(nèi)存了,而這塊內(nèi)存又沒有達到threshhold值或者在堆的最高線性地址處有某塊內(nèi)存沒有釋放,但是它前面的所有堆內(nèi)存都釋放了;這種情況下,用戶任務(wù)將會浪費一些物理內(nèi)存,這在資源比較緊張的嵌入式系統(tǒng)中是不可容忍的。
相關(guān)文章
- 用free -m查看的結(jié)果: # 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
- 先看看內(nèi)存使用狀況 [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命令計算每個用戶使用內(nèi)存的大小,此功能該如何實現(xiàn),本為將詳細介紹2012-11-27
linux free命令參數(shù)及用法詳解(linux查看內(nèi)存命令)
free指令會顯示內(nèi)存的使用情況,包括實體內(nèi)存,虛擬的交換文件內(nèi)存,共享內(nèi)存區(qū)段,以及系統(tǒng)核心使用的緩沖區(qū)等2012-07-21linux free命令詳解和使用實例(查看內(nèi)存使用率)
free命令可以顯示Linux系統(tǒng)中空閑的、已用的物理內(nèi)存及swap內(nèi)存,及被內(nèi)核使用的buffer。在Linux系統(tǒng)監(jiān)控的工具中,free命令是最經(jīng)常使用的命令之一2014-04-09Linux中 如何查看Ubuntu內(nèi)存信息? 查看內(nèi)存信息的命令
在Linux系統(tǒng)中如何查看Ubuntu內(nèi)存信息?這篇文章主要講述了查看Ubuntu內(nèi)存信息的命令,很實用,需要的朋友可以參考下2014-10-23- 使用top工具查看到Suse Linux的內(nèi)存占用率很大,可能97%以上,我知道這是Linux的內(nèi)存使用機制,先將內(nèi)存整個管理起來,需要的時候在分配給單個進程。但是如果我需要查看系2014-12-18