【来自谢宝友同学的微信群】线程创建之后栈大小还可调整吗?
本文是原「蜗窝讨论区」的历史存档(2017-09-06),来自版块「Linux kernel技术问答」,共 1 帖。讨论区已停止服务,此处仅供查阅。
最近遇到一个奇怪的问题,线程创建都是使用统一接口创建的,线程栈默认8M,但是有个别线程栈几十M?线程栈不是创建之初就确定了吗?线程创建之后栈大小还可调整吗?
这里的栈,要分两种情况讨论: 1、线程组里面的Leader线程的栈,即main函数所在的线程的栈 2、通过pthread_create创建的线程的栈。
内核在处理Leader线程的栈的时候,一般是自动扩展,直到vma虚拟地址空间无法扩展。这在内核的do_page_fault函数中有专门的expend_stack处理。这个栈的大小,一般很大,几乎可以认为不受限制。
对于第2种情况,即pthread_create创建的线程,其栈地址从进程高地址向下分配,每个线程的栈大小,在创建线程的时候可以指定。下一个创建的线程,会紧跟在上一个线程的栈地址空间。两个栈之间,会有一个大小为PAGE_SIZE的,属性为“不可读不可写”的vma,作为两个栈之间的保护墙,防止栈之间越界。这种栈不能自动扩展,也不能随意扩大。
pthread栈是自定义的mmap出来的vma,只在底部有一个4KB保护墙,确实在高处有可能和其他的mmap出来的VMA发生合并。
