我有一个关于Linux线程和进程的简单问题。
在Linux中,进程具有独立的虚拟地址空间,其中包括:
- stack
- heap
- bss
- code/text
- data
一个进程内部可以有多个线程。我知道它们共享进程的地址空间。
但是,由于不同线程执行的函数调用可能不同,那么线程是否有单独的堆栈段?
我有一个关于Linux线程和进程的简单问题。
在Linux中,进程具有独立的虚拟地址空间,其中包括:
- stack
- heap
- bss
- code/text
- data
一个进程内部可以有多个线程。我知道它们共享进程的地址空间。
但是,由于不同线程执行的函数调用可能不同,那么线程是否有单独的堆栈段?
这两个陈述都是正确的。虽然听起来有些矛盾。
第一个线程的堆栈使用所谓的“堆栈段”。它由内核分配。
# cat /proc/self/maps
...
7fffbe0b0000-7fffbe0d1000 rw-p 00000000 00:00 0 [stack]
...
pthread_create()
或clone(CLONE_VM)
创建的线程)使用堆(或私有匿名mmap,在所有方面都与堆相同)作为它们的栈。它由用户程序分配并传递给clone()
。strace echo 1 2>&1 | grep MAP_PRIVATE.*MAP_ANONYMOUS
。 - Wu Yongzheng是的,在POSIX线程模型下,每个线程都有自己的堆栈。