プロセス関連スタックとはどういう意味ですか?

プロセス関連スタックとはどういう意味ですか?

本からUnix環境の高度なプログラミングUnixファミリーシステムのスレッドについては、以下を読みました。

プロセス内のすべてのスレッドは、同じアドレス空間、ファイル記述子、スタック、およびプロセス関連の属性を共有します。同じメモリにアクセスできるため、不整合を防ぐために、スレッド間で共有データへのアクセスを同期する必要があります。

作家はstacksここで何を表現したいですか?私はJavaプログラミングの分野で働いており、各スレッドには独自のスタックがあることを知っています。だから私は混乱しています。共有 stacksコンセプトはここにあります。

ベストアンサー1

UnixまたはLinuxプロセスの文脈では、「スタック」という語句は2つのことを意味できます。

まず、「スタック」は、制御フローへの呼び出し順序の後入れ先出しレコードを表すことができます。プロセスが実行されると、main()まず呼び出されます。main()に電話できますprintf()。コンパイラによって生成されたコードは、フォーマット文字列のアドレスと他のパラメータをprintf()いくつかのメモリ位置に書き込みます。その後、コードはprintf()完了後に制御フローを返す必要があるアドレスに書き込みます。その後、コードは呼び出しの先頭にジャンプまたは分岐しますprintf()。各スレッドには、これらの関数アクティブ化レコードスタックの1つがあります。多くのCPUにはスタックを設定および保守するためのハードウェアガイドラインがありますが、他のCPU(IBM 360または他の名前)は実際にはアドレス空間全体に分散できる接続のリストを使用しています。

第二に、「スタック」は、CPUが関数に引数を書き込むメモリ位置と、呼び出された関数が返されるべきアドレスを示します。 「スタック」は、プロセスアドレス空間の連続した部分を表します。

Unix、Linux、または* BSDプロセスのメモリは、約0x400000で始まり、約0x7fffffffffffff(x86_64 CPU)で終わる長い行です。スタックアドレス空間は、最大の数値アドレスから始まります。関数が呼び出されるたびに、関数アクティブ化レコードスタックは「成長」します。プロセスコードは、関数パラメータと戻りアドレスをアクティブなレコードスタックに配置し、プロセスの現在を追跡する特別なCPUレジスタであるスタックポインタを減らします。変数の値はスタックのアドレス空間にあります。

各スレッドには、独自の使用のために「スタック」(スタックアドレス空間)フラグメントが提供され、スタックを関数アクティブとして記録します。 0x7ffffffffffと下位アドレスの間の各スレッドには、関数呼び出し用に予約されたメモリ領域があります。通常、これはハードウェアではなく慣例に従って実施されます。したがって、スレッドがネストされた関数の後に関数を呼び出すと、そのスレッドスタックの一番下が他のスレッドスタックの一番上を上書きする可能性があります。

したがって、各スレッドには「スタック」メモリ領域があり、「共有スタック」という用語が由来しています。これは、プロセスアドレス空間を単一の線形メモリブロックとして使用し、「スタック」という用語を使用した結果である。一部の古いJVM(非常に古い)には、実際には1つのスレッドしかないと確信しています。 Javaコードのすべてのスレッドは、実際には単一の物理スレッドによって実行されます。最新のJVM(Javaスレッドを実行するために実際のスレッドを呼び出すこと)は、前述のものと同じ「共有スタック」を持ちます。 LinuxとPlan 9には、アドレス空間の一部と異なるスタックアドレス空間を共有するプロセスを設定できるプロセス起動システムコール(Linuxではclone()、Plan 9ではrfork())がありますが、このスタイルスレッドは絶対に本当に捕らえられましたええと。

おすすめ記事