我知道有一个堆对于所有向上增长的线程都是通用的,并且我们为每个向下增长的线程都有堆栈(它真的如此,堆栈向下增长还是只是一个简单的视图? )。我甚至读过堆栈可以成为堆空间一部分的地方 这些堆栈是如何放置的?一个在另一个之上?如果顶部的堆栈溢出并尝试在其下面写入堆栈会发生什么?它真的像这样吗? 请详细查看。
答案 0 :(得分:1)
我刚刚在交互式解释器中用一个简短的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(这是默认值;否则可以设置),并且顶部的一个页面受到保护,以便检测堆栈溢出。
底部的那个是“主”堆栈;它可以 - 在这个例子中 - 增长直到到达下一个。