start_kernel
の- /init/main.c
関数を読んでいます。 start_kernel
で最後に呼び出される関数はrest_init
であり、rest_init
の最後にcpu_idle
が呼び出されます。
なぜそれがstart_kernel
ルーチンの最後の関数として呼び出されるのですか、そしてそれは何をしますか?
最初の質問に答えるには、
cpu_idle
は何をしますか?
一般に(質問のコンテキストに関係なく)、CPUがアイドル状態にあるとき、それはカーネルが現在CPUが実行する作業を持っていないことを意味し、したがってCPUはカーネルからのさらなる作業をアイドル状態で待っています。
カーネルがマネージャーとしてどのように機能し、CPUに(スケジュールに従って)作業を与えるかを考えることができます。 CPUが引き受ける作業がない場合、CPUはアイドル状態になり、割り込みを待ちます。 CPUの中断について詳しく読むことができます ここ 。
あなたの質問の文脈に関して、あなたは cpu_idle
がすることの正確な実装を読むことができます:
cpu_idle(void)
{
set_thread_flag(TIF_POLLING_NRFLAG);
while (1) {
/* FIXME -- EV6 and LCA45 know how to power down
the CPU. */
while (!need_resched())
cpu_relax();
schedule();
}
}
要約すると、cpu_idle
はCPUをアイドル状態にします。これは、while
ループを使用して、必要に応じてプロセスのスケジューリングを処理することで実現されます。それ以外の場合、CPUはcpu_relax
でアイドル状態になります。
なぜそれが
start_kernel
ルーチンの最後の関数として呼び出されるのですか?
この関数がstart_kernel
ルーチンの最後の命令として実行される理由は、CPUがカーネルを起動するために必要なすべての作業を実行したためです。これ以上の命令は実行されないため、CPUはアイドル状態になり、次のタスクを待機します。または中断します。これを示すには、CPUをアイドル状態にする必要があります。これは、カーネルの初期化にCPUが不要になったためです。
中央処理装置は常に実行されている必要があります何か。何もすることがない場合、それは単に無限ループでループし、割り込み(システムハートビート割り込みなど)がそれを中断します。
古いマルチプロセス/マルチスレッドオペレーティングシステムでは、ディスパッチャ(実行可能なスレッドキューから実行するために次のスレッドを選択して切り替える低レベルのスケジューラ)が実行可能なスレッドを見つけられない場合、そのような無限に入るだけです。ループ。
ただし、これはマルチ-プロセッサオペレーティングシステムの問題です。ディスパッチャが離れていたスレッドのコンテキストで無限ループが実行されるためです。これにより、2つのプロセッサで同じスレッドが同時に「実行」され、さまざまな問題が発生する可能性があります。
したがって、より最近の(つまり、このアイデアは数十年前のものであるため)設計では、システム内の各プロセッサに対してアイドルスレッドが必要でした。このスレッドは無期限にループするだけで、常に実行可能です。したがって、常にディスパッチャが選択できるスレッドがあり、プロセッサが実行できる実行可能なスレッドがないという状況は決してありません。
実際のUnixの古いバージョンでは、システムの初期化が完了すると、初期化コードはそれをプロセス#0として記述するデータ構造を設定します。これは、それが何をしたかという理由から、「スワッパープロセス」の伝統的な名前を持っています。初期化が終了した後、somethingを実行する必要があったため、メインのRAMとDASDスワップ領域の間でプロセスセグメントをスワップするコードを実行しました。
スワッピングのアイデアは、デマンドページングデザインの出現により1970年代後半になくなりました。そして、プロセス#0が最初にアイドルプロセスになり、次にアイドルスレッドのすべてを含むシステムプロセスになりました。
そしてそれはLinuxでも起こっていることです。
もちろん、この時点で電力管理は四半世紀以上にわたって考慮されてきました。無条件の分岐命令がそれ自体に分岐する従来の無限ループは、多くの不必要な忙しい作業と電力の浪費を引き起こします。最新の(これも相対的な用語です)アイドルスレッドは、実行中のプロセッサに待機するように指示する特別なプロセッサ命令を呼び出し、ハードウェア割り込みを受信するためにクロックレートを下げて電力を節約する可能性があります。 (x86命令アーキテクチャでは、これはhlt
からpause
、別名rep nop
に変更され、「ハイパースレッド」プロセッサ内の実行コアによるリソースの完全なリリースを割り込みを伴わないクロスプロセッサショルダータップ。アイドル状態のスレッドをスピンロックの永続的なウェイターに効果的に変換します。)