いくつかのSOの質問とカーネル文書を読んで私が知っている限り、Linuxでは、タスク(スレッド、プロセス、またはワークグループ)が最短時間(私のラップトップの場合は3ミリ秒)で中断することなく実行できます。 )を/proc/sys/kernel/sched_min_capsularity_ns)に変更し、負荷が高い場合はいつでも停止できます。それ以外のCPUがタイムアウトした場合は、他のタスクを続行するにはそのタスクを停止する必要があります。
しかし、私が理解したように、CPUがタスクを実行すると、何もこれを防ぐことはできません。これは、自然に非常に関連する2つの質問を生成します。
- ジョブを停止する方法は?私が考えることができる唯一のことは、OSがある種の単純なCPU割り込みを送信することです。それともここでもっと複雑なものが関係していますか?
- CPUがシングルスレッドで、一度に1つのジョブしか実行できない場合は、ジョブを停止できますか? CPUが現在ジョブを実行している場合、Linuxはどのように自分の管理ルーチンを実行してジョブを停止する必要があるかを確認できますか?
答え1
カーネルが制御権を取得するたびにスケジューリングが発生する可能性があります。これを達成するには2つの方法があり、どちらも単一のCPUで発生する可能性があります。
- ハードウェアイベントによってCPUが対応する割り込みハンドラ(カーネル内)に切り替わる割り込み。
- システムコール、実行中のタスクはカーネルを呼び出していくつかのタスクを実行します。
どちらの場合も、カーネルがユーザー空間に制御権を返す前に、どの実行可能ジョブが制御権を受け取るべきかを決定します。これはもともと中断された作業かもしれませんが、必ずしもそうではありません。
ハードウェア活動が多くない場合でも、タイマー割り込みはカーネルが定期的に制御権を取得することを保証します。