win系统默认的栈空间是1M(1MiB)大小,而Linux默认下栈空间常见的是8M或10M。不同系统的栈空间默认大小不同是由系统和(或)编译器决定的(编译器占主要作用),而具体的情况要具体的分析。我见过有文章认为x86/x64体系架构的系统默认栈空间大小是1M,而安腾系列默认4M,对此我个人表示不能赞同。栈和堆都是在可用内存空间之中分配的,而硬件上的内存应该是完全一样的,也就是说栈可以分配到硬件内存上的低地址,也可以分配到某个中间段地址或高地址,而不是由硬件支持的;硬件支持的在我的知识中只有寄存器了,寄存器速度是快于内存,但价格要高于内存,它是稀缺的资源,需要特殊考虑的。而堆的速度慢于栈,更多的是跟操作系统设计有关(应该没判断错)。下面是我总结的一些要点了
- 一个进程一个堆,一个线程一个栈(这仅是笼统、粗略地从进程线程堆栈的区别上讲的)
- win系统默认栈大小是1M,linux常见默认的栈大小是8M或10M(通过ulimit -s查看;不同linux发行版的命令不保证相同)
- 所有系统的堆空间上限是接近内存(虚拟内存)的总大小的(一部分被OS占用)
Linux系统查看栈空间大小
1.使用ulimit -s查看栈大小,单位是KB
2.使用ulimit -a可以查看当前所有限制情况,其中一列写着stack size即为栈空间大小(此处需要补一张-a图片)
3.ulimit 指令参数如下
-H 设置硬资源限制.
-S 设置软资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
-u <程序数目> 用户最多可开启的程序数目
Linux系统设置栈空间大小
1. ulimit -s 临时改变栈空间大小:ulimit -s 1024,单位是KB
2. 在/etc/rc.local文件加入 ulimit -s 1024 在系统启动时开机设置栈空间大小
3. 修改文件/etc/security/limits.conf改变栈空间大小:
#<domain> <type> <item> <value>
* soft stack 1024
在此推荐一篇文章:关于堆栈的讲解(我见过的最经典的)
保留链接:https://blog.csdn.net/yingms/article/details/53188974?utm_source=blogxgwz2