ブートローダがオペレーティングシステムをロードするたびに、おそらく1つのプログラムフローだけがアクティブになっているでしょうか?これは、1つのプロセッサが命令ポインタを保持し、EIPレジスタが指し示す位置で見つかったコマンドを実行することを意味する。どの時点でシステムがより多くのプロセスやスレッド(ユーザーランドスレッドではなくCPUスレッド)を悪用し始めますか?低レベルプログラミング:OSはどのように新しいスレッド/プロセスを開始しますか?
答えて
OSは、(BIOSとブートローダが完了した後で)特別な役割で起動します - 実行する最初のプログラムは直接実行されるためすべてのCPUコマンドへのアクセス。
したがって、Interrupt Handlers(または割り込みサービスルーチン)のように、システムのさまざまな部分をセットアップします。これを実行すると、「スケジューラ」を作成することができます。
実際の「プロセス/スレッド」の処理は、このスケジューラによって行われます。どのスレッドが実行されるかが決定されます。また、すべてのアクティブなスレッドを管理します。 CPUはこれらすべてのことを知らない。
スレッド(または「プロセス」)Aを実行することを決定すると、スケジューラのメインエグゼクティブは、プロセスデータをレジスタにコピーします(レジスタを最近実行したスレッドのInfoBlockに格納します)。それはCPU /タイマにnマイクロ秒(または他のタイムユニット)の割り込みを引き起こすように指示します。次にCPUに非OSモードで "プログラム"(CPUが知っている唯一のもの)を実行するように指示します(それにより、重要なデータを変更したり、独自の割り込みハンドラを無許可で登録することはできません)。
スレッドAが実行されている間、ハードウェアタイマーが実行されます。希望のタイムオフセットに達すると、割り込みが発生します。ハードウェアは現在のプログラムの実行を停止し、代わりに登録済みInterrupt Handler
を呼び出します。このハンドラは、スケジューラのメソッド(正確には、再びメインエグゼクティブ)になります。
このメソッドは、どのスレッドをスケジュールする必要があるかを再評価し、スケジューリングを続行します。
最初にa(マルチスレッド)OSを起動する必要があるのは、複数のプロセスを管理するスケジューラです(マルチコアマシンなどの複数のCPUスレッドも管理します)。
このスケジューラによって開始される最初のプロセスは、通常、ある種の「init」プロセスであり、これは後で他のプログラム/プロセスをロードする責任があります。
正しいですが、ブートプロセス中に実行スレッドは1つだけです。通常、これは、OSが低レベルのメモリ管理、スケジューラなどが機能するように初期化されるまでのケースです。
これは、マルチCPUシステムの場合でもそうです.1つのコアは、インフラストラクチャが他のコアをキックスタートさせるまで、初期起動を処理する「マスタープロセッサ」です。
最終的には、OS固有のものです。 Intel Architecture Software Developer's Manualsにはハードウェア仕様の詳細が記載されています。
- 1. C#での低レベルプログラミング
- 2. 私は雲 OSに新しいイオンアプリを開始している
- 3. 低レベルのOS APIはどのように機能しますか?
- 4. レポートポータル:「開始時刻」動的更新 - どのように機能しますか?
- 5. FileWriter.flush()は常に新しい行を開始しますか?
- 6. どのように1つのメニューオプションから新しいアクティビティを開始しますか
- 7. Windows 10マシン上の他のNode.jsファイルを既に開始した後、新しいNode.jsファイルを開始するにはどうすればよいですか?
- 8. カウントダウンの最終値を新しい開始値にするにはどうすればよいですか?
- 9. 既存のプロジェクトでgithubの新しいリポジトリを開始するにはどうすればよいですか?
- 10. AlarmManagerによって開始されたサービスから新しいアラームを開始
- 11. POX SDN py.py-どのように開始されましたか?
- 12. アンケートWebサイトの新しいデバッグセッションを開始するにはどうすればよいですか?
- 13. Observerパターンはカップリングをどのように低減しますか?
- 14. BEGIN文はRedshiftで新しいトランザクションを開始しますか?
- 15. handler.post(runnable)は新しいスレッドを開始しますか?
- 16. アセンブリでjmpsはどのように動作しますか? (OS開発)
- 17. ブロードキャストレシーバーからアクティビティを開始しようとしています
- 18. 同じタブで新しいアクティビティを開始するにはどうすればよいですか?
- 19. 新しいスレッドでサービスを開始するにはどうすればよいですか?
- 20. 新しいPerlモジュール配布を開始するにはどうすればよいですか?
- 21. Chromeコンソールウィンドウで新しい行を開始するにはどうすればよいですか?
- 22. CosmicMind/Material SnackbarControllerでは、どのようにスナックバーを開始(表示)しますか?
- 23. NPMはどのようにAngularとTypescriptアプリケーションを開始しますか?
- 24. Elementary OSのプログラミングを開始するにはどうすればよいですか?
- 25. OS - OSはどのようにデバイスデータを各プロセスにマップしますか
- 26. Valgrindが新しいスレッドごとに埋め込まれたgdbserversを開始しないようにするにはどうすればよいですか?
- 27. Powershellでバックグラウンドジョブを開始するにはどうしたらよいですか?
- 28. "新しいスレッド"は新しいスレッドを開始しませんか?
- 29. ボタンがアンドロイドjunit(robotiumなしのpref)で新しいアクティビティを開始するかどうかテストしますか?
- 30. Visual Studio 2017はブラウザの新しいインスタンスを開始します
ありがとうございます。いくつかの独立したプロセッサ/コアが関わっているときに、この画像がどのように変化するか教えてください。 – prinzdezibel
ほとんどのマルチコアには、少なくともいくつかの「マスタ」プロセッサがあります(他の回答を参照)。L1 +キャッシュは集中管理なしでは機能しません。スケジューラは、各レジスタ操作に対して所望のプロセッサをアドレス指定するだけでよい。それ以外はすべて同じ(固定間隔タイマ)を保持します。 –
@prinzdezible:OSスケジューラは、通常、現在のスレッドが割り込みまたはシステムコールを介して停止しているときに、各CPUコアで実行されます。多くのコアにスケーラビリティを持たせるために、すべてのスレッドを見るのではなく、そのCPUに割り当てられたスレッドだけを見ます。余りにもビジーであれば、スレッドを他のCPUにプッシュします。ビジーでない場合は、他のCPUからスレッドを引き出します。スケジューラは時間やカウンタによって頻繁にすべてのCPU上でタスクを負荷分散します(これは遅いため頻繁ではありません) –