繁体   English   中英

memory 中的线程在哪里?

[英]Where threads are located in memory?

干草
我对 memory 中的线程位置有疑问,线程堆栈位于何处? 有没有办法显示它(使用 gdb、readelf 或类似的东西)

有没有办法显示它...使用 gdb...?

当然,GDB 可以显示任何线程的堆栈。 我不记得命令,但它们就在手册中。 ISTR,有一个命令可以列出所有线程,还有一个命令用来告诉它你想查看哪个线程。 其他一切都像单线程程序一样工作。

我认为还有一种方法可以告诉 GDB 迭代线程(即,对程序中的每个线程执行一次命令,例如转储堆栈一次。)

线程堆栈位于哪里?

嗯,它位于memory。

严重地。 你为什么想知道? 在我听说过的大多数编程环境中,一个线程的整个堆栈都是一次性分配的,而且它不能增长。 如果默认大小不够大,程序通常有一些方法可以说明它需要多大的新线程堆栈。

在 Linux 中,程序通常会通过使用允许操作系统选择虚拟地址的 arguments 调用“mmap(...)”来为新线程的堆栈获取空间。 但是,它没有理由必须以这种方式工作。 如果有意义的话,程序可以从堆中分配堆栈。

在其他操作系统中,可能有一些类似于 mmap 的机制让操作系统选择地址。


如果你想要一个确切的答案,它在堆和堆栈之间的 memory

如果您将 go 追溯到 30 年或更长时间,类 Unix 操作系统中的进程将获得一个连续的虚拟 memory 块,通常从第一页开始(零页将未分配,因为如果程序遵循NULL pointer.) The lowest addresses would contain the program's "text" segment (eg, its code and immutable strings), then the "data" segment (initialized static variables), then the "bss" segment (uninitialized static variables.)

从 BSS 的顶部到给定 VM 区域的顶部的一切都是“荒野”(即,未触及)。 程序的堆会从底部增长到荒野,而它唯一的调用堆栈将从顶部向下增长到荒野。 如果堆和堆栈曾经相遇,那么你会得到一个“堆栈溢出”或malloc()错误。

现在事情变得更加复杂了,一个程序可以有几十个甚至几百个调用堆栈。 现在的 Linux 程序可以使用“mmap(...)”来创建额外的 VM 区域,而不是那种“荒野”——既可以用于新线程的堆栈,也可以添加到堆中,或者 map 将文件放入 ZECD687BF4957D19808 以进行随机访问.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM