亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
1234下一頁
最近訪問板塊 發(fā)新帖
查看: 12965 | 回復: 32
打印 上一主題 下一主題

對Linux堆內存釋放的總結 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2005-12-27 17:56 |只看該作者 |倒序瀏覽
今天上午得到了該版的一些高手指點,終于弄懂了堆內存釋放的奧秘,特總結出來與大家分享!


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

C:\Documents and Settings\eric\My Documents\Linux用戶進程是如何使用內存的.doc
從圖中我們可以看出,進程的堆,并不是直接建立在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)中是不可容忍的。


謝謝!

論壇徽章:
0
2 [報告]
發(fā)表于 2005-12-27 17:59 |只看該作者

不能貼圖片:

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

那么glibc的堆管理器在什么時候才把物理內存歸還給系統(tǒng)呢?
它會從堆的最大線性地址開始,從后向前計算用戶任務當前有多少空閑的堆內存(直到碰到使用中的堆內存地址為止),比如在該圖中,
    見圖2
它會認為有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)中是不可容忍的。


謝謝!

繪圖1.gif (25.98 KB, 下載次數(shù): 264)

圖1

圖1

繪圖2.gif (3.66 KB, 下載次數(shù): 239)

圖2

圖2

論壇徽章:
84
每日論壇發(fā)貼之星
日期:2015-12-29 06:20:00每日論壇發(fā)貼之星
日期:2016-01-16 06:20:00每周論壇發(fā)貼之星
日期:2016-01-17 22:22:00程序設計版塊每日發(fā)帖之星
日期:2016-01-20 06:20:00每日論壇發(fā)貼之星
日期:2016-01-20 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-01-21 06:20:00每日論壇發(fā)貼之星
日期:2016-01-21 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-01-23 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-01-31 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設計版塊每日發(fā)帖之星
日期:2016-01-14 06:20:00
3 [報告]
發(fā)表于 2005-12-28 10:34 |只看該作者
原來是這樣! 謝謝,謝謝!

招聘 : c/c++研發(fā)
論壇徽章:
0
4 [報告]
發(fā)表于 2005-12-28 11:46 |只看該作者
前幾天都在商量malloc的內存碎片問題,原來是這樣的
up

論壇徽章:
0
5 [報告]
發(fā)表于 2005-12-28 12:44 |只看該作者
1,通過malloc申請的內存并不一定代表實際已經得到的物理內存,而只是改變了用戶空間heap空間的大小。
2,通過free釋放的內存并不一定馬上歸還給系統(tǒng),必須是用戶heap空間內連續(xù)空閑內存數(shù)據(jù)超出一個閾值時才將這片內存歸還給內核。
3,如果在用戶空間內空閑內存區(qū)存在并未達到釋放閾值的內存塊,并且后續(xù)不再申請內存,那么該塊內存就將被用戶進程“霸占”。

是這樣理解嗎?

論壇徽章:
0
6 [報告]
發(fā)表于 2005-12-28 12:50 |只看該作者

關于malloc碎片的問題

目前的Linux堆內存管理是用的ptmalloc的管理方案,在該實現(xiàn)中有個叫做fastbin的東西,好像是用來對分配的內存進行按size分類,比如你分配了一個8byte的內存,在釋放的時候如果不能和別人合并,則會緩存起來,鏈到一個8bytes鏈中,下次再分配相同大小的內存時,glibc會直接看,在該鏈中是否有項,如果有,則直接在該鏈表中摘取一項,返回該項給進程。分配結束。。!

所以glibc的堆管理器已經做了小內存分配的優(yōu)化動作,我們可以不做了,不過,如果對我們自己的應用有特定需求,則我們也可以再在glibc上包裝一層,對小尺寸的內存分配做優(yōu)化!

論壇徽章:
0
7 [報告]
發(fā)表于 2005-12-28 12:55 |只看該作者
原帖由 dustman 于 2005-12-28 12:44 發(fā)表
1,通過malloc申請的內存并不一定代表實際已經得到的物理內存,而只是改變了用戶空間heap空間的大小。
2,通過free釋放的內存并不一定馬上歸還給系統(tǒng),必須是用戶heap空間內連續(xù)空閑內存數(shù)據(jù)超出一個閾值時才將這 ...


1,3的理解是正確的,但是2可能有點出入,應該是這樣的:

不是heap空間中有連續(xù)的空閑內存數(shù)據(jù)超過一個閥值時才歸還給系統(tǒng),而是從最后向前測量,直到一個在用的空間為止,如果這段沒用的空間總量超過了閥值,則把這段內存歸還給系統(tǒng)。

因為系統(tǒng)調用sbrk和brk僅僅只能做的事情是,移動堆的最大線性地址(top memory),它并不能處理中間的空閑空間

論壇徽章:
0
8 [報告]
發(fā)表于 2005-12-28 13:35 |只看該作者
謝了

收藏

論壇徽章:
0
9 [報告]
發(fā)表于 2005-12-30 10:38 |只看該作者

想知道用戶程序堆棧的管理

如題,以及在哪里做堆棧的限制

論壇徽章:
0
10 [報告]
發(fā)表于 2006-01-05 10:58 |只看該作者
好東西!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP