线程在内存中的位置?
Where threads are located in memory?
干草
我对线程在内存中的位置有疑问,
线程堆栈位于何处?有没有办法显示它(使用 gdb、readelf 或类似的东西)
is there a way to display it...using gdb...?
当然,GDB 可以显示任何线程的堆栈。我不记得这些命令,但它们就在手册中。 ISTR,有一个命令可以列出所有线程,还有一个命令可以用来告诉它你想查看哪个线程。其他一切都像单线程程序一样工作。
我认为还有一种方法可以告诉 GDB 迭代线程(即,对程序中的每个线程执行一次单个命令,例如转储堆栈。)
Where is threads stack located?
嗯,它位于内存中。
说真的。你为什么想知道?在我听说过的大多数编程环境中,一个线程的整个堆栈都是一次性分配的,而且它不能增长。如果默认大小不够大,程序通常会通过某种方式说明它需要多大的新线程堆栈。
在Linux中,程序通常会通过使用允许OS 选择虚拟地址。但是,没有理由 必须 那样工作。如果有意义的话,程序可以从堆中分配堆栈。
在其他操作系统中,可能有一些类似于 mmap 的机制让 OS 选择地址。
if you want an exact answer it is in the memory between heap and stack
如果你回到三十年前,类 Unix OS 中的进程将被分配一个连续的虚拟内存块,通常从第一页开始(零页将未分配,因为那是如果程序遵循 NULL 指针,则会出现段错误。)最低地址将包含程序的“文本”段(例如,它的代码和不可变字符串),然后是“数据”段(初始化的静态变量),然后是“bss” " 段(未初始化的静态变量。)
从 BSS 顶部到给定 VM 区域顶部的所有内容都是“荒野”(即未触及)。该程序的堆将从底部增长到荒野,而它唯一的调用堆栈将从顶部向下增长到荒野。如果堆和栈曾经相遇,那么你会得到一个“栈溢出”或者一个 malloc()
错误。
现在事情变得更加复杂,一个程序可以有几十个甚至几百个调用堆栈。如今,Linux 程序可以使用 'mmap(...)` 创建额外的 VM 区域,而不是那种“荒野”,或者用于新线程的堆栈,或者添加到堆,或者将文件随机映射到内存中访问。
干草
我对线程在内存中的位置有疑问,
线程堆栈位于何处?有没有办法显示它(使用 gdb、readelf 或类似的东西)
is there a way to display it...using gdb...?
当然,GDB 可以显示任何线程的堆栈。我不记得这些命令,但它们就在手册中。 ISTR,有一个命令可以列出所有线程,还有一个命令可以用来告诉它你想查看哪个线程。其他一切都像单线程程序一样工作。
我认为还有一种方法可以告诉 GDB 迭代线程(即,对程序中的每个线程执行一次单个命令,例如转储堆栈。)
Where is threads stack located?
嗯,它位于内存中。
说真的。你为什么想知道?在我听说过的大多数编程环境中,一个线程的整个堆栈都是一次性分配的,而且它不能增长。如果默认大小不够大,程序通常会通过某种方式说明它需要多大的新线程堆栈。
在Linux中,程序通常会通过使用允许OS 选择虚拟地址。但是,没有理由 必须 那样工作。如果有意义的话,程序可以从堆中分配堆栈。
在其他操作系统中,可能有一些类似于 mmap 的机制让 OS 选择地址。
if you want an exact answer it is in the memory between heap and stack
如果你回到三十年前,类 Unix OS 中的进程将被分配一个连续的虚拟内存块,通常从第一页开始(零页将未分配,因为那是如果程序遵循 NULL 指针,则会出现段错误。)最低地址将包含程序的“文本”段(例如,它的代码和不可变字符串),然后是“数据”段(初始化的静态变量),然后是“bss” " 段(未初始化的静态变量。)
从 BSS 顶部到给定 VM 区域顶部的所有内容都是“荒野”(即未触及)。该程序的堆将从底部增长到荒野,而它唯一的调用堆栈将从顶部向下增长到荒野。如果堆和栈曾经相遇,那么你会得到一个“栈溢出”或者一个 malloc()
错误。
现在事情变得更加复杂,一个程序可以有几十个甚至几百个调用堆栈。如今,Linux 程序可以使用 'mmap(...)` 创建额外的 VM 区域,而不是那种“荒野”,或者用于新线程的堆栈,或者添加到堆,或者将文件随机映射到内存中访问。