malloc一次性最大能申請多大記憶體空間

2021-09-07 04:08:55 字數 1494 閱讀 3448

受使用者態記憶體位址空間的限制。64 位系統下分配幾個 t 不成問題。

著作權歸作者所有。

考慮32位linux情況的話,依據版本的話

如果是2.4版本之前的話,因為對映區是在1g位址位置,而且對映區與棧相對生長,malloc申請的空間大於128kb的話,呼叫的是mmap函式,因此分配的位址起始在1g位置,末端為3g,最大2g左右,所以一次最大申請為2g左右,如果小塊小塊累計申請的話算上堆區128m到1g區間的話,小塊申請 malloc呼叫brk總和就0.9g,累計能申請到的為2.9g。

2.6到當前版本的話,因為對映區是在頂端靠近棧區,但是生長方向向下,與堆向上相對,一次malloc申請大空間,malloc呼叫mmap()能最大申請到2.9g左右,算上堆區128m開始向上小塊累計的話,(因為2.9g被mmap了)累計就剩下零頭,累計申請最大也是2.9g。

現在分配的才是虛擬位址(不是物理記憶體,即使物理記憶體才0.5g),只有真正使用的話,才會建立頁表開始關聯物理記憶體。

測試**如下(linux系統下,物理記憶體+交換記憶體》=4g情況下,得到2.8g左右,如果物理記憶體+交換記憶體 = n < 4gb, 得到的大概為(n - 0.2)g)

#include

#include

size_t maximum=0;

int main(int argc,char *argv)

;int i,count;

for(i=0;i<3;i++)else}}

printf("maximum malloc size = %lf gb\n",maximum*1.0 / 1024.0 / 1024.0 / 1024.0);

printf("the address is %x\n",tmpblock);

printf("the address end is %x\n", tmpblock + maximum);

while(1);

} 著作權歸作者所有。

位址空間限制是有的,但是malloc通常情況下申請到的空間達不到位址空間上限。

記憶體碎片會影響到你「一次」申請到的最大記憶體空間。比如你有10m空間,申請兩次2m,一次1m,一次5m沒有問題。但如果你申請兩次2m,一次4m,一次1m,釋放4m,那麼剩下的空間雖然夠5m,但是由於已經不是連續的記憶體區域,malloc也會失敗。

系統也會限制你的程式使用malloc申請到的最大記憶體。windows下32位程式如果單純看位址空間能有4g左右的記憶體可用,不過實際上系統會把其中2g的位址留給核心使用,所以你的程式最大能用2g的記憶體。除去其他開銷,你能用malloc申請到的記憶體只有1.9g左右。

理論上這個空間能達到系統給分配的線性空間最大值,而和具體的記憶體實際大小沒有關係。比如32位下windows大概2g,而linux3g,其餘的都是給了核心。

malloc的機制是:分配時先從程序線性位址空間分配一塊線性位址返回給使用者程序,直到你讀寫這塊位址才觸發真正的缺頁請求,從記憶體申請真正的記憶體塊給使用者。也就是說你請求了比如100m,但你只用過一次這塊記憶體50k,那麼實際上核心真正給你用的可能很就是128k,記憶體夥伴演算法。

一次性成功

沒有人能隨隨便便成功 最近察覺到自己思維的乙個誤區,希望實現的目標第一次就成功,順順利利跳過失敗。這是大家都想要的結局,美好的期望總被現實的波浪所淹沒,因為失敗是避免不了的。一次性成功的想法導致焦慮,困惑,自我懷疑,這個時候如果放低要求換個角度思考,第一次失敗又如何,如果失敗了倒下了哪有怎樣?只要自...

用Office VBA實現多控制項一次性組合

最近要做個專案,通過 office vba 來自動生成一系列的控制項 包括文字框 直線等 並將這些控制項組合在一起 這在 office 裡很好實現,只要選中這些控制項,使用上下文選單裡的組合選單項即可 最開始的 如下 dimelement1,element2 dimi asinteger setel...

用Office VBA實現多控制項一次性組合

最近要做個專案,通過 office vba 來自動生成一系列的控制項 包括文字框 直線等 並將這些控制項組合在一起 這在 office 裡很好實現,只要選中這些控制項,使用上下文選單裡的組合選單項即可 最開始的 如下 dim element1,element2 dim i asinteger set...