精华内容
下载资源
问答
  • 栈大小
    千次阅读
    2018-08-14 17:21:04

    linux系统下默认栈大小是10M,windows系统下默认栈大小是1M.

    windows下用vs2010编译C++程序时,编译属性中可以重新设定栈大小.

    堆的话,理论上内存有多大,就可以建多大.
    但32位的程序在64位系统上运行的时候,一个进程的堆大小应该是不可以超过4G的.

     

     

    进程可以创建的线程数受可用虚拟内存的限制。 默认情况下,每个线程都有一兆字节的堆栈空间。 因此,您最多可以创建2,048个线程。 如果减小默认堆栈大小,则可以创建更多线程。 但是,如果为每个处理器创建一个线程并构建应用程序队列,应用程序维护上下文信息,则应用程序将具有更好的性能。 在处理下一个队列中的请求之前,线程将处理队列中的所有请求。

    更多相关内容
  • 一般,在Unix-like平台,大小不是由程序自己来控制的而是由环境变量来控制的,所以就不能通过设置编译器(像gcc)的任何编译标志来设置大小;在windows平台下,大小的信息是包含在可执行文件中的。它可以...

             

    一、前言:

            在应用程序我们经常需要定义大的数组,数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。


             一般,在Unix-like平台,栈的大小不是由程序自己来控制的而是由环境变量来控制的,所以就不能通过设置编译器(像gcc)的任何编译标志来设置栈的大小;在windows平台下,栈的大小的信息是包含在可执行文件中的。它可以在Visual C++的编译过程中设置。也可以用Microsoft提供的一个叫作:”editbin.exe“程序来直接修改可执行文件的栈的大小。

    二、在一般情况下,不同平台默认栈大小如下

    SunOS/Solaris                                8172K bytes          (Shared Version)
    Linux                                               10240K bytes 
    Windows                                         1024K bytes          (Release Version)
    AIX                                                  65536K bytes

    三、如果定义数组很大的情况下,那就需要修改默认的栈大小,下面给出几个平台的修改方法:

    1.SunOS/Solaris系统:

            limit                 # 显示当前用户的栈大小
            unlimit             # 将当前用户的栈大小改为不限制大小
            setenv        STACKSIZE 32768 #设置当前用户的栈大小为 32M bytes

    2.Linux系统:


         ulimit -a    #显示当前用户的栈大小
         ulimit -s 32768 #将当前用户的栈大小设置为32M bytes

    3. Windows (在编译过程中的设置):

    3.1、windows系统下使用editbin.exe修改栈内存

    (1)在文件夹中按下Shift点击右键,在右键菜单中点击在此处打开PowerShell窗口/在此处打开命令行窗口

    (2)在打开的命令窗口中输入editbin,回车可以看到使用方法。期中/STACK可以修改程序栈大小。(如果没有该程序,请自行搜索下载)

    如何修改EXE程序的栈大小?

    (3)通过命令editbin /STACK 10进制栈字节数 被编辑文件的路径/文件名.exe

    修改栈大小,如图表明修改成功。

    如何修改EXE程序的栈大小?

    注意事项

    • 该工具只能以命令行方式运行,适用于C/C++等编译的本机代码。

    • 该工具同时可以修改32位EXE是否支持超过2GB的内存。

    3.2、windows系统下使用GCC修改栈内存

    我们知道,递归以及开局部变量都是要占用栈空间的
    而Windows默认给每个线程仅仅分配1M内存(大神说是这样的)
    这时就需要手动调整系统栈大小了。

    以下转自Lynstery
    在用gcc/g++编译时指定参数
    -Wl,–stack=size
    size是栈的大小,单位为字节。
    比如我现在要编译一个名为hh的c++程序,栈的大小要16M,就这样

    这里写图片描述

    如果是像本蒟蒻一样用dev-c++的,那么可以

    这里写图片描述

    点编译选项,然后

    这里写图片描述

    就可以了

    4. AIX系统:

           以root用户修改/etc/security/limits文件。在这个文件中添加相应的用户的一些限制,下面以tlq用户的栈大小要修改为64M为例进行说明:

          Su –  root

          Vi /etc/security/limits

    文件的末尾添加如下:

    tlq:

         fsize = -1

         core = 2097151

         cpu = -1

         data = -1

         rss = -1

         stack = 65537

         nofiles = -1

    修改完之后,再退出系统,重新登陆。此时就可以用ulimit –a来查看static 大小,此时已经改为了65537K了。

    四、 其他在应用程序中设置栈大小的方法

    1.通过c++程序代码控制

            // 设置默认堆栈的大小,单位是字节,byte,设置为1G
               #pragma comment(linker, "/STACK:1073741824")

    2.通过配置程序进行设置,注意单位也是字节,byte

    3.g++设置默认栈大小

    (1)将如下代码写到主程序前:

     int size = 512 << 20; // 512MB  
        char *p = (char*)malloc(size) + size;  
        __asm__("movl %0, %%esp\n" :: "r"(p));

    4. 线程创建时指定线程栈的大小

    int ithread_start(void *(run)(void *), void *arg) {
     
    pthread_t threadId;
     
    pthread_attr_t threadAttr;
     
    memset(&threadAttr,0,sizeof(pthread_attr_t));
     
    pthread_attr_init(&threadAttr);
     
        int status = 0;
     
        size_t size = 0;
     
        //printf("default size:%d\n", size);
     
        status = pthread_attr_getstacksize(&threadAttr, &size);
     
        if(0 != status)
     
    {
     
      printf("pthread_attr_getstacksize err [%d]\n",status);
     
    }
     
    printf("current thread stack size:%d\n", size);
     
    size = 1024*1024;
     
    status = pthread_attr_setstacksize(&threadAttr, size);
     
    if(0 != status)
     
    {
     
    printf("pthread_attr_getstacksize err [%d]\n",status);
     
    return -1;
     
    }
     
    printf("set thread stack size:%d\n", size);
     
    pthread_attr_setdetachstate(&threadAttr,PTHREAD_CREATE_DETACHED);
     
    pthread_create(&threadId, &threadAttr, run, arg);
     
    pthread_attr_destroy(&threadAttr);
     
    printf("%d\n", (int)threadId);
     
    return threadId;
     
    }


    此处代码修改线程的栈大小为1M

    (1) 获取Linux默认线程栈大小

                  ulimite -s

    (2)  修改Linux默认线程栈大小

                  ulimite -s value
     

    展开全文
  • linux线程栈大小的设置

    千次阅读 2021-05-10 02:11:16
    线程应用程序最常见导致创建线程失败的原因是线程栈大小的设置。创建一个新的线程,默认情况下系统为线程栈预留了2MB的寻址空间。线程栈起始于进程虚拟内存的高端地址,并向虚拟内存底端地址方向扩展。取决于线程...

    线程应用程序最常见导致创建线程失败的原因是线程栈大小的设置。创建一个新的线程,默认情况下系统为线程栈预留了2MB的寻址空间。线程栈起始于进程虚拟内存的高端地址,并向虚拟内存底端地址方向扩展。取决于线程本身的大小以及其它线程内存分配的情况,进程虚拟地址空间消耗过快可能导致创建线程失败。

    这里有一个测试程序可以看到,Linux下最多可以创建多少个线程。

    #include

    #include

    #include

    void *ThreadFunc()

    {

    static int

    count = 1;

    printf

    ("Create thread %d/n", count);

    //pthread_detach (pthread_self());

    count++;

    }

    int main(char *argv[ ], int argc)

    {

    int err;

    pthread_t

    tid;

    while

    (1){

    err =

    pthread_create(&tid, NULL, ThreadFunc, NULL);

    if (err != 0){

    printf("can't create thread: %s/n", strerror(err));

    break;

    }

    }

    }

    输出结果如下:

    Create thread 303

    Create thread 304

    can't create thread: Cannot allocate memory

    用 ulimit -s 可以查看到栈的默认大小为10240K

    32位linux下的进程用户空间是3072M,

    3072/10.24=300。为什么实际会比计算出来的多2个,这个原因还不太清楚。

    可以在调用 pthread_create 的时候用 pthread_attr_getstacksize

    设置栈的大小,或者直接用 ulimit -s 设置栈的大小。

    如果修改上面的测试代码为

    #include

    #include

    #include

    void *ThreadFunc()

    {

    static int

    count = 1;

    printf

    ("Create thread %d/n", count);

    pthread_detach (pthread_self());

    count++;

    }

    int main(char *argv[ ], int argc)

    {

    int err;

    pthread_t

    tid;

    while

    (1){

    err =

    pthread_create(&tid, NULL, ThreadFunc, NULL);

    if (err != 0){

    printf("can't create thread:

    %s/n", strerror(err));

    break;

    }

    }

    }

    那么得到的结果将是:

    Create thread 560000

    Create thread 560001

    ……………

    这里用到了pthread_detach

    (pthread_self())来释放线程所占用的内存资源(线程内核对象task_struct和线程内核堆栈)。这样就可以创建更多的线程,而不会出现Cannot

    allocate memory的错误。

    展开全文
  • 当然,主要还是增大线程栈大小,尤其是存在jni调用的情况下,C++层的栈开销有时候是非常恐怖的,比如说递归调用。 这就需要分三种情况,主线程,自定义线程池,AsyncTask。 主线程的线程栈是没有办法进行修改的,这...
  • 【Linux系统编程】线程栈大小

    千次阅读 2019-11-07 18:12:11
    00. 目录 文章目录00. 目录01. 概述02. 设置线程函数03....01. 概述 先来讲说线程内存相关的东西,主要有下面几条: ...线程可以通过暴露地址的方式与其它线程进行共享。 有大数据量处理的应用中,有时...

    00. 目录

    01. 概述

    先来讲说线程内存相关的东西,主要有下面几条:

    • 进程中的所有的线程共享相同的地址空间。
    • 任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写。
    • 一个线程真正拥有的唯一私有储存是处理器寄存器。
    • 线程栈可以通过暴露栈地址的方式与其它线程进行共享。

    有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存块,毫无疑问,再来的肯定是一个段错误。

    pthread_create()创建线程时,若不指定分配堆栈大小,系统会分配默认值,通过命令查看方法如下:
    在这里插入图片描述

    上面的单位为 Kb,所以,线程默认堆栈大小为 8M。

    也可以在终端下通过 ulimit -s value 用来重新设置 stack 大小。

    一般来说,默认堆栈大小为 8388608,堆栈最小为 16384, 单位为字节。在某些嵌入式系统中,如果其内存不是很大,若采用默认值的话,会导致出现问题,若内存不足,则 pthread_create() 会返回 12,其定义如下:

    #define EAGAIN 11
     
    #define ENOMEM 12 /* Out of memory */
    

    02. 设置线程栈函数

    可以使用 pthread_attr_getstacksize() 和 pthread_attr_setstacksize() 的方法来获取和设置线程的堆栈空间。

    查看线程堆栈大小示例代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>//线程操作所需头文件
     
    int main(void)
    {
    	size_t stack_size = 0; //堆栈大小变量
    	pthread_attr_t attr; //线程属性结构体变量
    	
    	//初始化线程属性
    	int ret = pthread_attr_init(&attr);
    	if(ret != 0)
    	{
    		perror("pthread_attr_init");
    		return -1;
    	}
    	
    	//获取当前的线程栈大小
        ret = pthread_attr_getstacksize(&attr, &stack_size);
        if(ret != 0)
    	{
    		perror("pthread_attr_getstacksize");
    		return -1;
    	}
    	
    	//打印堆栈值
    	printf("stack_size = %dB, %dk\n", stack_size, stack_size/1024);
     
        return 0;
    }
    

    执行结果:

    deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ gcc 1.c -pthread
    deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out  
    stack_size = 8388608B, 8192k
    deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ 
    

    设置线程堆栈大小示例代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>//线程操作所需头文件
     
    int main(void)
    {
    	size_t stack_size = 0; //堆栈大小变量
    	pthread_attr_t attr; //线程属性结构体变量
    	
    	//初始化线程属性
    	int ret = pthread_attr_init(&attr);
    	if(ret != 0)
    	{
    		perror("pthread_attr_init");
    		return -1;
    	}
    	
    	stack_size = 1024*20; //堆栈大小设置为20K
        ret = pthread_attr_setstacksize(&attr, stack_size);//设置线程堆栈大小
        if(ret != 0)
    	{
    		perror("pthread_attr_getstacksize");
    		return -1;
    	}
    	
    	stack_size = 0;
        ret = pthread_attr_getstacksize(&attr, &stack_size);//获取线程堆栈大小
    	//打印堆栈值
    	printf("stack_size = %dB, %dk\n", stack_size, stack_size/1024);
     
        return 0;
    }
    

    执行结果:

    deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out  
    stack_size = 20480B, 20k
    deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ 
    

    03. 附录

    3.1 博客: 线程堆栈大小 pthread_attr_setstacksize 的使用

    3.2 博客: pthread之线程堆栈

    展开全文
  • C/C++测试程序运行时所需的栈大小

    千次阅读 2021-11-21 19:52:35
    由于工作需要,最近在研究怎么测试程序用掉的栈大小,这里感谢领导给我提供了一个很不错的思路,只需要要一个 alloca 函数就能搞定,在此记录分享一下,以备不时之需。 二、测试原理 2.1 alloca 函数 在讲原理之前,...
  • JVM设置栈大小(idea)

    千次阅读 2022-04-20 08:28:26
    虚拟机描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的...
  • 缘起 前一段日子,遇到了好几个溢出异常,相关文章可以点击这里、 这里和这里。解决溢出,一般可以从两个方面进行处理。简而言之就是:开源节流!开源 就是增大尺寸。节流 就是减少不必要的...
  • LINUX下线程默认栈大小的设置

    千次阅读 2021-11-01 11:24:38
    默认的大小(8M) linux下默认的可以通过以下命令查看 ulimit -s 如果没有更改过,默认的值为8192k = 8192/1024=8M 通过代码也可以查看, pthread_attr_init(&attr); pthread_attr_getstacksize(&attr, ...
  • linux查看线程栈大小

    2021-01-30 11:03:16
    https://www.cnblogs.com/luosongchao/p/3680312.html
  • 2. 进程的栈大小是随机确定的至少比线程的栈要大,但是不到线程栈大小的2倍  3. 线程栈的大小是固定的,也就是ulimit -a显示的值 实验: 我在FC3,gcc3.4.2环境下进行该实验,证明线程的栈确实有固定大小,也...
  • 修改Qt程序的默认栈大小

    千次阅读 2020-08-31 09:11:08
    修改Qt程序的默认栈大小 打开pro文件,在最后添加: QMAKE_LFLAGS += "/STACK:65536,4096" //设置栈保留大小65536K 提交大小4096K 关于堆栈的提交和保留界面的介绍大家可以参考这篇文章: 讨论】关于堆栈提交页面与...
  • Linux 默认函数栈大小查看与设置

    千次阅读 2019-12-29 23:08:08
    CentOS系统下可以使用ulimit -s 查看当前函数栈大小: 使用ulimit -s sum 可以将函数栈大小设置为 sum KB 大小: 可用如下代码验证函数栈大小: #include<iostream> using namespace std; //int num[1024*...
  • jvm栈大小设置

    万次阅读 2018-07-02 20:33:06
    1、内存大小设置内存为线程私有的空间,每个线程都会创建私有的内存。空间内存设置过大,创建线程数量较多时会出现内存溢出StackOverflowError。同时,内存也决定方法调用的深度,内存过小则会导致...
  • Windows栈大小

    千次阅读 2017-07-31 17:45:59
    一般来说,我们所用的内存有堆和之分,其余的我们很少控制,的速度快,但是空间少,不灵活;而堆的空间几乎可以满足任何要求:灵活,但是相对速度要满了很多,并且在VC中堆是人为控制的,new了就要delete,否则...
  • Linux下函数栈大小的自动计算技术.pdf
  • 前面我们对于有一个基本的认知了,核心的是有栈帧控制的,一个方法就会分配一个栈帧内存空间,这个空间,是否可以可以无限开辟栈帧内存空间,答案肯定是不可以的,想必大家都有碰到过内存溢出吧。...
  • 本章节为大家讲解FreeRTOS任务栈大小的确定方法以及栈溢出检测方法。给任务分配多大的栈空间,一直是初学者比较头疼的问题,本章就主要为大家讲解如何解决此问题。 本章教程配套的例子含Cortex-M3内核的STM32F103...
  • Visual Studio 2015设置栈大小

    千次阅读 2020-11-12 12:05:44
    如果在堆区需要从10空间大小扩展到20个空间大小,步骤如下: 现在要扩展至20个空间: 如果从array指针向后,够20个空间则直接申请。 在申请完之后,realloc函数返回新申请的堆内存空间首地址。也就是继续使用开始...
  • 修改线程栈大小

    千次阅读 2018-03-01 15:02:02
    今天我们要讲的栈大小就是创建的线程的属性之一,在pthread_attr_t 结构体中,都保存着一些缺省值,如果我们没有对其进行修改,则以缺省值进行存储 如图:属性值结果scopePTHREAD_SCOPE_PROCESS新线程与进程中的其他...
  • 1.GPIO 初始化设置: #define LED0_PIN GET_PIN(A, 8) #define LED1_PIN GET_PIN(D, 2) ... /* set LED0 pin mode to output */ rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);...2.线程栈大小的分配:
  • 单个线程大小,一般默认大小为 512k - 1024k -Xss 等价于 -XX:ThreadStackSize
  • linux 查看栈大小

    千次阅读 2018-07-17 10:13:37
    unix.stackexchange.com   As I understand, the default stack size for a pthread on Linux is 16K. I am getting strange results on my 64-bit Ubuntu install. $ ulimit -s ...pthread_attr_ini...
  • 栈大小和内存分部问题

    千次阅读 2016-10-18 11:13:51
    今天面试问了一个栈大小问题,问过两次内存的结构问题,都没有答好,这次要弄清楚才行。 栈大小是有默认值的,如果申请的临时变量太大的话就会超过栈大小,造成栈溢出。 编译期限制栈大小,和系统限制栈深度...
  • ucos任务栈大小计算,如何高效定义栈空间大小!

    千次阅读 多人点赞 2018-02-24 14:24:16
    在使用ucos时,首先需要创建任务,但是如果单片机RAM空间有限的情况下,如何能确保创建的任务既能满足任务需求,又避免任务浪费呢? 其实ucos在设计的时候,考虑到了这一点。ucos自带两个任务,其优先级分别为...
  • windows 环境下c++系统栈大小调整

    千次阅读 2017-10-22 13:21:29
    在用gcc/g++编译时指定参数 -Wl,--stack=size size是大小,单位为字节。 比如我现在要编译一个名为hh的c++程序,大小要16M,就这样 如果是像本蒟蒻一样用dev-c++的,那么可以 点编译选项,然后 就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439,798
精华内容 175,919
关键字:

栈大小