0

誰かが明確な説明または参照リンクで理解するのを手伝ってくれますか、カーネルが同じ優先度を持つタスクのプリエンプションを処理する方法。優先度の高い 3 つのタスク A、B、C が割り当てられているとします。

TASK(A) { 高優先度の非同期メッセージの読み取り }

TASK(B) { 高優先度の非同期メッセージの送信 }

TASK(C) {高優先度ドロー処理}

この場合、どのタスクが処理対象と見なされ、どのようにプリエンプトされるのでしょうか?

4

1 に答える 1

2

一般的なスケジューリング順序は

  1. カーネルは、カーネル コンテキストで直接関数を呼び出すschedule()か、TIF_NEED_RESCHEDフラグが設定されていてカーネルが割り込みコンテキストから戻ったときに関数を呼び出します。
  2. pick_next_task()この関数は、現在実行中のタスクをプリエンプトするタスクを受け取るために呼び出します。
  3. pick_next_task()いずれかがタスクを返すまで、すべてのスケジューラ クラスpick_next_task()を優先度の高い順に呼び出します。優先度とは、プロセスの優先度ではなく、クラスの優先度 (ソフト リアルタイムや通常など) を意味することに注意してください。
  4. CFS のアプローチ (通常のプロセスのスケジューラ) は、各プロセスに等しい量の仮想ランタイムを与えることです。仮想実行時間は、優先度 (プロセスの優先度) で重み付けされたプロセスの実際の実行時間です。そのため、CFS クラスはより少ない仮想ランタイムでタスクを返します。

スケジューラの場合、どのプロセスが実行されているか、どのメッセージが送信または受信されるかは関係ありません。したがって、一般に、プロセスの優先度が等しい場合、実行時間が短いプロセスは、次の呼び出しで別のプロセスをschedule()プリエンプトします。

于 2013-07-24T11:37:43.237 に答える