我有一个关于Linux线程和进程的简单问题。
Linux中的进程有一个单独的虚拟地址空间,由
组成- stack
- heap
- bss
- code/text
- data
进程内部可以有'n'个线程。我知道它们共享进程的地址空间。但是由于不同线程执行的函数调用可能不同,所以线程是否有单独的堆栈段?
答案 0 :(得分:2)
两者都是真的。我知道他们听起来很矛盾。
第一个线程的堆栈使用所谓的“堆栈段”。它由内核分配。
# cat /proc/self/maps
...
7fffbe0b0000-7fffbe0d1000 rw-p 00000000 00:00 0 [stack]
...
稍后创建的线程(例如由pthread_create()或clone(CLONE_VM)创建)使用堆(或私有匿名mmap,它在各方面与堆相同)作为其堆栈。它由用户程序分配并传递给clone()。
简而言之,每个线程都使用一个单独的堆栈。所有线程都可以读/写每个其他线程的堆栈。
答案 1 :(得分:1)
是的,在POSIX threading模型下,每个线程都有自己的堆栈。