4

好吧,我知道所有向上增长的线程都有一个共同的堆,并且我们为每个向下增长的线程都有堆栈(真的是这样,堆栈向下增长还是只是一个简单的视图?)。我什至在某处读到堆栈可以成为堆空间的一部分。
这些堆栈是如何放置的?一个高于另一个?如果顶部的堆栈溢出并试图写入它下面的堆栈会发生什么?真的是这样吗?请详细查看。

4

1 回答 1

2

我刚刚在交互式解释器中用一个简短的 Python“程序”对其进行了测试:

import threading
import time
def d(): time.sleep(120)
t = [threading.Thread(target=d) for _ in range(250)]
for i in t: i.start()

然后我按下^Z并查看了此过程的相应/proc/.../maps文件。

它向我展示了

00048000-00049000 ---p 00000000 00:00 0
00049000-00848000 rw-p 00000000 00:00 0          [stack:28625]
00848000-00849000 ---p 00000000 00:00 0
00849000-01048000 rw-p 00000000 00:00 0          [stack:28624]
01048000-01049000 ---p 00000000 00:00 0
01049000-01848000 rw-p 00000000 00:00 0          [stack:28623]
01848000-01849000 ---p 00000000 00:00 0
01849000-02048000 rw-p 00000000 00:00 0          [stack:28622]
...
47700000-47701000 ---p 00000000 00:00 0
47701000-47f00000 rw-p 00000000 00:00 0          [stack:28483]
47f00000-47f01000 ---p 00000000 00:00 0
47f01000-48700000 rw-p 00000000 00:00 0          [stack:28482]
...
bd777000-bd778000 ---p 00000000 00:00 0
bd778000-bdf77000 rw-p 00000000 00:00 0          [stack:28638]
bdf77000-bdf78000 ---p 00000000 00:00 0
bdf78000-be777000 rw-p 00000000 00:00 0          [stack:28639]
be777000-be778000 ---p 00000000 00:00 0
be778000-bef77000 rw-p 00000000 00:00 0          [stack:28640]
bef77000-bef78000 ---p 00000000 00:00 0
bef78000-bf777000 rw-p 00000000 00:00 0          [stack:28641]
bf85c000-bf87d000 rw-p 00000000 00:00 0          [stack]

这显示了我已经怀疑的内容:堆栈分配的相对距离(希望)足够大。

堆栈的相对距离为 8 MiB(这是默认值;可以另外设置),顶部的一页受到保护以检测堆栈溢出。

底部的一个是“主”堆栈;它可以 - 在这个例子中 - 增长直到达到下一个。

于 2013-08-09T14:46:24.623 回答