关闭

多线程中栈空间的分配 http://biancheng.dnbcw.info/linux/303270.html

431人阅读 评论(0) 收藏 举报
分类:
有一个问题,在LinuxThread线程模型的实现中,管理线程的栈与其它线程的栈之间是什么关系?
在回答这些问题前,让我们先看一下Linux的内存空间模型:
从上图可提取以下三点信息:
  1. 进程栈空间从0xC0000000往下进行分配
  2. 运行时堆通过malloc进行分配,位置处于.bss与0x40000000之间
  3. 在Glibc的malloc中,对于小于128k的需求,直接从堆中分配,而大于128k的需求则通过mmap从文件映射区之后分配,因此地址会大于0x40000000.

因此,对于以LinuxThread实现的多线程而言,要区分以下两种情况:

  1. 管理线程,管理线程的堆栈与普通进程无异,即以上提到的三点
  2. 普通线程,因为管理线程会在进程堆中申请一块空间(THREAD_MANAGER_STACK_SIZE=8M?)当作自已的运行栈,而我们知道,大于128k的malloc会采用mmap方式从文件映射区之后分配,所以,普通线程的栈地址就在这个空间内,即大于0x40000000

对于NPTL,因其不使用管理线程,因此,该进程中所有的线程都在小于0xC0000000的栈区,只不过,每个线程在这个大栈区使用不同的小块而已.

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类