ユーザカーネルスレッドでは、1 つのタスクまでがプロセッサを使用する、つまり running ステータスになることができます。他のすべてのタスクは、実行可能であるか、または入出力操作および対応するメッセージの終了時など、再び実行可能になるための外部イベントを待機しています。
現在のタスクでプロセッサが不要になると、タスク切替 (連携タスク切替) がトリガされ、同じユーザカーネルスレッド内の次のタスクがプロセッサを使用できるようになります。
以下の図に、ユーザカーネルスレッド内の 3 つのタスクがどのように交互に実行されるかを簡略化して示します。
最初はタスク 1 が実行中であり、タスク 2 およびタスク 3 は実行可能です。
...
1. タスク 1 から入出力リクエストが送信され、タスク 1 自体は待機ステータスになります。
タスク 2 が次の実行可能タスクです。実行が再開されます。
2. タスク 2 から入出力リクエストが送信され、タスク 2 自体は待機ステータスになります。
タスク 3 が次の実行可能タスクです。実行が再開されます。
3. タスク 1 の入出力操作が完了します。タスク 1 は該当するメッセージを受信し、再び実行可能になります。
4. タスク 3 から入出力リクエストが送信され、タスク 3 自体は待機ステータスになります。
タスク 1 が次の実行可能タスクです。実行が再開されます。
5. タスク 2 の入出力操作が完了します。タスク 2 は該当するメッセージを受信し、再び実行可能になります。
6. タスク 1 が完了します。
タスク 2 が次の実行可能タスクです。実行が再開されます。
参照: