有一个问题,在LinuxThread线程模型的实现中,管理线程的栈与其它线程的栈之间是什么关系?
在回答这些问题前,让我们先看一下Linux的内存空间模型:
从上图可提取以下三点信息:
- 进程栈空间从0xC0000000往下进行分配
- 运行时堆通过malloc进行分配,位置处于.bss与0x40000000之间
- 在Glibc的malloc中,对于小于128k的需求,直接从堆中分配,而大于128k的需求则通过mmap从文件映射区之后分配,因此地址会大于0x40000000.
因此,对于以LinuxThread实现的多线程而言,要区分以下两种情况:
-
管理线程,管理线程的堆栈与普通进程无异,即以上提到的三点
-
普通线程,因为管理线程会在进程堆中申请一块空间(THREAD_MANAGER_STACK_SIZE=8M?)当作自已的运行栈,而我们知道,大于128k的malloc会采用mmap方式从文件映射区之后分配,所以,普通线程的栈地址就在这个空间内,即大于0x40000000
对于NPTL,因其不使用管理线程,因此,该进程中所有的线程都在小于0xC0000000的栈区,只不过,每个线程在这个大栈区使用不同的小块而已.
阅读(3223) | 评论(0) | 转发(0) |