博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转:C语言申请内存时堆栈大小限制
阅读量:4984 次
发布时间:2019-06-12

本文共 1252 字,大约阅读时间需要 4 分钟。

一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及物理内存的大小,ulimit的stack size对进程的内存使用有怎样的限制?今天特亲自动手实验了一次,总结如下:

开辟一片内存空间有2种方式,第一种:int a[];第二种malloc,那么在linux下,这两种方式可以开辟多大的内存空间呢?下面依次进行实验:

第一种方式:使用malloc申请内存;

这样的方式是在堆区申请的内存,在linux中,其实是在申请的时候基本没有限制,比如32位机器,理论上可以malloc(4G)的大小,因为2^32=4G,但事实上linux的进程地址空间是这样的:

所以经过实验,使用malloc最大能够申请的空间是3G左右,这里要注意,要使用下面这样的方式申请空间:

 

[cpp]   
 
  1. int MB = 0;  
  2.         while(malloc(1 << 20))  
  3.         {  
  4.                 MB++;  
  5.         }  
  6.         printf("Allocate %d MB total\n", MB);  

不能直接

 

 

[cpp]   
 
  1. size_t MB = (size_t)(2147483648UL);  
  2.  char *buf = (char*)malloc(MB);  

因为可能内存中存在碎片,内存空闲空间总和也许有3G,但是直接申请3G,可能会不成功,因为它不是连续的内存空间。

 

 

接下来我又迷茫了,为什么申请堆空间不受到swap空间和物理内存大小的限制呢?由于linux使用的是虚拟内存,因此分配是不受影响的,但是,在使用的时候,我们同时使用的内存大小超过了swap空间和物理内存大小,将会出现一些问题,这里有一篇文章说得不错,记录下:

 

 

 

第二种方式:使用int a[]申请内存;

这样的方式是在栈区申请的内存,在linux中,会受到ulimit -a中stack size结果的影响

比如我的ulimit -a结果

[cpp]   
 
  1. stack size              (kbytes, -s) 8192  

那么代码中

 

 

[cpp]   
 
  1. //      int MB[2097152]; 4*2097152 = 8192kb  
  2.         int MB[2090000];  
  3.         MB[0] = 0;  
  4.         MB[2090000 - 1] = 0;  
[cpp]   
 
  1. int MB[2097152];  

使用int MB[2097152]会失败,因为堆栈可能保存参数,返回地址等等信息,已经占用了部分堆栈,下面的MB[2090000]是可以成功的!

 

 

所以总结一下:如果用malloc的方式,一个进程理论上是可以使用3G的内存(应该说可见),但是同时能够使用的真正最大内存只有swap空间+物理空间这么大

使用int a[]这样的形式,申请的空间会受到ulimit -a中stack size的影响。

 

ps:其实我觉得堆栈就不应该一起说~他俩的概念还是差很多的~我搜到的文章都把这两者混在一起说,非常容易迷惑人.....

 

记录下参考的文章:

转载于:https://www.cnblogs.com/yfz0/p/5830439.html

你可能感兴趣的文章
ARCGIS部分刷新
查看>>
发 零 食
查看>>
poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)
查看>>
洛谷P1886 滑动窗口
查看>>
Shell编程(二)Bash中调用Python
查看>>
主动与被动监控 拓扑图组合图 自定义监控
查看>>
SQL总结(一)基本查询
查看>>
PDF分割--可脱离python环境执行,可传参数,可弹窗的PC端小工具
查看>>
cas-client-core单点登录排除不需要拦截的URL
查看>>
OCR技术浅探 : 文字定位和文本切割(2)
查看>>
jmeter集合点
查看>>
Java类代码块执行顺序
查看>>
克鲁斯卡尔(模板题)
查看>>
汉字转拼音
查看>>
Python中Web框架编写学习心得
查看>>
dataTable/dataSet转换成Json格式
查看>>
asp.net core模块学习
查看>>
MySQL远程连接不上的解决方法
查看>>
如何使用JMeter从文件中提取数据
查看>>
AndroidBase基础类文档
查看>>