说说Linux线程的栈空间
刚接触C编程时, 比较喜欢用局部变量, 因为局部变量是在栈上分配的,会自动释放, 不会造成内存泄漏, 碎片什么的,觉得比malloc/new 出来的堆内存好使多了,大家可能说malloc/new可以分配动态内存,其实linux/win32的大多数平台提供了一个类似的函数alloca也可以来动态的分配栈内存。 栈变量正用得不亦乐乎的时候,悲剧发生了, 程序运行中老是出现莫名其妙的
刚接触C编程时, 比较喜欢用局部变量, 因为局部变量是在栈上分配的,
会自动释放, 不会造成内存泄漏, 碎片什么的,觉得比malloc/new 出来的
堆内存好使多了,大家可能说malloc/new可以分配动态内存,其实linux/win32
的大多数平台提供了一个类似的函数alloca也可以来动态的分配栈内存。
栈变量正用得不亦乐乎的时候,悲剧发生了, 程序运行中老是出现莫名其妙的错误,
特别是Segmentation fault出现得尤其频繁。初步检查原因, 应该跟多线程有关,
最后总算查出了罪魁祸首:栈溢出!
程序的局部变量,用alloca分配的内存空间超出了栈空间的最大值,程序当然会死得很难看。
其实针对多线程程序来说,为了防止每个线程占用过多内存, 它们会被规定一个最大栈空间,
如果用户程序没有显式指定大小的话, 系统就会分配一个缺省值,这个值在不同的平台可能会
不一样,比如x86系统往往是10M, MIPS可能是8M, ARM一般是4M或者2M, 可以用ulimit命令查到。
但有一点需要注意,这个查到的栈空间是子线程的,主线程往往会比这个值大很多,
所以栈溢出一般都发生在子线程中。
由于有了栈溢出的风险, 所以大空间的局部变量,alloca的参数过大都是要避免的,
如果非得要用大内存,就请考虑堆空间吧!
更多推荐
所有评论(0)