TL;DR
OS が複数のプログラムやタスク(ジョブ)を効率よく実行するために、各ジョブの投入から完了までを管理する機能。シングルコアでもマルチコアでも必要になる。
仕組み
grep 'hello' largeReadme.md を実行したときの流れは次のとおりである。
- OS が新しいプロセスを生成する
- OS がプロセスをレディキューに入れる
- スケジューラがプロセスを CPU に割り当て、プロセスが CPU で実行を始める
- CPU がプロセスの命令を実行する。ファイルの読み込みが必要になると、プロセスは待機状態になって I/O 待ちキューに入る
- デバイスが I/O 操作(テキストから何バイトかを読み込む)を実行する
- I/O 操作が終わると、OS がプロセスをレディキューに戻す
- CPU が空くと、スケジューラがプロセスを再び CPU に割り当て、読み込んだデータを検索する処理を実行する。このとき、実行中に割り込みが起きることがある
- スケジューラのアルゴリズム(ラウンドロビンなど)に従って、プロセスをレディキューに戻して他のプロセスを実行したり、再びレディキューから取り出して実行したりする
- テキストのサイズや他のプロセスの数にもよるが、プロセスの実行が終わるまで 4〜8 を繰り返す
- 検索が終わり、プロセスが終了する
7 と 8 ではコンテキストスイッチが起きる。