TL;DR

OS が複数のプログラムやタスク(ジョブ)を効率よく実行するために、各ジョブの投入から完了までを管理する機能。シングルコアでもマルチコアでも必要になる。

仕組み

grep 'hello' largeReadme.md を実行したときの流れは次のとおりである。

  1. OS が新しいプロセスを生成する
  2. OS がプロセスをレディキューに入れる
  3. スケジューラがプロセスを CPU に割り当て、プロセスが CPU で実行を始める
  4. CPU がプロセスの命令を実行する。ファイルの読み込みが必要になると、プロセスは待機状態になって I/O 待ちキューに入る
  5. デバイスが I/O 操作(テキストから何バイトかを読み込む)を実行する
  6. I/O 操作が終わると、OS がプロセスをレディキューに戻す
  7. CPU が空くと、スケジューラがプロセスを再び CPU に割り当て、読み込んだデータを検索する処理を実行する。このとき、実行中に割り込みが起きることがある
  8. スケジューラのアルゴリズム(ラウンドロビンなど)に従って、プロセスをレディキューに戻して他のプロセスを実行したり、再びレディキューから取り出して実行したりする
  9. テキストのサイズや他のプロセスの数にもよるが、プロセスの実行が終わるまで 4〜8 を繰り返す
  10. 検索が終わり、プロセスが終了する

7 と 8 ではコンテキストスイッチが起きる。

関連

出典