【问题标题】:Linux threads and processesLinux 线程和进程
【发布时间】:2014-08-26 23:14:26
【问题描述】:

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

Linux 中的进程有一个单独的虚拟地址空间,由

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

一个进程内部可以有'n'个线程。我知道它们确实共享进程的地址空间。但是由于不同线程执行的函数调用可能不同,线程是否有单独的堆栈段.?

【问题讨论】:

  • 是的,每个线程都有自己的堆栈等等。

标签: c linux multithreading


【解决方案1】:
  1. 线程共享所有内存段,包括堆栈段。
  2. 每个线程都有一个单独的堆栈。

两者都是正确的。我知道它们听起来很矛盾。

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

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

稍后创建的线程(例如,由 pthread_create() 或 clone(CLONE_VM) 创建)使用堆(或在各方面与堆相同的私有匿名 mmap)作为其堆栈。它由用户程序分配并传递给 clone()。

简而言之,每个线程使用一个单独的堆栈。所有线程都可以读取/写入其他线程的堆栈。

【讨论】:

  • 在这种情况下,“堆栈段”寄存器可能不指向进程的堆栈段(除了原始线程)。
  • @BenVoigt:“堆栈段”寄存器是来自旧 x86 的分段内存概念,不适用于 Linux 或任何现代操作系统。在 x86 Linux 上,堆栈段寄存器被设置为与数据段寄存器相同的值,并且两者都引用了一个保护模式选择器,用于具有零偏移的完整 4GB 线性内存范围。 “堆栈段”与该线性内存的哪个部分实际用于堆栈无关。
  • @BenVoigt 完全正确。线程 X 的堆栈指针(例如 esp)指向内存区域 Y 就是我所说的线程 X 使用 Y 作为其堆栈的意思。
  • @R..,我认为 BenVoigt 的意思是堆栈指针,而不是堆栈段。现在没人关心段寄存器了。
  • @WuYongzheng - 正是我正在寻找的答案。
【解决方案2】:

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

【讨论】:

  • 这是否意味着在堆栈段中为进程中的每个线程保留了一个单独的区域? AFAIK线程之间的切换是由进程本身完成的,不受操作系统调度程序的干扰?
  • @liv2hak 什么?线程管理是 OS 内核调度程序/调度程序的职责。
  • @liv2hak:您链接的问题的答案解释了 Linux 不使用用户空间线程调度(事实上,由于信号和阻塞系统调用语义,基本上不可能以这种方式实现 POSIX 线程)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2011-03-24
  • 2011-01-18
  • 2012-01-17
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多