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 の相対距離があり (これはデフォルト値です。別の値に設定することもできます)、スタック オーバーフローを検出するために、上部の 1 ページが保護されます。

一番下にあるのは「メイン」スタックです。この例では、次のものに到達するまで成長できます。

于 2013-08-09T14:46:24.623 に答える