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

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

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

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

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

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

不能直接

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

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

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

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

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

比如我的ulimit -a结果

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

那么代码中

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

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

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

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

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

记录下参考的文章:

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

C语言申请内存时堆栈大小限制相关推荐

  1. 神秘!申请内存时底层发生了什么?

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨码农的荒岛求生 来源丨码农的荒岛求生 内存的申 ...

  2. C语言 - 申请内存

    C语言 - 申请内存 1.void * malloc(size_t size) //头文件 #include<malloc.h> 申请空间是来连续的堆空间 需要么memset初始化 使用完 ...

  3. C语言动态申请内存空间之malloc(),calloc(),realloc()函数

    在C语言中用于动态申请内存空间的函数主要为malloc()函数,calloc()函数,以及realloc()函数,以下主要介绍三个函数的用法,区别以及使用时的注意事项. malloc(),calloc ...

  4. c语言栈内存和堆内存大小,堆内存和栈内存及C++内存分配

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1.现代操作系统内存管理主流的操作系统(Windows,Linux)都采用虚拟内存管理的方式,具体说就是:页式管理.段式 ...

  5. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  6. linux进程阻塞的原因,释放大块内存时的阻塞问题

    一.前言 在堆上申请和释放内存的性能不高,这应该是常识了,尤其释放大块内存时,耗时更长,甚至会阻塞其他线程.做性能优化时,一般会采用内存池等手段避免频繁的申请和释放内存.本文从内核的角度分析申请和释放 ...

  7. C语言-动态内存管理(malloc()、calloc()、realloc()、free())

    C语言 动态内存分配 文章目录 C语言 动态内存分配 前言 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.初识malloc()和free() 2.malloc()和free()的简单使用 ...

  8. C语言——操作系统内存分配过程

    内存分配机制的发展过程: 第一阶段--程序直接操作物理内存. 某台计算机总的内存大小是128M,现在同时运行两个程序A和B,A需占用内存10M,B需占用内存100.计算机在给程序分配内存时会采取这样的 ...

  9. 内存池:申请内存与释放内存

    1.内存池简介 内存池是池化技术中的一种形式.通常我们在编写程序的时候回使用 new delete 这些关键字来向操作系统申请内存,而这样造成的后果就是每次申请内存和释放内存的时候,都需要和操作系统的 ...

最新文章

  1. Python import 的用法
  2. 【 FPGA 】状态机的模型之Moore型状态机
  3. tensorflow从入门到放弃-0
  4. PyQt编程之模态与非模态对话框(二)
  5. View和ViewGroup的层次关系
  6. python torch exp_学习Pytorch过程遇到的坑(持续更新中)
  7. anaconda版本选择_Python环境搭建之Anaconda快速学习
  8. 对 Sea.js 进行配置 seajs.config
  9. HttpServletRequest 和 HttpServletResponse
  10. 切割图形_激光切割机氧气切碳钢板过烧怎么解决?这几点一定要注意!
  11. java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒
  12. 程序员眼中的“鼠标宏”
  13. 计算机设备图标怎么删除,电脑设备和驱动器中没用的图标怎么删除
  14. 中国计量大学计算机考研难吗,去中国计量大学读研好吗 考研题难吗_
  15. Axure 点图片外区域即隐藏_AXURE教程:用中继器做一个手机版内容分享原型
  16. PHP网络在线学习云课堂源码在线教育学习云课堂源码
  17. 凡科怎么添加html,如何给自己建立的网站添加嵌入页面?
  18. 淘宝api Python 接口升级 3.0 版本 主要解决图片上传问题
  19. 一起写个Dubbo——0. 一些不得不说的话
  20. h5酷炫粒子java代码_html5粒子效果文字特效

热门文章

  1. 图像锐化处理算法matlab,图像锐化matlab算法
  2. python自动解析json_Python语言解析JSON详解
  3. 循环发ajax请求,在循环中发送jquery ajax请求
  4. python函数的作用降低编程复杂度_Python函数式编程
  5. python处理csv文件列错位_CSV文件分割与列异常处理的python脚本
  6. HTML5怎样设置站点,我是怎样让网站用上HTML5 Manifest
  7. PCM信号是什么信号?
  8. [渝粤教育] 南通职业大学 混合动力汽车构造与检修 参考 资料
  9. 【渝粤教育】电大中专电子商务网站建设与维护 (7)作业 题库
  10. 国家开放大学2021春1110工程地质题目