说说Linux线程的栈空间

 

刚接触C编程时, 比较喜欢用局部变量, 因为局部变量是在栈上分配的,
会自动释放, 不会造成内存泄漏, 碎片什么的,觉得比malloc/new 出来的
堆内存好使多了,大家可能说malloc/new可以分配动态内存,其实linux/win32
的大多数平台提供了一个类似的函数alloca也可以来动态的分配栈内存。

 

栈变量正用得不亦乐乎的时候,悲剧发生了, 程序运行中老是出现莫名其妙的错误,
特别是Segmentation fault出现得尤其频繁。初步检查原因, 应该跟多线程有关,
最后总算查出了罪魁祸首:栈溢出!

 

程序的局部变量,用alloca分配的内存空间超出了栈空间的最大值,程序当然会死得很难看。
其实针对多线程程序来说,为了防止每个线程占用过多内存, 它们会被规定一个最大栈空间,
如果用户程序没有显式指定大小的话, 系统就会分配一个缺省值,这个值在不同的平台可能会
不一样,比如x86系统往往是10M, MIPS可能是8M, ARM一般是4M或者2M, 可以用ulimit命令查到。
但有一点需要注意,这个查到的栈空间是子线程的,主线程往往会比这个值大很多,

所以栈溢出一般都发生在子线程中。

 

由于有了栈溢出的风险, 所以大空间的局部变量,alloca的参数过大都是要避免的,
如果非得要用大内存,就请考虑堆空间吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值