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,为什么我的堆栈大小改不上去,是有其他的限制需要改大吗?
谢谢指点!
...全文
2320 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.

本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与文件安全性 5.4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5.6 文件的写与读 5.7 其他文件操作 5.8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指插口地址 7.4函数sys—listen()——设server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备文件系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构中的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构中的中断机制 9.5SMP结构中的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶段) 10.3系统初始化(第二阶段) 10.4系统初始化(第三阶段) 10.5系统的关闭和重引导

23,220

社区成员

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

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