indiv は非常に良い答えを提供しますが、部分的にしか正確ではありません。
システムの実際の動作はもう少し複雑です。
スケジューラは、同期操作または非同期操作の結果として実行できます。
同期とは、現在実行中のタスクのコードの結果として発生する操作を指します。この典型的な例は、セマフォ (semTake) を取ることです。
セマフォが利用できない場合、現在実行中のタスクは保留され、実行できなくなります。この時点で、スケジューラが呼び出され、実行する必要がある次のタスクが決定され、コンテキスト スイッチが実行されます。
非同期操作は、基本的に割り込みを指します。タイマー割り込みは、indiv によって非常によく説明されています。ただし、ネットワーク トラフィック、センサー、シリアル データなど、さまざまな要素によって割り込みが実行される可能性があります。
また、タイマー割り込みによって必ずしもコンテキスト スイッチが発生するとは限らないことも覚えておくとよいでしょう。はい、割り込みが発生し、遅延タスクとタイム スライス カウンターが減少します。ただし、タイム スライスの有効期限が切れていない場合、または優先度の高いタスクが保留状態から準備完了状態に遷移しない場合、スケジューラは実際には呼び出されず、実行が開始された正確な時点で元のタスクに戻ります。中断しました。
スケジューラには独自のコンテキストがないことに注意してください。それはタスクではありません。これは、呼び出されたコンテキストで実行される単純なコードです。割り込みコンテキスト (非同期) または呼び出し側タスク コンテキスト (同期) のいずれかから。