Linux/Unix下程序的堆栈大小是怎么定的?

hupo1982 2009-02-05 07:11:43
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,为什么我的堆栈大小改不上去,是有其他的限制需要改大吗?
谢谢指点!
...全文
2292 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hupo1982 2009-02-13
  • 打赏
  • 举报
回复
哎,终于找到了改堆栈的办法,用root用户登进去,进入sam,在Kernel Configurations里面改才行。楼上的办法都改不了
水手carl 2009-02-13
  • 打赏
  • 举报
回复
突然有了疑问,栈到底怎么使用的呢?
mosaic 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hupo1982 的回复:]
我用ulimit -H看了一下,返回值是unlimited,我的理解就是硬限制是无限的,但是我的软限制就是加不上去,为什么呢?
[/Quote]

用ulimit -Ha 看呢?

然后用ulimit -Hs 设置试试?
once_and_again 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hupo1982 的回复:]
引用 2 楼 mosaic 的回复:
系统对资源的限制有两种:hard limit和soft limit. 其中ulimit -a看到的是软限制,软限制的值必须时小于等于硬限制的值,所以如果你用ulimit -s提高不上去,估计是已经到达硬限制的范围了,那么就应该先更改硬限制的值:
比如修改/etc/security/limits这个文件(不知道HP上是不是放在这个文件里)
还有看看ulimit 是否支持-H,支持的话用ulimit就可以改了。
或者用sam或smh进入对用户的这个属性进行…
[/Quote]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
hupo1982 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mosaic 的回复:]
系统对资源的限制有两种:hard limit和soft limit. 其中ulimit -a看到的是软限制,软限制的值必须时小于等于硬限制的值,所以如果你用ulimit -s提高不上去,估计是已经到达硬限制的范围了,那么就应该先更改硬限制的值:
比如修改/etc/security/limits这个文件(不知道HP上是不是放在这个文件里)
还有看看ulimit 是否支持-H,支持的话用ulimit就可以改了。
或者用sam或smh进入对用户的这个属性进行修改。
[/Quote]
我用ulimit -H看了一下,返回值是unlimited,我的理解就是硬限制是无限的,但是我的软限制就是加不上去,为什么呢?
unixlinuxsys 2009-02-06
  • 打赏
  • 举报
回复
Linux和Unix对栈的使用不一样
hupo1982 2009-02-06
  • 打赏
  • 举报
回复
而且还有一个问题,同样的代码我在Linux Red Hat 9.0上编译完成后做同样的功能就没有问题,可以出来正确的结果,我在Linux上用ulimit -a查看栈大小是8192,比HP上小得多,却没有问题?Linux和Unix对栈的使用不一样吗?
thunderarch 2009-02-06
  • 打赏
  • 举报
回复
可以看看ulimit的源代码是如何实现的,应该能找到原因。
hupo1982 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mosaic 的回复:]
引用 3 楼 hupo1982 的回复:

我用ulimit -H看了一下,返回值是unlimited,我的理解就是硬限制是无限的,但是我的软限制就是加不上去,为什么呢?


用ulimit -Ha 看呢?

然后用ulimit -Hs 设置试试?
[/Quote]
谢谢你的热心帮助,我在root用户下用ulimit -Ha 查看栈的大小限制是81612,我用ulimit -Hs设置成稍微大一点的值,没有错误返回,但是再用ulimit -Ha 查看的时候stack size还是81612?
mosaic 2009-02-05
  • 打赏
  • 举报
回复
系统对资源的限制有两种:hard limit和soft limit. 其中ulimit -a看到的是软限制,软限制的值必须时小于等于硬限制的值,所以如果你用ulimit -s提高不上去,估计是已经到达硬限制的范围了,那么就应该先更改硬限制的值:
比如修改/etc/security/limits这个文件(不知道HP上是不是放在这个文件里)
还有看看ulimit 是否支持-H,支持的话用ulimit就可以改了。
或者用sam或smh进入对用户的这个属性进行修改。
unixlinuxsys 2009-02-05
  • 打赏
  • 举报
回复

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 <pthread.h>
#include <stdio.h>

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:





...
#<domain> <type> <item> <value>
...
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.

23,117

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧