当前位置: 技术问答>linux和unix
Linux/Unix下程序的堆栈大小是怎么定的?
来源: 互联网 发布时间:2016-05-18
本文导语: windows下在VC中进行程序开发时可以在工程设置中更改堆栈的大小,那么在Linux/Unix下的程序开发是怎么决定一个程序所用堆栈的大小呢? 我们的一个软件因为用了迭代,所以对堆栈的要求比较高,在Windows下我们改了dsp...
windows下在VC中进行程序开发时可以在工程设置中更改堆栈的大小,那么在Linux/Unix下的程序开发是怎么决定一个程序所用堆栈的大小呢?
我们的一个软件因为用了迭代,所以对堆栈的要求比较高,在Windows下我们改了dsp文件的设置,没有问题,但是在HP的工作站上(UNIX)就有问题,一做涉及到迭代的功能程序就会崩溃,提示栈空间不够。我用ulimit -a 查看了一下,返回:
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) 2015464
stack(kbytes) 81612
memory(kbytes) unlimited
coredump(blocks) 4194303
nofiles(descriptors) 200
我用ulimit -s想把stack size改一下,可是只要稍微改大一点(比如81613)就/usr/bin/ulimit[7]: ulimit: exceeds allowable limit,我工作站的内存是1149M,为什么我的堆栈大小改不上去,是有其他的限制需要改大吗?
谢谢指点!
我们的一个软件因为用了迭代,所以对堆栈的要求比较高,在Windows下我们改了dsp文件的设置,没有问题,但是在HP的工作站上(UNIX)就有问题,一做涉及到迭代的功能程序就会崩溃,提示栈空间不够。我用ulimit -a 查看了一下,返回:
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) 2015464
stack(kbytes) 81612
memory(kbytes) unlimited
coredump(blocks) 4194303
nofiles(descriptors) 200
我用ulimit -s想把stack size改一下,可是只要稍微改大一点(比如81613)就/usr/bin/ulimit[7]: ulimit: exceeds allowable limit,我工作站的内存是1149M,为什么我的堆栈大小改不上去,是有其他的限制需要改大吗?
谢谢指点!
|
系统对资源的限制有两种:hard limit和soft limit. 其中ulimit -a看到的是软限制,软限制的值必须时小于等于硬限制的值,所以如果你用ulimit -s提高不上去,估计是已经到达硬限制的范围了,那么就应该先更改硬限制的值:
比如修改/etc/security/limits这个文件(不知道HP上是不是放在这个文件里)
还有看看ulimit 是否支持-H,支持的话用ulimit就可以改了。
或者用sam或smh进入对用户的这个属性进行修改。
比如修改/etc/security/limits这个文件(不知道HP上是不是放在这个文件里)
还有看看ulimit 是否支持-H,支持的话用ulimit就可以改了。
或者用sam或smh进入对用户的这个属性进行修改。
|
The default value of stack size in "limit -h" in tcsh has changed to "unlimited" in kernel-2.6.18-92.el5, whereas previous kernel versions have some value. Is this a bug or a specification change?
http://kbase.redhat.com/faq/docs/DOC-2591
The default stack size, unless overwritten by pthread_attr_setstacksize(), depends on the resource limit (i.e. rlimit), and it is platform specific. The default on x86 is 10M.
$ ulimit -a | grep stack
stack size (kbytes, -s) 10240
If the rlimit is unlimited, use an architecture-specific default. For x86, this is 2M.
$ ulimit -a | grep stack
stack size (kbytes, -s) unlimited
To set the default 2M stack size that was in LinuxThreads, in NPTL instead, do either:
$ ulimit -s unlimited
$ ulimit -a | grep stack
stack size (kbytes, -s) unlimited
or
$ ulimit -s 2048
$ ulimit -a | grep stack
stack size (kbytes, -s) 2048
pthread_attr_setstacksize() can also be called to set the appropriate stack size.
#include
#include
int val = 0;
pthread_attr_t stacksize;
pthread_attr_init(&stacksize);
pthread_attr_getstacksize(&stacksize, &val);
printf("Default stack size: %d\n", val);
val = 2097152; /* echo $((2*1024*1024)) */
pthread_attr_setstacksize(&stacksize, val);
pthread_attr_getstacksize(&stacksize, &val);
printf("Changed stack size: %d\n", val);
Another way to change the rlimit permanently and not having to modify the existing multi-threaded application, is to modify the /etc/security/limits.conf file. Simply add a line that looks like:
...
#
...
username hard stack 2048
The domain can be a user name or a group name or a wildcard. Do read the documentation that is in the limits.conf file itself before making any changes to it.
|
用ulimit -Ha 看呢?
然后用ulimit -Hs 设置试试?
|
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) 4128
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
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) 4128
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 4128
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
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) 4128
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
|
Linux和Unix对栈的使用不一样