学习堆栈大小限制

堆栈大小在运行程序时起着重要作用

1. 程序中堆栈的最大大小是多少?

在Linux上,可以使用ulimit命令获得允许的最大堆栈大小。

[[email protected] c]# ulimit -a
core file size????????? (blocks, -c) 0
data seg size?????????? (kbytes, -d) unlimited
scheduling priority???????????? (-e) 0
file size?????????????? (blocks, -f) unlimited
pending signals???????????????? (-i) 3823
max locked memory?????? (kbytes, -l) 64
max memory size???????? (kbytes, -m) unlimited
open files????????????????????? (-n) 1024000
pipe size??????????? (512 bytes, -p) 8
POSIX message queues???? (bytes, -q) 819200
real-time priority????????????? (-r) 0

stack size????????????? (kbytes, -s) 8192

cpu time?????????????? (seconds, -t) unlimited
max user processes????????????? (-u) 3823
virtual memory????????? (kbytes, -v) unlimited
file locks????????????????????? (-x) unlimited

On my Linux running in vm the value is 8MB.

2. 让我们来看一下堆栈大小对程序的影响

[[email protected] c]# vim test_stack.c
#include <stdio.h>

int test()
{
?? int a[2097151];

? printf("Hello world");
}

int main()
{
?? test();
?? return 0;
}

[[email protected] c]# ./test_stack

Segmentation fault
我们看到报错信息了,那是因为达到了系统堆栈的限制,被系统kill了。
程序中我们定义了一个数组 int a[2097151],由于是int类型,一个int类型占4个字节。2097151*4=8388604;8388604>8M,达到系统上限了
,所以会报错。

[[email protected] c]# ulimit -s unlimited

[[email protected] c]# ulimit -s
unlimited

再次运行程序

[[email protected] c]# ./test_stack??????
Hello world

程序运行成功,没有报错信息。



原文地址:http://blog.51cto.com/59090939/2149272

时间: 2024-07-31 06:24:20

学习堆栈大小限制的相关文章

堆栈和堆栈大小

正在执行的程序为执行该程序的初始(或主)线程维护一个主堆栈,并为每个从属线程维护不同的堆栈.堆栈是临时内存地址空间,用于保留子程序或函数引用调用期间的参数和自动变量.如果线程堆栈的大小太小,则可能会出现堆栈溢出,从而导致无提示数据损坏或段故障. 使用 f95 -stackvar 选项编译 Fortran 程序会强制在堆栈中分配局部变量和数组,就好像它们是自动变量.显式并行化的程序暗指对 OpenMP 程序使用 -stackvar,因为该选项可提高优化器将循环中的调用并行化的能力.(有关 -sta

详解μC/OS-II如何检测任务堆栈实际使用情况——即如何设置ucosii任务堆栈大小

不少屌丝同学都有类似经历吧,在使用ucosii创建任务时,关于任务堆栈大小设为多大合适搞的不清不楚,郁闷之下就随便整个数,比如就1024吧,呵呵,反正也没见得出问题,那就不多想了. 我想大多数同学都是这样做的吧.这样只是因为在一般情况下,1024确实已经足够大了,堆栈溢出的可能性很小而已.那么,如果你任务实际使用率只有很小的百分之几,一旦被你知道了,你会痛心不?我想你不痛心,μC/OS-II也会痛心的,它会觉得这个coder真是浪费啊,哈哈!顺便提醒下大家,堆和栈是完全不同的两个概念,出于国内习

线程堆栈大小的使用介绍

先来讲说线程内存相关的东西,主要有下面几条: 进程中的所有的线程共享相同的地址空间. 任何声明为 static/extern 的变量或者堆变量可以被进程内所有的线程读写. 一个线程真正拥有的唯一私有储存是处理器寄存器. 线程栈可以通过暴露栈地址的方式与其它线程进行共享. 有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存块,毫无疑问,再来的肯定是一个段错

线程堆栈大小 pthread_attr_setstacksize 的使用

pthread_create 创建线程时,若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下: # ulimit -s8192# 上述表示为8M:单位为KB. 也可以通过# ulimit -a 其中 stack size 项也表示堆栈大小.ulimit -s  value 用来重新设置stack 大小. 一般来说 默认堆栈大小为 8388608; 堆栈最小为 16384 . 单位为字节. 堆栈最小值定义为 PTHREAD_STACK_MIN ,包含#include <limits.h>

SylixOS线程堆栈大小浅析

目录 1. SylixOS线程.线程栈介绍    1 1.1    线程的介绍    1 1.2    线程栈的介绍    1 2. SylixOS线程栈大小的分配    1 2.1    线程.线程栈相关属性的设置    2 2.2    线程栈大小    2 2.3    线程堆栈警戒区    3 3. 总结    5 4. 参考资料    5 SylixOS线程.线程栈介绍 SylixOS是多线程操作系统,系统能够同时创建多个线程,具体最大线程数量取决于系统内存的大小以及编译SylixOS

IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)

摘要:     本文给出IAR设置堆栈合理大小的详细方法,并分享一些好博文(icf及map讲解).     最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR for MSP430默认的堆栈大小是80字节,编译可以通过,运行结果不确定性,调试过程会提示"the stack pointer for stack is outside the stack range",堆栈溢出.那么,到底设置多大的堆栈够用且不浪费呢. 一.合理设置堆栈大

进程空间分配和堆栈大小

1. Linux中进程空间的分配情况如下: 从上图可以看出,进程的空间分配:与进程相关的数据结构(页表.内核栈.task) ---> 物理内存 ---> 内核代码和数据  --->  用户栈  ---> 共享库的内存映射区 ---> 运行时堆 --->未初始化数据段.bss --->  已初始化数据段.data  --->  代码段.text 2. 进程的堆栈大小: 32位的Windows,一个进程栈的默认大小是1M,在vs中的编译属性可以修改程序运行时进程

VC++中出现stack overflow错误时修改VC++的默认堆栈大小

VC++中,在栈空间上申请存储的结构体或者类对象的数组空间时,如果数组长度过大,造成申请的栈空间超过或者逼近1MB时,程序可以编译通过,但是不能够执行起来.打到调试模式时会弹出如下图所示的栈空间越界错误对话框. 如下面的类定义: class Character { public: Character() { x0 = 0; y0 = 0; x1 = 0; y1 = 0; offsetX = 0; offsetY = 0; } unsigned int x0:10; unsigned int y0

转:C语言申请内存时堆栈大小限制

一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及物理内存的大小,ulimit的stack size对进程的内存使用有怎样的限制?今天特亲自动手实验了一次,总结如下: 开辟一片内存空间有2种方式,第一种:int a[]:第二种malloc,那么在linux下,这两种方式可以开辟多大的内存空间呢?下面依次进行实验: 第一种方式:使用malloc申请内存: 这样的方式是在堆区申请的内存,在linux中,其实是在申请的时候基本没有限制,比如32位机器,理论上可以malloc(4G)