誰かが明確な説明または参照リンクで理解するのを手伝ってくれますか、カーネルが同じ優先度を持つタスクのプリエンプションを処理する方法。優先度の高い 3 つのタスク A、B、C が割り当てられているとします。
TASK(A) { 高優先度の非同期メッセージの読み取り }
TASK(B) { 高優先度の非同期メッセージの送信 }
TASK(C) {高優先度ドロー処理}
この場合、どのタスクが処理対象と見なされ、どのようにプリエンプトされるのでしょうか?
誰かが明確な説明または参照リンクで理解するのを手伝ってくれますか、カーネルが同じ優先度を持つタスクのプリエンプションを処理する方法。優先度の高い 3 つのタスク A、B、C が割り当てられているとします。
TASK(A) { 高優先度の非同期メッセージの読み取り }
TASK(B) { 高優先度の非同期メッセージの送信 }
TASK(C) {高優先度ドロー処理}
この場合、どのタスクが処理対象と見なされ、どのようにプリエンプトされるのでしょうか?
一般的なスケジューリング順序は
schedule()
か、TIF_NEED_RESCHED
フラグが設定されていてカーネルが割り込みコンテキストから戻ったときに関数を呼び出します。pick_next_task()
この関数は、現在実行中のタスクをプリエンプトするタスクを受け取るために呼び出します。pick_next_task()
いずれかがタスクを返すまで、すべてのスケジューラ クラスpick_next_task()
を優先度の高い順に呼び出します。優先度とは、プロセスの優先度ではなく、クラスの優先度 (ソフト リアルタイムや通常など) を意味することに注意してください。スケジューラの場合、どのプロセスが実行されているか、どのメッセージが送信または受信されるかは関係ありません。したがって、一般に、プロセスの優先度が等しい場合、実行時間が短いプロセスは、次の呼び出しで別のプロセスをschedule()
プリエンプトします。