Linux线程和进程

3

我有一个关于Linux线程和进程的简单问题。

在Linux中,进程具有独立的虚拟地址空间,其中包括:

- stack
- heap
- bss
- code/text
- data

一个进程内部可以有多个线程。我知道它们共享进程的地址空间。

但是,由于不同线程执行的函数调用可能不同,那么线程是否有单独的堆栈段?


是的,每个线程都有自己的堆栈等等。 - Clarus
2个回答

2
  1. 线程共享所有的内存段,包括堆栈段。
  2. 每个线程都有一个独立的堆栈。

这两个陈述都是正确的。虽然听起来有些矛盾。

第一个线程的堆栈使用所谓的“堆栈段”。它由内核分配。

# cat /proc/self/maps
...
7fffbe0b0000-7fffbe0d1000 rw-p 00000000 00:00 0                          [stack]
...

稍晚创建的线程(例如由pthread_create()clone(CLONE_VM)创建的线程)使用堆(或私有匿名mmap,在所有方面都与堆相同)作为它们的栈。它由用户程序分配并传递给clone()
简而言之,每个线程使用单独的栈。所有线程都可以读写其他线程的栈。

1
在这种情况下,“堆栈段”寄存器很可能不指向进程的堆栈段(除了原始线程之外)。 - Ben Voigt
@BenVoigt: "堆栈段"寄存器是旧x86的分段内存概念,不适用于Linux或任何现代操作系统。在x86 Linux上,堆栈段寄存器设置为与数据段寄存器相同的值,两者都引用具有零偏移量的完整4GB线性内存范围的受保护模式选择器。 "堆栈段"与实际用于堆栈的此线性内存的哪个部分无关。 - R.. GitHub STOP HELPING ICE
@WuYongzheng - 正是我在寻找的答案。 - liv2hak
@WuYongzheng:在这种情况下,注释是错误的。每个线程都有自己完整的寄存器值集,包括堆栈指针。或者我可能误读了他的意思……?不太清楚。 - R.. GitHub STOP HELPING ICE
@liv2hak,是的,有的。RTFM。另一种学习方法是使用strace。尝试strace echo 1 2>&1 | grep MAP_PRIVATE.*MAP_ANONYMOUS - Wu Yongzheng
显示剩余3条评论

1

是的,在POSIX线程模型下,每个线程都有自己的堆栈。


这是否意味着在进程的堆栈段中为每个线程保留了单独的区域?据我所知,线程之间的切换是由进程自身完成的,而不会受到操作系统调度程序的干扰? - liv2hak
2
@liv2hak 什么?线程管理是操作系统内核调度程序的职责。 - Martin James
@Jim Lewis - 请参见http://stackoverflow.com/questions/9651871/whats-the-difference-between-the-threadsand-process-in-kernel-mode-and-ones-i。 - liv2hak
@liv2hak:你链接的问题的答案解释了Linux不使用用户空间线程调度(实际上,由于信号和阻塞系统调用语义,基本上不可能以这种方式实现POSIX线程)。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接