linux下栈空间大小(ulimit)
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash

·
linux下栈空间大小
第一次写博客,很多地方写的不好请多见谅,希望这篇文章对大家有帮助。
首先说下为什么会写linux下栈空间大小这个内容。在评审同事代码的时候发现代码中有两个函数互相调用,且无法退出导致申请的栈内存无法释放,因此要计算能支持多少次循环。其实这个问题不是太难,只要知道栈空间大小,再除去申请的局部变量大小即可。
1、如何查看栈空间大小
对于 x86 和 x64 计算机,默认堆栈大小为 1 MB。在 Itanium 芯片组上,默认大小为 4 MB。linux下默认的堆栈空间大小是8M或10M,不同的发行版本可能不太一样。可以使用ulimit指令查看栈空间大小,指令ulimit -s或者ulimit -a如下图:
使用ulimit -s直接显示出栈空间大小10240,ulimit -a显示所有参数,其中stack size值是10240,表示栈空间大小是10M。注意:这里的单位是KB。我们也可以使用“ulimit -s 数字”来修改栈的大小,如下图将栈空间修改成8M:
ulimit指令参数详解:
-H 设置硬资源限制.
-S 设置 软资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置 数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
-p size:设置管道 缓冲区的最大值.单位:kbytes
-s size:设置 堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置 虚拟内存的最大值.单位:kbytes
-u <程序数目> 用户最多可开启的程序数目
2、验证栈空间大小是否是stack size
到这里,大家可能以为问题得到解答了,实际没有,为什么呢?接下去我们通过编写简单的程序来验证一下,验证程序1:
#include <stdio.h>
#include <stdlib.h>
void test(int i)
{
char temp[1024*1024] = {0};
temp[0] = i;
temp[0] ++;
printf("%s %d num = %d!\r\n", __FUNCTION__, __LINE__, temp[0]);
test(temp[0]);
}
int main(void)
{
test(0);
return 0;
}
我们先查找栈空间大小,再编译运行,如下:
经查找栈空间大小是8M,我们每次申请1M的内存空间能申请9次,再加上函数参数、函数返回值、非静态函数等也是放在栈中也需要占用空间。那么,我们能使用的栈空间貌似不是8M,而是9M到10M之间,这是为什么呢?经网上查找资料发现,原来linux中主线程的栈空间要比子线程大,子线程可以使用的栈空间是stack size,而主线程能使用的栈空间要比子线程大很多(2M)。用代码验证一下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_t thread_id;
void test(int i)
{
char temp[1024*1024] = {0};
temp[0] = i;
temp[0] ++;
printf("%s %d num = %d!\r\n", __FUNCTION__, __LINE__, temp[0]);
test(temp[0]);
}
void *thrd_func(void *arg)
{
printf("%s %d!\r\n", __FUNCTION__, __LINE__);
printf("New process: PID: %d,TID: %u.\r\n",getpid(),pthread_self());
printf("New process: PID: %d,TID: %u.\r\n",getpid(),thread_id);
test(0);
pthread_exit(NULL); //退出线程
}
int main(void)
{
if (pthread_create(&thread_id,NULL,thrd_func,NULL)!=0)
{
printf("Create thread error!\r\n");
exit(1);
}
usleep(10000); //此处一定要加延时,否则子线程还没跑完主线程就结束了。
return 0;
}
运行并编译,结果:
可以看到子线程只能申请7M,最大使用的栈空间和stack size一样是8M。
推荐内容
阅读全文
AI总结




A beautiful web dashboard for Linux
最近提交(Master分支:7 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
相关推荐
查看更多
linux-dash

A beautiful web dashboard for Linux
linux-dash

A beautiful web dashboard for Linux
linux-dash

热门开源项目
活动日历
查看更多
直播时间 2025-04-23 19:00:00

GitTalk:国内首个微服务编排框架Juggle实战解析
直播时间 2025-04-22 18:31:56

字节AI 黑科技!从 Manus Agent 入门 Eino
直播时间 2025-04-09 14:34:18

樱花限定季|G-Star校园行&华中师范大学专场
直播时间 2025-04-07 14:51:20

樱花限定季|G-Star校园行&华中农业大学专场
直播时间 2025-03-26 14:30:09

开源工业物联实战!
所有评论(0)