社区
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,原因很简单,栈内存分配得太多,我想知道一个进程的栈空间到底有多大?
...全文
2184
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
中
,
一个
进程
的
栈
空间
到底
有多大?
#include#includeintmain(intargc,char**argv){charbuf[8*1024*1024];sprintf(buf,"%sn",argv[1]);printf(buf);return0;}上面的程序运行时会出现Segmentationfault,原因很简单,
栈
内存分配得太多,我想知道
一个
进程
的
栈
空间
到底
有多大?|HostOOP(碧云黄花),你说的有...
更改
Linux
默认
栈
空间
的大小
有时候在
Linux
写C++程序处理大量的数据,程序内部需要分配很大的数组来存放一些数据,但有时候分配的数组太大的话运行时会出现段错误。这种情况可能是分配的数组大小超过了
Linux
系统的默认
栈
空间
的大小了,导致
栈
空间
不够分配,出现错误。 (1)查看
linux
默认
栈
空间
的大小 通过命令 ulimit -s 查看
linux
的默认
栈
空间
大小,默认情况下为8192 KB 即8MB。 (2)...
linux
下
栈
空间
大小(ulimit)
linux
下
栈
空间
大小 第一次写博客,很多地方写的不好请多见谅,希望这篇文章对大家有帮助。 首先说下为什么会写
linux
下
栈
空间
大小这个内容。在评审同事代码的时候发现代码
中
有两个函数互相调用,且无法退出导致申请的
栈
内存无法释放,因此要计算能支持多少次循环。其实这个问题不是太难,只要知道
栈
空间
大小,再除去申请的局部变量大小即可。
Linux
程序
栈
空间
的大小
在
Linux
系统
中
程序的内存
空间
一般被划分成两个区域:
栈
空间
和堆
空间
(其他
空间
区域本文不做讨论): 在
栈
上创建。在执行函数时,函数内局部变量的存储单元都可以在
栈
上创建,函数执行结束时这些存储单元自动被释放。
栈
内存分配运算内置于处理器的指令集
中
,效率很高,但是分配的内存容量有限。 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在...
一个
进程
最多可以创建多少个线程?
大家好,我是小林。 昨天有位读者问了我这么个问题: 大致意思就是,他看了
一个
面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。 其实他看这个面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。 因为不同的操作系统和不同位数的操作系统,虚拟内存可能是不一样多。 Windows 系统我不了解,我就说说
Linux
系统。 在
Linux
操作系统
中
,虚拟地址
空间
的内部又被分为内核
空间
和用户
空间
两部分,不同位数的系统,地址
空间
的范围也不同。比如最常
Linux/Unix社区
23,224
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章