OS のプロセス管理とスケジューリング、そして並行実行を可能にするスレッドの概念を理解しましょう。
プロセスとスレッドって、何が違うの?
プロセスは実行中のプログラム1個。
スレッドはプロセス内の実行単位で、同じメモリ空間を共有する軽量な並行実行単位ね。
プロセス間通信は遅い (別メモリ)、スレッド間通信は速い (共有メモリ) けどデータ競合に注意が必要。
スケジューリングって何ですかぁ?
複数プロセスを順番にCPUに割り当てる仕組み。
代表的な方式はラウンドロビン (時分割で公平に)、優先度方式、FIFO (到着順)、SJF (短いジョブから) など。
並行処理で要注意なのはデッドロック。
複数のプロセスがお互いの資源を待って永遠に進まない状態ね。
これを防ぐ仕組みがセマフォやミューテックスね。
資源の取得順序を統一すれば防げるわ。
プロセスとスレッドを資源の共有範囲で比べる
同じブラウザで二つのタブを開く状況を考えると、OSが独立性を重視して別プロセスにする場合、片方が異常終了しても他方への影響を抑えやすくなります。一方、同じプロセス内で画面描画と通信を別スレッドにすると、メモリ上のデータを素早く共有できますが、同じ変数を同時に更新して結果が壊れる競合状態に注意が必要です。
| 比較点 | プロセス | スレッド |
|---|---|---|
| メモリ空間 | 原則として別々 | 同じプロセス内で共有 |
| 生成・切替え | 比較的重い | 比較的軽い |
| データ交換 | プロセス間通信が必要 | 共有データを直接利用しやすい |
| 障害の影響 | 分離しやすい | 同じプロセス全体へ波及しやすい |
| 主な注意点 | 通信や切替えの負荷 | 排他制御、競合状態 |
「軽量だから常にスレッドが優れる」という選択肢は誤りです。独立性を求めるならプロセス、共有データを使う細かな並行処理ならスレッド、というように目的で判断します。また、並行処理は処理が時間的に重なって進む概念であり、必ず複数CPUコアで同時実行されるとは限りません。
ラウンドロビンの実行順を時系列で解く
時刻0に、必要CPU時間がA=5、B=3、C=1の三つのプロセスが到着し、タイムクォンタムが2だとします。ラウンドロビンでは、実行可能待ち行列の先頭へ2時間単位ずつCPUを渡し、未完了なら末尾へ戻します。
| 時刻 | 実行 | 実行後の残り時間 | 次の待ち行列 |
|---|---|---|---|
| 0〜2 | A | A=3 | B→C→A |
| 2〜4 | B | B=1 | C→A→B |
| 4〜5 | C | C=0(完了) | A→B |
| 5〜7 | A | A=1 | B→A |
| 7〜8 | B | B=0(完了) | A |
| 8〜9 | A | A=0(完了) | なし |
実行順はA→B→C→A→B→Aです。クォンタムより早く終わったCは、残り時間を使い切るまで待たずにCPUを返します。典型的な誤りは、各プロセスへ一度だけ2を割り当てて終了したと考えること、または未完了のプロセスを待ち行列の先頭へ戻すことです。選択肢を比べるときは、時刻・残り時間・待ち行列の三つを一行ずつ更新します。
方式の目的とデッドロックを切り分ける
| 方式・状態 | 判断の手掛かり | 注意点 |
|---|---|---|
| FIFO | 到着した順に完了まで実行 | 後ろの短い処理が長く待つことがある |
| SJF | CPU処理時間が短いジョブを優先 | 長いジョブが待ち続ける可能性 |
| 優先度方式 | 設定された優先度が高いものを先に実行 | 低優先度の飢餓をエージングで緩和 |
| ラウンドロビン | 一定時間ごとに順番を交代 | 切替えが多すぎるとオーバーヘッド増加 |
デッドロックはスケジューリング方式の名称ではなく、例えばプロセスPが資源Xを保持してYを待ち、QがYを保持してXを待つように、互いが永久に待つ状態です。「相互排他・保持と待機・横取り不可・循環待機」の4条件がすべて成立すると発生可能になります。資源の取得順をX→Yに統一すれば循環待機を崩せるため、予防策になります。
タイムクォンタムをすごく短くすれば、待ち時間もなくなって一番速いんですかぁ?
公平には見えますが、プロセスを切り替えるコンテキストスイッチが増えます。
切替えにも時間がかかるので、短ければ短いほど全体が速いとは限りません。
SJFって短いのから片づくなら、いつでも一番よさそうじゃん!
平均待ち時間を短くしやすい反面、長いジョブが後回しになり続けることがあるわ。
試験では『公平な時分割』ならラウンドロビン、『短いジョブを優先』ならSJF、『到着順』ならFIFOと、目的を示す語を先に拾いましょう。
確認クイズ
OSのプロセススケジューリングで、各プロセスに一定時間 (タイムスライス) を順番に割り当てる方式はどれか。
- FIFO
- ラウンドロビン
- 優先度方式
- SJF
こたえを見る
正解: 2. ラウンドロビン
ラウンドロビンは各プロセスに一定時間ずつCPUを割り当て、時間が来たら次のプロセスに切り替える公平なスケジューリング方式です。リアルタイム性は低いですが、対話的処理に向いています。