C语言申请内存时堆栈大小限制
一直都有一個(gè)疑問,一個(gè)進(jìn)程可以使用多大的內(nèi)存空間,swap交換空間以及物理內(nèi)存的大小,ulimit的stack size對進(jìn)程的內(nèi)存使用有怎樣的限制?今天特親自動(dòng)手實(shí)驗(yàn)了一次,總結(jié)如下:
開辟一片內(nèi)存空間有2種方式,第一種:int a[];第二種malloc,那么在Linux下,這兩種方式可以開辟多大的內(nèi)存空間呢?下面依次進(jìn)行實(shí)驗(yàn):
第一種方式:使用malloc申請內(nèi)存;
這樣的方式是在堆區(qū)申請的內(nèi)存,在linux中,其實(shí)是在申請的時(shí)候基本沒有限制,比如32位機(jī)器,理論上可以malloc(4G)的大小,因?yàn)?^32=4G,但事實(shí)上linux的進(jìn)程地址空間是這樣的:
所以經(jīng)過實(shí)驗(yàn),使用malloc最大能夠申請的空間是3G左右,這里要注意,要使用下面這樣的方式申請空間:
[cpp]?view plaincopy
不能直接
[cpp]?view plaincopy
因?yàn)榭赡軆?nèi)存中存在碎片,內(nèi)存空閑空間總和也許有3G,但是直接申請3G,可能會(huì)不成功,因?yàn)樗皇沁B續(xù)的內(nèi)存空間。
接下來我又迷茫了,為什么申請堆空間不受到swap空間和物理內(nèi)存大小的限制呢?由于linux使用的是虛擬內(nèi)存,因此分配是不受影響的,但是,在使用的時(shí)候,我們同時(shí)使用的內(nèi)存大小超過了swap空間和物理內(nèi)存大小,將會(huì)出現(xiàn)一些問題,這里有一篇文章說得不錯(cuò),記錄下:http://www.cfanz.cn/index.php?c=article&a=read&id=103888
第二種方式:使用int a[]申請內(nèi)存;
這樣的方式是在棧區(qū)申請的內(nèi)存,在linux中,會(huì)受到ulimit -a中stack size結(jié)果的影響
比如我的ulimit -a結(jié)果
[cpp]?view plaincopy
[cpp]?view plaincopy
所以總結(jié)一下:如果用malloc的方式,一個(gè)進(jìn)程理論上是可以使用3G的內(nèi)存(應(yīng)該說可見),但是同時(shí)能夠使用的真正最大內(nèi)存只有swap空間+物理空間這么大
使用int a[]這樣的形式,申請的空間會(huì)受到ulimit -a中stack size的影響。
ps:其實(shí)我覺得堆棧就不應(yīng)該一起說~他倆的概念還是差很多的~我搜到的文章都把這兩者混在一起說,非常容易迷惑人.....
記錄下參考的文章:
http://www.cfanz.cn/index.PHP?c=article&a=read&id=103888
http://blog.csdn.NET/anghlq/article/details/7087069
http://tech.ddvip.com/2013-05/1369680397196183.html
http://www.jb51.net/LINUXjishu/34605.html
總結(jié)
以上是生活随笔為你收集整理的C语言申请内存时堆栈大小限制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈一谈自己对依赖、关联、聚合和组合之间区
- 下一篇: 栈大小和内存分部问题