linux下栈空间大小(ulimit)

linux下栈空间大小

第一次写博客,很多地方写的不好请多见谅,希望这篇文章对大家有帮助。

    首先说下为什么会写linux下栈空间大小这个内容。在评审同事代码的时候发现代码中有两个函数互相调用,且无法退出导致申请的栈内存无法释放,因此要计算能支持多少次循环。其实这个问题不是太难,只要知道栈空间大小,再除去申请的局部变量大小即可。

    1、如何查看栈空间大小

对于 x86 和 x64 计算机,默认堆栈大小为 1 MB。在 Itanium 芯片组上,默认大小为 4 MB。linux下默认的堆栈空间大小是8M或10M,不同的发行版本可能不太一样。可以使用ulimit指令查看栈空间大小,指令ulimit -s或者ulimit -a如下图:

linux下栈空间大小(ulimit)_第1张图片

  使用ulimit -s直接显示出栈空间大小10240,ulimit -a显示所有参数,其中stack size值是10240,表示栈空间大小是10M。注意:这里的单位是KB。我们也可以使用“ulimit -s 数字”来修改栈的大小,如下图将栈空间修改成8M:

linux下栈空间大小(ulimit)_第2张图片

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 <程序数目>  用户最多可开启的程序数目

2、验证栈空间大小是否是stack size
到这里,大家可能以为问题得到解答了,实际没有,为什么呢?接下去我们通过编写简单的程序来验证一下,验证程序1:
#include 
#include 
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;
}
我们先查找栈空间大小,再编译运行,如下:
linux下栈空间大小(ulimit)_第3张图片
经查找栈空间大小是8M,我们每次申请1M的内存空间能申请9次,再加上函数参数、函数返回值、非静态函数等也是放在栈中也需要占用空间。那么,我们能使用的栈空间貌似不是8M,而是9M到10M之间,这是为什么呢?经网上查找资料发现,原来linux中主线程的栈空间要比子线程大,子线程可以使用的栈空间是stack size,而主线程能使用的栈空间要比子线程大很多(2M)。用代码验证一下:
#include 
#include 
#include 
#include 

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;
}
运行并编译,结果:
linux下栈空间大小(ulimit)_第4张图片
 可以看到子线程只能申请7M,最大使用的栈空间和stack size一样是8M。




你可能感兴趣的:(嵌入式,linux,栈,ulimit)