Linuxカーネルは、割り込み処理中にどのプロセスが起きるのかをどのように把握しますか?

Linuxカーネルは、割り込み処理中にどのプロセスが起きるのかをどのように把握しますか?

本を読んでいますLinuxカーネルの開発前の章プロセススケジューリング。 61ページ、一部立ち上がる、最初の段落は次のとおりです。

覚醒はwake_up()で処理されます。みんな指定された待機キューで待機しているジョブ。それ第1四半期:これは何をit意味するのか? )は仕事の(第2四半期:どんなミッションですか?すべての覚醒作業ですか?)ステータスがTASK_RUNNINGの場合、enqueue_task()を呼び出してRed-Blackツリーにジョブを追加し、wake-upジョブの優先順位が現在のジョブの優先順位より高い場合はneed_reschedが設定されます。イベントを発生させるコードは通常wake_up()自体を呼び出します。たとえば、ハードディスクからデータが到着すると、VFSはデータを待機するプロセスを保持する待機キューでwake_up()を呼び出します。

私は上記の状況について非常に混乱しています。データを読み込んだ後、ディスクが中断されたが、より完全な画像がある前の段落の例を使用します。以下にエラーや不完全な部分がある場合は訂正してください。

  1. 一部のユーザープロセスはブロック読み取り操作を実行してシステムコールをトリガーし、そのプロセスはカーネル領域にあります。

  2. カーネルは必要なデータを要求するようにディスクコントローラを設定し、プロセスをスリープモードにします(プロセスはキューに入れられます)。カーネルは実行する他のプロセスをスケジュールします。

  3. ディスク割り込みが発生しました。 CPUは現在実行中のプロセスを一時停止し、ディスク割り込み処理にジャンプします。

  4. ディスクコントローラは割り込み処理中に起動し、ディスクから読み取られたデータをメインメモリに転送します(CPUの指示に従って、またはDMAを介して)。

  5. (わかりません。修正してください。)段落が示すように、VFSはデータを待つプロセスを保持する待機キューでwake_up()を呼び出します。

私の具体的な質問は次のとおりです。

第1四半期(引用符を参照):おそらくそれ2番目の文は関数を表しますwake_up()。機能がwake_up目覚める理由は何ですか?みんなそのディスクのデータを待っているジョブではなくジョブ?

第2四半期(引用符を参照):try_to_wake_up()特定のジョブの状態をTASK_RUNNINGに設定する必要があることはどういうわけか?または、try_to_wake_up()すべてのウェイクアップジョブのステータスをTASK_RUNNINGに設定しますか?

第3四半期:カーネルが管理しなければならない待ち行列は何ですか?キューが2つ以上の場合、ディスクデータを待機するプロセスがそのキューに入るようにどのキューを選択するのか、カーネルはどのように知りますか?

第4四半期:今、待機プロセスがあるキューを知っているとします。カーネルはどのプロセスがディスクからデータを待っているかをどうやって知ることができますか?ディスクデータを要求するプロセスに関連する一部の情報(プロセスのPID、メモリアドレスなど)がディスクコントローラに渡されることを想像できます。その後、割り込み処理が完了した後、ディスクコントローラ(またはカーネル?)はこの情報を使用してキューにあるプロセスを見つけます。

私が目覚めたプロセスの絵を完成させるのを手伝ってください!ありがとうございます!

ベストアンサー1

Q1: 「それ」はですwake_up。すべての仕事を目覚めさせるディスクデータを待っています。そのデータを待たなかった場合は、そのキューで待機していない可能性があります。

Q2:質問を理解したかどうかわかりません。各ウェイクアップキューエントリには、ジョブへのポインタが含まれています。try_to_wake_up目覚めなければならないタスクへのポインタを受け取ります。関数ごとに1回呼び出されます。

Q3:並んで待っている人が多いです。可能なすべてのイベントに1つあります。ディスクドライバは、各ディスク要求に対して待ち行列を設定する。たとえば、ファイルシステムドライバが特定のディスクブロックの内容を望む場合、ディスクドライバにブロックを要求し、要求はファイルシステム要求を発行したアクションから始まります。同じブロックに対する別の要求が入っていてそのブロックがまだ処理されていない場合は、別のエントリがキューに追加される可能性があります。

割り込みが発生すると、ディスクドライバはハードウェアから渡された情報に基づいてどのディスクに利用可能なデータがあるかを確認し、そのディスクのカーネルデータを含むデータ構造を調べて、どの要求を満たす必要があるかを確認します。このデータ構造内には、何よりもデータが書き込まれる場所と、次に何をすべきかを示す対応するウェイクアップキューがあります。

Q4:プロセスはファイルの読み取りなどのシステムコールを実行します。これは、ディスクからデータをロードする必要があるかどうかを判断するファイルシステムドライバの一部のコードをトリガします。このコードはディスクドライバに要求し、呼び出しプロセスを要求のキューに追加します。 (実際にはより多くのレイヤーがありますが、わかります)。キューイベントが発生するのを待つコードは、ファイルシステムドライバが提供する関数で、データをプロセスのメモリにコピーし、システムコールがread返されるようにします。

おすすめ記事