web-dev-qa-db-ja.com

start_kernelルーチンの最後の関数としてcpu_idleが呼び出されるのはなぜですか?

start_kernelの-​​ /init/main.c 関数を読んでいます。 start_kernelで最後に呼び出される関数はrest_initであり、rest_initの最後にcpu_idleが呼び出されます。

なぜそれがstart_kernelルーチンの最後の関数として呼び出されるのですか、そしてそれは何をしますか?

3
Anthony

最初の質問に答えるには、

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が不要になったためです。

5
aliceinpalth

中央処理装置は常に実行されている必要があります何か。何もすることがない場合、それは単に無限ループでループし、割り込み(システムハートビート割り込みなど)がそれを中断します。

古いマルチプロセス/マルチスレッドオペレーティングシステムでは、ディスパッチャ(実行可能なスレッドキューから実行するために次のスレッドを選択して切り替える低レベルのスケジューラ)が実行可能なスレッドを見つけられない場合、そのような無限に入るだけです。ループ。

ただし、これはマルチ-プロセッサオペレーティングシステムの問題です。ディスパッチャが離れていたスレッドのコンテキストで無限ループが実行されるためです。これにより、2つのプロセッサで同じスレッドが同時に「実行」され、さまざまな問題が発生する可能性があります。

したがって、より最近の(つまり、このアイデアは数十年前のものであるため)設計では、システム内の各プロセッサに対してアイドルスレッドが必要でした。このスレッドは無期限にループするだけで、常に実行可能です。したがって、常にディスパッチャが選択できるスレッドがあり、プロセッサが実行できる実行可能なスレッドがないという状況は決してありません。

実際のUnixの古いバージョンでは、システムの初期化が完了すると、初期化コードはそれをプロセス#0として記述するデータ構造を設定します。これは、それが何をしたかという理由から、「スワッパープロセス」の伝統的な名前を持っています。初期化が終了した後、somethingを実行する必要があったため、メインのRAMとDASDスワップ領域の間でプロセスセグメントをスワップするコードを実行しました。

スワッピングのアイデアは、デマンドページングデザインの出現により1970年代後半になくなりました。そして、プロセス#0が最初にアイドルプロセスになり、次にアイドルスレッドのすべてを含むシステムプロセスになりました。

そしてそれはLinuxでも起こっていることです。

もちろん、この時点で電力管理は四半世紀以上にわたって考慮されてきました。無条件の分岐命令がそれ自体に分岐する従来の無限ループは、多くの不必要な忙しい作業と電力の浪費を引き起こします。最新の(これも相対的な用語です)アイドルスレッドは、実行中のプロセッサに待機するように指示する特別なプロセッサ命令を呼び出し、ハードウェア割り込みを受信するためにクロックレートを下げて電力を節約する可能性があります。 (x86命令アーキテクチャでは、これはhltからpause、別名rep nopに変更され、「ハイパースレッド」プロセッサ内の実行コアによるリソースの完全なリリースを割り込みを伴わないクロスプロセッサショルダータップ。アイドル状態のスレッドをスピンロックの永続的なウェイターに効果的に変換します。)

参考文献

2
JdeBP