**:
最近需要在linux系統上申請大記憶體,使用的伺服器是64位32g記憶體,但是在申請大記憶體空間時出錯,程式總是半途中斷,目測是在申請記憶體時遇到了問題。故從網上蒐集了相關的資料貼在這裡
每個程序會有4g的虛擬位址空間, malloc得到的的位址都是虛擬位址, 並且當malloc的時候, 作業系統並不會將實際的記憶體分配給程序的, 所以malloc只會占用程序自身的虛擬位址空間。
我以前也做過申請記憶體的測試,並且寫了乙個短文:
作業系統: redhat linux as5 32bit
伺服器記憶體: 4g
伺服器型別: i32
最近寫搜尋引擎, 因為建立索引需要大量的記憶體, 所以對linux下的大記憶體申請進行了一些測試.
(1)char * p = (char *)malloc( 2g位元組 );
=>申請失敗.
(2)char * p = (char *)malloc( 1.9g位元組 );
=>申請成功
(3)連續的申請10個300m的記憶體空間
for ( i=0; i<10; i++ )
p = (char*)malloc(300m位元組)
=>前9次成功, 最後1次申請失敗
(4)先申請1.9g, 再申請900m
p = (char *)malloc( 1.9g位元組 );
p = (char *)malloc( 900m位元組 );
=>兩次申請都成功.
我的理解如下:
對於在普通預設的2.6.*的linux核心!
32位的機器裡, 乙個程序的記憶體位址空間範圍是0-3g共4個g, 其中最後乙個g是核心態的位址空間, 所以給使用者態的記憶體位址空間只留下了前3個g. 那麼這樣, malloc能夠申請到3g以內的記憶體才對, 但是結果並非如此.在(1)中我們申請2g的記憶體都沒有申請到, 這是什麼原因呢?先讓我們看一看實際上程序的4g記憶體空間都放著或被map著什麼:
第0g和第1g:使用者態位址空間
第2g:庫函式對映等
第3g:核心態記憶體空間
使用者態位址空間中還包含了程序**本身占用的位址空間, 棧的空間等等.
第2g中, 庫函式對映等只占用了很少的一部分空間,還有很多的空閒空間.
現在讓我們解釋這4個問題:
第(1)個問題, 由上圖可以看出, 沒有連續的2g的記憶體, 所以申請2g的連續記憶體是肯定失敗的.
第(2), 申請1.9g的空間是成功的, 這是因為前兩個g可能會有1.9g的連續空間.
第(3), 申請了300m*9 = 2.7g是成功的, 是的, 前3g中有可能空間著2.7g的空間, 前兩個g中空閒的加上第3個g中空閒的部分. 但是如果一次申請2.7g是不行的, 因為沒有連續的2.7g的位址空間. 最後乙個300m沒有申請成功的原因是, 申請的空間大小不能超過3g的使用者態位址空間.
第(4), 比較有意思, 顯然那個1.9g是在第1-2g這個位址空間中申請成功的, 後900m是第3個g這片位址空間中申請成功的. 我們一共申請到了2.8g的」記憶體」, 卻也不是連續的
大內高手 記憶體模型
大內高手 記憶體模型 了解linux的記憶體模型,或許不能讓你大幅度提高程式設計能力,但是作為乙個基本知識點應該熟悉。坐火車外出旅行時,即時你對沿途的地方一無所知,仍然可以到達目標地。但是你對整個路途都很比較清楚的話,每到乙個站都知道自己在 知道當地的風土人情,對比一下所見所想,旅程可能更有趣一些。...
大內高手 記憶體模型
大內高手 記憶體模型 作者 李先靜 2007 7 9 了解 linux 的記憶體模型,或許不能讓你大幅度提高程式設計能力,但是作為乙個基本知識點應該熟悉。坐火車外出旅行時,即時你對沿途的地方一無所知,仍然可以到達目標地。但是你對整個路途都很比較清楚的話,每到乙個站都知道自己在 知道當地的風土人情,對...
大內高手 記憶體模型
了解linux的記憶體模型,或許不能讓你大幅度提高程式設計能力,但是作為乙個基本知識點應該熟悉。坐火車外出旅行時,即時你對沿途的地方一無所知,仍然可以到達目標地。但是你對整個路途都很比較清楚的話,每到乙個站都知道自己在 知道當地的風土人情,對比一下所見所想,旅程可能更有趣一些。類似的,了解linux...