コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
スケジューラとアルゴリズム
スケジューラとアルゴリズム
このレッスンで分かること
- スケジューラは「次に走らせるプロセスを選ぶ」コンポーネントで、OS の体感性能を決定づけます
- 古典的には FIFO・ラウンドロビン・優先度・SJF などのアルゴリズムが知られています
- Linux は CFS(Completely Fair Scheduler)、その後継として 2023 年に EEVDF が採用されました
スケジューラとアルゴリズム とは
スケジューラとアルゴリズム。本レッスンでは、スケジューラとアルゴリズム の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
スケジューラとは (要約)
スケジューラは CPU の前に並んだプロセスの行列を裁く OS の中核コンポーネント。 スループット・応答性・公平性・効率のトレードオフを、用途に合わせた アルゴリズム で取ります。
主要スケジューリングアルゴリズム比較
| アルゴリズム | 戦略 | 平均応答性 | 公平性 | 飢餓リスク | 代表的な採用先 |
|---|---|---|---|---|---|
| FIFO (FCFS) | 到着順に処理 | 低 | 中 | 低 | 古典バッチ |
| SJF | 最短ジョブ優先 | 高 | 低 | 高 | 学術ベンチ |
| Round Robin | 固定タイムスライスで巡回 | 中 | 高 | なし | 古典対話システム |
| 優先度ベース | 重要度で順位付け | 高 | 低 | 高 | リアルタイム OS |
| MLFQ | 多段キュー + 動的優先度 | 高 | 中 | 低 | Windows、旧 Linux |
| CFS | vruntime 最小を選ぶ公平共有 | 中-高 | 高 | なし | Linux 2.6〜6.5 |
| EEVDF | 仮想期限ベース | 高 | 高 | なし | Linux 6.6〜 |
スケジューラの目的
CPU は 1 コアあたり同時に 1 つの命令しか実行できません。一方、システムには数百のプロセスが居て、それぞれ「動かしてほしい」と並んでいます。スケジューラの仕事はこの 行列を裁く ことです。良いスケジューラは下記を高い水準で両立します。
| 指標 | 意味 |
|---|---|
| スループット | 単位時間に終わる仕事の数 |
| 応答性 | 入力から反応までの時間 |
| 公平性 | どのプロセスも飢餓状態にならない |
| 効率 | スイッチや計算のオーバーヘッドが少ない |
これらは互いに矛盾するため、用途に応じて重み付けが変わります。
代表的なアルゴリズム
- FIFO は実装が簡単だが、長いジョブが詰まると全員待たされる
- SJF は短いジョブから処理し平均待ち時間が最小だが、長いジョブが飢餓状態に
- ラウンドロビン は固定タイムスライスで巡回。対話システム向き
- 優先度ベース は重要度で順位付け。優先度逆転問題に注意
- MLFQ は複数のキューに優先度を付け、I/O 多めのプロセスを優遇
- CFS は「各プロセスが使った仮想時間」が一番少ない者を次に走らせる公平共有方式
- EEVDF は CFS の進化版で、遅延敏感なタスクの応答性が改善
Linux CFS の仕組み
CFS は赤黒木にプロセスを並べ、キーは vruntime(仮想実行時間)です。プロセスが CPU を使うと vruntime が増え、最小のものが次に選ばれます。nice 値(-20 ~ +19)で進む速さを調整し、優先度の高いプロセスは vruntime がゆっくり進みます。
ターミナル
nice -n -5 ./important-task & # 優先度を高める(要 root)
nice -n 10 ./background-task & # 譲り合い的に下げるchrt を使うとリアルタイムスケジューリングクラス(SCHED_FIFO / SCHED_RR)に切替えられます。
I/O バウンドと CPU バウンド
スケジューラは「最近 CPU を使った時間」を見ることで、I/O 待ちが多いプロセスを 対話的 と判断し優先します。これは「ユーザーがキーを打ったらすぐ応答する」体感を作るための工夫です。動画エンコードのように CPU を貪るバッチ処理は逆に優先度が落ちます。
トレードオフ
- 公平性を強くすると、ゲーム・音楽プレイヤなど 遅延敏感なタスク が割を食うことがあります。これを補うのが
SCHED_DEADLINE等のリアルタイムクラスです - タイムスライスを短くすると応答性は上がりますが、スイッチコストでスループットが落ちます。Linux のデフォルトは数 ms ですが、サーバー用途では延ばす設定もよく見られます
よくある誤解
- 「CPU 100% = 悪い」は誤解で、ジョブが CPU を使い切るのは効率的な状態でもあります。本当の悪は 待たされている時間 が長いことです
- 「
nice -n -20にすれば最速」も誤解で、優先度を上げすぎると逆に他のプロセス(特に OS の管理タスク)を干上がらせて不安定になります
やってみよう
top を起動し H を押してスレッド単位表示にしてみてください。PR(優先度)と NI(nice 値)の列を観察すると、リアルタイム優先度(rt 表示)のプロセスが裏で動いていることが分かります。
まとめ
このレッスンの要点は、スケジューリング 4 指標 / 古典アルゴリズム / CFS と EEVDF の 3 点です。実務でこれらを切り分けて説明できるようになると、設計レビューや障害対応の精度が一段上がります。
理解度チェック
Q. Linux の Completely Fair Scheduler (CFS) が「次に走らせるプロセス」を選ぶ基準は?
- 到着順 (FIFO)
- 予測実行時間が最短のもの (SJF)
- vruntime (仮想実行時間) が最小のもの
- メモリ使用量が最小のもの
答えを見る
正解は 3。CFS は赤黒木に並べたプロセスから、累積で CPU を最も使っていない (= vruntime 最小) ものを次に選ぶ公平共有方式です。
出典 (References)
- Linux Kernel — CFS Design
- Linux Kernel — EEVDF Scheduler (since 6.6)
- Operating Systems: Three Easy Pieces — Scheduling
最終更新: 2026-05-28
関連レッスン
よくある質問
Q. このトピックは実務でどう役立ちますか?
A. DB のクエリ最適化、API 設計、データ構造の選択など、設計判断の根拠になります。表面的にライブラリを使うだけでなく「なぜそれが速いのか」を理解できると、性能問題を未然に防げます。コーディング面接でも頻出のテーマです。
Q. 計算量はどう求めれば良いですか?
A. ループのネストごとに掛け算する、再帰なら漸化式から解く、というのが基本です。Big-O 表記は定数倍と低次の項を無視するため、n の指数(n²、n log n など)に注目してください。最悪・平均・最良の 3 つを意識すると説得力が増します。
Q. 覚えるべき定番アルゴリズムは何ですか?
A. 二分探索、クイックソート/マージソート、BFS/DFS、ダイクストラ、DP の基本問題(フィボナッチ・ナップサック)が必修です。これらを「白紙から書ける」状態にすると、応用問題が一気に解けるようになります。
次のレッスン
次は プロセス間通信(IPC) で、プロセス同士がどうやってデータをやり取りするかを学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- スケジューラ の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. スケジューラ とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン