Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66618
  • 博文数量: 30
  • 博客积分: 1260
  • 博客等级: 中尉
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 12:27
文章分类

全部博文(30)

文章存档

2010年(30)

我的朋友

分类: LINUX

2010-06-29 12:33:46

有一个问题,在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的栈区,只不过,每个线程在这个大栈区使用不同的小块而已.

阅读(3199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~