2011-02-05 8 views
0

申し訳ありませんが、簡単な質問ですが、それはオペレーティングシステムの理論について話すとき、私をいつも混乱させるものです。OSによって呼び出されるすべてのルーチンは、独自の「スタック」を作成しますか?

「スタック」を使ってリエントラントが可能になったと私の本は主張しています - これは「スタック」が1つあり、何とかすべてのルーチン間で共有されているか、スタックのアイデア、およびスタックが作成され、サブルーチンが呼び出されるたびにメインメモリに格納されますか? (それが必要であると仮定して)。

この場合、CPUのスタックポインタはどうなりますか?どちらの場合でも、どのように機能しますか?

私の説明の漠然とした謝罪は、全体のアイデアは私のために矛盾したアイデアに覆われているだけです!

答えて

2

これはプラットフォーム固有です(使用されるハードウェアとソフトウェアによって異なります)。

x86/x64上のWindowsには、スレッドごとにシステムスタック用のメモリが用意されています。そのスレッドでシステムコールを行うたびに再利用されます。

複数の独立したプロセスまたはスレッドが同時にシステムルーチンを呼び出すことができる場合、システムは再入可能です。この場合、それらのスレッドはそれぞれ独自のシステムスタックを使用します。システムスタック(技術的にはリング0のスタック)は、ユーザモード(リング3)スタックから独立しています。

さらに詳しい情報を提供することもできます。より具体的な情報をご希望の場合は、尋ねてください。

スタックポインタ:

  • 通常の実行時には、各スレッドは、独自の通常のスタックと、独自のスタックポインタを持っています。
  • 特定のスレッドがオペレーティングシステムルーチンを呼び出すと、現在のスタックポインタ値が格納され、スタックポインタは常に同じアドレスシステム(リング0)スタックに設定されます。
  • 各スレッドには独自のシステム(リング0)スタックがあります。
  • システムコールが終了すると、スタックポインタの元の値が復元されます。ここで実際にはシステムスタックを放棄して通常のスタックに戻ります。
  • コンパイラ/リンカーに「通常」スタックのサイズが設定されています。それはメガバイトに成長することができます。しかし、システムスタックは静的なサイズが限られており、場所やサイズを変更することはできません。それはどんなシステムコールもそこに収まるように非常に大きく作成されます。
  • システムルーチンが内部的に別のシステムルーチンを呼び出す場合、これはハードウェアによって検出され、直接呼び出されます。つまり、スタックポインタの特別な配置は行われません。
+0

スレッドが別のスレッドを別々に通過し、スレッドがクリティカルセクションにある間にスタックが使用され、プロセスがクリティカルセクションを通過した後にスタックが空になって、次のスレッドで再利用できるようにする必要があります。スレッド/プロセス? :) – user476033

+0

いいえ。セキュリティ上の理由から、各スレッドには独自のシステムスタック(または3つのシステムスタックのセット)があります。 –

+0

OK、私は答えにスタックポインタに関する情報を追加しました。すべての情報は、主にx86/x64およびWindowsに関連しています。 (すべての実装固有です。) –

関連する問題