换网站公司,做企业网站的人才,免费的推广软件有哪些,有没有做吉祥物的网站一直都有一个疑问#xff0c;一个进程可以使用多大的内存空间#xff0c;swap交换空间以及物理内存的大小#xff0c;ulimit的stack size对进程的内存使用有怎样的限制#xff1f;今天特亲自动手实验了一次#xff0c;总结如下#xff1a; 开辟一片内存空间有2种方式一个进程可以使用多大的内存空间swap交换空间以及物理内存的大小ulimit的stack size对进程的内存使用有怎样的限制今天特亲自动手实验了一次总结如下 开辟一片内存空间有2种方式第一种int a[]第二种malloc那么在Linux下这两种方式可以开辟多大的内存空间呢下面依次进行实验 第一种方式使用malloc申请内存 这样的方式是在堆区申请的内存在linux中其实是在申请的时候基本没有限制比如32位机器理论上可以malloc(4G)的大小因为2^324G但事实上linux的进程地址空间是这样的 所以经过实验使用malloc最大能够申请的空间是3G左右这里要注意要使用下面这样的方式申请空间 [cpp] view plaincopy int MB 0; while(malloc(1 20)) { MB; } printf(Allocate %d MB total\n, MB); 不能直接 [cpp] view plaincopy size_t MB (size_t)(2147483648UL); char *buf (char*)malloc(MB); 因为可能内存中存在碎片内存空闲空间总和也许有3G但是直接申请3G可能会不成功因为它不是连续的内存空间。 接下来我又迷茫了为什么申请堆空间不受到swap空间和物理内存大小的限制呢由于linux使用的是虚拟内存因此分配是不受影响的但是在使用的时候我们同时使用的内存大小超过了swap空间和物理内存大小将会出现一些问题这里有一篇文章说得不错记录下http://www.cfanz.cn/index.php?carticleareadid103888 第二种方式使用int a[]申请内存 这样的方式是在栈区申请的内存在linux中会受到ulimit -a中stack size结果的影响 比如我的ulimit -a结果 [cpp] view plaincopy stack size (kbytes, -s) 8192 那么代码中 [cpp] view plaincopy // int MB[2097152]; 4*2097152 8192kb int MB[2090000]; MB[0] 0; MB[2090000 - 1] 0; [cpp] view plaincopy int MB[2097152]; 使用int MB[2097152]会失败因为堆栈可能保存参数返回地址等等信息已经占用了部分堆栈下面的MB[2090000]是可以成功的 所以总结一下如果用malloc的方式一个进程理论上是可以使用3G的内存(应该说可见)但是同时能够使用的真正最大内存只有swap空间物理空间这么大 使用int a[]这样的形式申请的空间会受到ulimit -a中stack size的影响。 ps其实我觉得堆栈就不应该一起说~他俩的概念还是差很多的~我搜到的文章都把这两者混在一起说非常容易迷惑人..... 记录下参考的文章 http://www.cfanz.cn/index.PHP?carticleareadid103888 http://blog.csdn.NET/anghlq/article/details/7087069 http://tech.ddvip.com/2013-05/1369680397196183.html http://www.jb51.net/LINUXjishu/34605.html