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