linux C語言 記憶體申請 堆 棧 大小限制

2021-06-17 23:58:48 字數 1503 閱讀 2292

一直都有乙個疑問,乙個程序可以使用多大的記憶體空間,swap交換空間以及物理記憶體的大小,ulimit的stack size對程序的記憶體使用有怎樣的限制?今天特親自動手實驗了一次,總結如下:

開闢一片記憶體空間有2種方式,第一種:int a;第二種malloc,那麼在linux下,這兩種方式可以開闢多大的記憶體空間呢?下面依次進行實驗:

這樣的方式是在堆區申請的記憶體,在linux中,其實是在申請的時候基本沒有限制,比如32位機器,理論上可以malloc(4g)的大小,因為2^32=4g,但事實上linux的程序位址空間是這樣的:

所以經過實驗,使用malloc最大能夠申請的空間是3g左右,這裡要注意,要使用下面這樣的方式申請空間:

int mb = 0;

while(malloc(1 << 20))

printf("allocate %d mb total\n", mb);

不能直接

size_t mb = (size_t)(2147483648ul);

char *buf = (char*)malloc(mb);

因為可能記憶體中存在碎片,記憶體空閒空間總和也許有3g,但是直接申請3g,可能會不成功,因為它不是連續的記憶體空間。

接下來我又迷茫了,為什麼申請堆空間不受到swap空間和物理記憶體大小的限制呢?由於linux使用的是虛擬記憶體,因此分配是不受影響的,但是,在使用的時候,我們同時使用的記憶體大小超過了swap空間和物理記憶體大小,將會出現一些問題,這裡有一篇文章說得不錯,記錄下:

這樣的方式是在棧區申請的記憶體,在linux中,會受到ulimit -a中stack size結果的影響

比如我的ulimit -a結果

stack size              (kbytes, -s) 8192
那麼**中

//      int mb[2097152]; 4*2097152 = 8192kb

int mb[2090000];

mb[0] = 0;

mb[2090000 - 1] = 0;

int mb[2097152];
使用int mb[2097152]會失敗,因為堆疊可能儲存引數,返回位址等等資訊,已經占用了部分堆疊,下面的mb[2090000]是可以成功的!

所以總結一下:如果用malloc的方式,乙個程序理論上是可以使用3g的記憶體(應該說可見),但是同時能夠使用的真正最大記憶體只有swap空間+物理空間這麼大

使用int a這樣的形式,申請的空間會受到ulimit -a中stack size的影響。

ps:其實我覺得堆疊就不應該一起說~他倆的概念還是差很多的~我搜到的文章都把這兩者混在一起說,非常容易迷惑人.....

C語言申請記憶體時堆疊大小限制

一直都有乙個疑問,乙個程序可以使用多大的記憶體空間,swap交換空間以及物理記憶體的大小,ulimit的stack size對程序的記憶體使用有怎樣的限制?今天特親自動手實驗了一次,總結如下 開闢一片記憶體空間有2種方式,第一種 int a 第二種malloc,那麼在linux下,這兩種方式可以開闢...

Linux C幾種申請記憶體的操作

from c語言中文網 void malloc size t size 最常用贅述 void calloc size t numelements,size t sizeofoneelement 申請的記憶體區域會先清零,記憶體大小 numelements sizeofoneelement void ...

linux c 位元組對齊申請記憶體與位元組對齊陣列宣告

查詢當前系統cache line大小 cat sys devices system cpu cpu1 cache index0 coherency line size 函式 void memalign size t boundary,size t size 標頭檔案stdlib.h 函式memali...