2009-04-12 4 views
11

ブートローダがオペレーティングシステムをロードするたびに、おそらく1つのプログラムフローだけがアクティブになっているでしょうか?これは、1つのプロセッサが命令ポインタを保持し、EIPレジスタが指し示す位置で見つかったコマンドを実行することを意味する。どの時点でシステムがより多くのプロセスやスレッド(ユーザーランドスレッドではなくCPUスレッド)を悪用し始めますか?低レベルプログラミング:OSはどのように新しいスレッド/プロセスを開始しますか?

答えて

5

OSは、(BIOSとブートローダが完了した後で)特別な役割で起動します - 実行する最初のプログラムは直接実行されるためすべてのCPUコマンドへのアクセス。

したがって、Interrupt Handlers(または割り込みサービスルーチン)のように、システムのさまざまな部分をセットアップします。これを実行すると、「スケジューラ」を作成することができます。

実際の「プロセス/スレッド」の処理は、このスケジューラによって行われます。どのスレッドが実行されるかが決定されます。また、すべてのアクティブなスレッドを管理します。 CPUはこれらすべてのことを知らない。

スレッド(または「プロセス」)Aを実行することを決定すると、スケジューラのメインエグゼクティブは、プロセスデータをレジスタにコピーします(レジスタを最近実行したスレッドのInfoBlockに格納します)。それはCPU /タイマにnマイクロ秒(または他のタイムユニット)の割り込みを引き起こすように指示します。次にCPUに非OSモードで "プログラム"(CPUが知っている唯一のもの)を実行するように指示します(それにより、重要なデータを変更したり、独自の割り込みハンドラを無許可で登録することはできません)。

スレッドAが実行されている間、ハードウェアタイマーが実行されます。希望のタイムオフセットに達すると、割り込みが発生します。ハードウェアは現在のプログラムの実行を停止し、代わりに登録済みInterrupt Handlerを呼び出します。このハンドラは、スケジューラのメソッド(正確には、再びメインエグゼクティブ)になります。

このメソッドは、どのスレッドをスケジュールする必要があるかを再評価し、スケジューリングを続行します。

+0

ありがとうございます。いくつかの独立したプロセッサ/コアが関わっているときに、この画像がどのように変化するか教えてください。 – prinzdezibel

+0

ほとんどのマルチコアには、少なくともいくつかの「マスタ」プロセッサがあります(他の回答を参照)。L1 +キャッシュは集中管理なしでは機能しません。スケジューラは、各レジスタ操作に対して所望のプロセッサをアドレス指定するだけでよい。それ以外はすべて同じ(固定間隔タイマ)を保持します。 –

+0

@prinzdezible:OSスケジューラは、通常、現在のスレッドが割り込みまたはシステムコールを介して停止しているときに、各CPUコアで実行されます。多くのコアにスケーラビリティを持たせるために、すべてのスレッドを見るのではなく、そのCPUに割り当てられたスレッドだけを見ます。余りにもビジーであれば、スレッドを他のCPUにプッシュします。ビジーでない場合は、他のCPUからスレッドを引き出します。スケジューラは時間やカウンタによって頻繁にすべてのCPU上でタスクを負荷分散します(これは遅いため頻繁ではありません) –

3

最初にa(マルチスレッド)OSを起動する必要があるのは、複数のプロセスを管理するスケジューラです(マルチコアマシンなどの複数のCPUスレッドも管理します)。

このスケジューラによって開始される最初のプロセスは、通常、ある種の「init」プロセスであり、これは後で他のプログラム/プロセスをロードする責任があります。

4

正しいですが、ブートプロセス中に実行スレッドは1つだけです。通常、これは、OSが低レベルのメモリ管理、スケジューラなどが機能するように初期化されるまでのケースです。

これは、マルチCPUシステムの場合でもそうです.1つのコアは、インフラストラクチャが他のコアをキックスタートさせるまで、初期起動を処理する「マスタープロセッサ」です。

最終的には、OS固有のものです。 Intel Architecture Software Developer's Manualsにはハードウェア仕様の詳細が記載されています。

関連する問題