社区
Linux/Unix社区
帖子详情
Linux中,一个进程的栈空间到底有多大?
HostOOP
2003-12-18 07:31:47
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
char buf[8*1024*1024];
sprintf(buf,"%s\n",argv[1]);
printf(buf);
return 0;
}
上面的程序运行时会出现Segmentation fault,原因很简单,栈内存分配得太多,我想知道一个进程的栈空间到底有多大?
...全文
2058
14
打赏
收藏
Linux中,一个进程的栈空间到底有多大?
#include #include int main(int argc,char **argv) { char buf[8*1024*1024]; sprintf(buf,"%s\n",argv[1]); printf(buf); return 0; } 上面的程序运行时会出现Segmentation fault,原因很简单,栈内存分配得太多,我想知道一个进程的栈空间到底有多大?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tkit
2003-12-29
打赏
举报
回复
use "ulimit -s unlimited" to set your maximum stack size
gridcomputing
2003-12-29
打赏
举报
回复
mark
wildhorseych
2003-12-19
打赏
举报
回复
各位高手,linux不是能够自动扩展用户模式堆栈吗?好像说如果不够的时候就产生一个缺页异常
然后自动扩展啊.好像内核模式栈以及进程描述符总共8k.请高手解释一下啊.
HostOOP
2003-12-19
打赏
举报
回复
CoolQ()兄分析得透彻,我也知道仅仅是为buf定义超过8M的内存空间没问题,但对buf进行操作时肯定会溢出。
我知道在Linux中,一个进程的堆栈空间只有8K,能够支持8M的内存空间是由于,kernel启动进程时不会将所有内容都载入自己的堆栈,而是有很合理的内存调度机制。
dchg2000
2003-12-19
打赏
举报
回复
2M
CoolQ
2003-12-19
打赏
举报
回复
HostOOP(碧云黄花),你说的有问题阿。
知道为什么会出现SegmentationFault么?我用objdump得到以下代码
08048460 <main>:
8048460: 55 push %ebp
8048461: 89 e5 mov %esp,%ebp
8048463: 81 ec c8 e0 7f 00 sub $0x7fe0c8,%esp
8048469: 83 ec 0c sub $0xc,%esp
804846c: 68 e8 84 04 08 push $0x80484e8
8048471: e8 c6 fe ff ff call 804833c <_init+0x58>
8048476: 83 c4 10 add $0x10,%esp
8048479: b8 00 00 00 00 mov $0x0,%eax
804847e: c9 leave
804847f: c3 ret
当出现Segmentation的时候,程序停留在804846c: 68 e8 84 04 08 push $0x80484e8这一行,也就是说无法PUSH,如果你这个时候看ESP,已经超出了0xbfffffff-8M的范围,所以才由你说的结果。但是如果你不用printf的话,ESP只是减小了,但是由于没有对相应的内存进行操作,就不会出现SegmentationFault。
另外一点就是,栈的大小不光有你的buf,还有各种环境变量以及argv,都需要占空间的
HostOOP
2003-12-19
打赏
举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
int main()
{
struct rlimit lmt;
getrlimit(RLIMIT_STACK,&lmt);
printf("rlim_cur=%u,rlim_max=%u\n",lmt.rlim_cur,lmt.rlim_max);
}
在我的机器上(Linux Kernel版本为2.4.18-3)输出结果为:
rlim_cur=8388608,rlim_max=4294967295
说明当前的堆栈空间为8M,但作为扩展,最大可支持4G(理论值)
fierygnu
2003-12-19
打赏
举报
回复
用getrlimit(RLIMIT_STACK, ...)获取。
HostOOP
2003-12-19
打赏
举报
回复
说错了,应该是“定义char buf[7*1024*1024];
运行正确”
HostOOP
2003-12-19
打赏
举报
回复
我认为CoolQ() 兄说得对,定义char buf[8*1024*1024];
运行正确,说明Linux可以支持8M的内存空间。我的Linux Kernel版本是2.4.18-3
jian
2003-12-19
打赏
举报
回复
xuexi
CoolQ
2003-12-19
打赏
举报
回复
一个进程的堆栈空间只有8K?
那是内核空间,不是用户空间,不是一个概念的。
而且内核堆栈也不是8K,而是和一个进程的task_struct公用8K空间,两个的增长方式不一样而已。
用户空间的栈的实现方式,你去看看exec的内核源代码吧,具体我记不太清楚了,现在没有时间搞这些东西.至于 wildhorseych() 说的自动扩展,那个没有问题,但是也得有一些限制阿.
CoolQ
2003-12-19
打赏
举报
回复
我的标准是按照2.4.7-10的内核来测试的,不知道高版本是不好一些。
CoolQ
2003-12-19
打赏
举报
回复
是2M么?好像是8M吧?
linux
进程
栈
和线程
栈
大小,
Linux
进程
栈
和线程
栈
参考资料:总结:1、
进程
的
栈
大小是在
进程
执行的时刻才能指定的,即不是在编译的时候决定的,也不是在链接的时候决定的2、
进程
的
栈
大小是随机确定的至少比线程
栈
要大,但是不到线程
栈
大小的2倍3、线程
栈
大小是固定的,也就是ulimit -a 显示的值查看线程
栈
大小:可以看到默认情况下线程
栈
大小为8192(8MB),可以使用ulimit -s xxx修改线程默认
栈
大小(1)检查线程
栈
默认大小(8KB)线程执行...
Linux
中
的各种
栈
:
进程
栈
线程
栈
内核
栈
中
断
栈
Linux
中
的各种
栈
:
进程
栈
线程
栈
内核
栈
中
断
栈
栈
的作用1. 函数调用2. 多任务支持
Linux
中
有几种
栈
?各种
栈
的内存位置?1.
进程
栈
2. 线程
栈
3.
进程
内核
栈
4.
中
断
栈
Linux
中
的各种
栈
:
进程
栈
线程
栈
内核
栈
中
断
栈
栈
的作用 首先,
栈
(stack) 是一种串列形式的数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:
栈
顶 top) 进行推入 (push) 和弹出 (pop) 操作。根据
栈
的特点,很容易的想到
Linux
中
的
进程
栈
和线程
栈
Linux
中
的
进程
栈
和线程
栈
深入理解
linux
下
进程
和线程的
空间
分配,
进程
栈
和线程
栈
的
空间
分配
最近学习了下
linux
下
进程
和线程
空间
的分配原理,觉得有必要坐下总结, 关于
进程
栈
和线程
栈
总结: (1)
进程
栈
大小时执行时确定的,与编译链接无关 (2)
进程
栈
大小是随机确认的,至少比线程
栈
要大,但不会超过2倍 (3)线程
栈
是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改 (4)一般默认情况下,
linux
默认
进程
栈
大小,
linux
线程
栈
大小的设置
线程应用程序最常见导致创建线程失败的原因是线程
栈
大小的设置。创建
一个
新的线程,默认情况下系统为线程
栈
预留了2MB的寻址
空间
。线程
栈
起始于
进程
虚拟内存的高端地址,并向虚拟内存底端地址方向扩展。取决于线程本身的大小以及其它线程内存分配的情况,
进程
虚拟地址
空间
消耗过快可能导致创建线程失败。这里有
一个
测试程序可以看到,
Linux
下最多可以创建多少个线程。#include#include#includevo...
Linux/Unix社区
23,124
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章