gpt4 book ai didi

linux - 多线程进程的内存布局

转载 作者:IT王子 更新时间:2023-10-29 00:41:07 24 4
gpt4 key购买 nike

好吧,我知道有一个堆对于所有向上增长的线程都是通用的,我们有每个向下增长的线程的堆栈(真的是这样,堆栈向下增长还是只是一个简单的观点? ).我什至在某处读到堆栈可以成为堆空间的一部分。
这些堆栈是如何放置的?一个在另一个之上?如果顶部的堆栈溢出并尝试写入其下方的堆栈,会发生什么情况?真的是这样吗?请详细查看。

最佳答案

我刚刚在交互式解释器中用一个简短的 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(这是默认值;可以设置为其他值),并且保护顶部的一页以检测堆栈溢出。

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

关于linux - 多线程进程的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18149218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com