一直都有乙個疑問,乙個程序可以使用多大的記憶體空間,swap交換空間以及物理記憶體的大小,ulimit的stack size對程序的記憶體使用有怎樣的限制?今天特親自動手實驗了一次,總結如下:
開闢一片記憶體空間有2種方式,第一種:int a;第二種malloc,那麼在linux下,這兩種方式可以開闢多大的記憶體空間呢?下面依次進行實驗:
第一種方式:使用malloc申請記憶體;
這樣的方式是在堆區申請的記憶體,在linux中,其實是在申請的時候基本沒有限制,比如32位機器,理論上可以malloc(4g)的大小,因為2^32=4g,但事實上linux的程序位址空間是這樣的:
所以經過實驗,使用malloc最大能夠申請的空間是3g左右,這裡要注意,要使用下面這樣的方式申請空間:
[cpp]
view plain
copy
intmb = 0;
while
(malloc(1 <
printf("allocate %d mb total\n"
, mb);
不能直接
[cpp]
view plain
copy
size_t
mb = (
size_t
)(2147483648ul);
char
*buf = (
char
*)malloc(mb);
因為可能記憶體中存在碎片,記憶體空閒空間總和也許有3g,但是直接申請3g,可能會不成功,因為它不是連續的記憶體空間。
接下來我又迷茫了,為什麼申請堆空間不受到swap空間和物理記憶體大小的限制呢?由於linux使用的是虛擬記憶體,因此分配是不受影響的,但是,在使用的時候,我們同時使用的記憶體大小超過了swap空間和物理記憶體大小,將會出現一些問題,這裡有一篇文章說得不錯,記錄下:
第二種方式:使用int a申請記憶體;
這樣的方式是在棧區申請的記憶體,在linux中,會受到ulimit -a中stack size結果的影響
比如我的ulimit -a結果
[cpp]
view plain
copy
stack size (kbytes, -s) 8192
那麼**中
[cpp]
view plain
copy
// int mb[2097152]; 4*2097152 = 8192kb
intmb[2090000];
mb[0] = 0;
mb[2090000 - 1] = 0;
[cpp]
view plain
copy
intmb[2097152];
使用int mb[2097152]會失敗,因為堆疊可能儲存引數,返回位址等等資訊,已經占用了部分堆疊,下面的mb[2090000]是可以成功的!
所以總結一下:如果用malloc的方式,乙個程序理論上是可以使用3g的記憶體(應該說可見),但是同時能夠使用的真正最大記憶體只有swap空間+物理空間這麼大
使用int a這樣的形式,申請的空間會受到ulimit -a中stack size的影響。
php?c=article&a=read&id=103888
.net/anghlq/article/details/7087069
linux C語言 記憶體申請 堆 棧 大小限制
一直都有乙個疑問,乙個程序可以使用多大的記憶體空間,swap交換空間以及物理記憶體的大小,ulimit的stack size對程序的記憶體使用有怎樣的限制?今天特親自動手實驗了一次,總結如下 開闢一片記憶體空間有2種方式,第一種 int a 第二種malloc,那麼在linux下,這兩種方式可以開闢...
C語言連續申請變數記憶體問題
這個問題是我最近遇到的乙個問題,這裡寫成部落格記錄下來.剛學計算機系統不就,如果有 不對的地方請指正。內容是下面這個樣子的 main.c include stdio.h int a 100,b 200 int main func.c double a void func 注意上面兩個 片是在同乙個工...
C語言動態記憶體申請分析
1 c語言中的一切操作都是基於記憶體的 2 變數和陣列都是記憶體的別名 1 記憶體分配由編譯器在編譯期間決定 2 定義陣列的時候必須指定陣列的長度 3 陣列的長度是在編譯期間就必須確定的 1 malloc和free用於執行動態記憶體分配和釋放 2 malloc所分配的是一塊連續的記憶體 3 mall...