プロセス・スレッド・スケジューリング

OSのプロセス管理とスケジューリングを学びます。

OS のプロセス管理とスケジューリング、そして並行実行を可能にするスレッドの概念を理解しましょう。

日野 こむぎ(普段) 日野 こむぎ

プロセスとスレッドって、何が違うの?

藤森 さやか 先生(笑顔) 藤森 さやか 先生

プロセスは実行中のプログラム1個。
スレッドはプロセス内の実行単位で、同じメモリ空間を共有する軽量な並行実行単位ね。

青木 澪(普段) 青木 澪

プロセス間通信は遅い (別メモリ)、スレッド間通信は速い (共有メモリ) けどデータ競合に注意が必要。

桃井 すみれ(普段) 桃井 すみれ

スケジューリングって何ですかぁ?

青木 澪(普段) 青木 澪

複数プロセスを順番にCPUに割り当てる仕組み。
代表的な方式はラウンドロビン (時分割で公平に)、優先度方式、FIFO (到着順)、SJF (短いジョブから) など。

藤森 さやか 先生(普段) 藤森 さやか 先生

並行処理で要注意なのはデッドロック。
複数のプロセスがお互いの資源を待って永遠に進まない状態ね。

青木 澪(普段) 青木 澪

これを防ぐ仕組みがセマフォやミューテックスね。
資源の取得順序を統一すれば防げるわ。

プロセスとスレッドを資源の共有範囲で比べる

同じブラウザで二つのタブを開く状況を考えると、OSが独立性を重視して別プロセスにする場合、片方が異常終了しても他方への影響を抑えやすくなります。一方、同じプロセス内で画面描画と通信を別スレッドにすると、メモリ上のデータを素早く共有できますが、同じ変数を同時に更新して結果が壊れる競合状態に注意が必要です。

比較点プロセススレッド
メモリ空間原則として別々同じプロセス内で共有
生成・切替え比較的重い比較的軽い
データ交換プロセス間通信が必要共有データを直接利用しやすい
障害の影響分離しやすい同じプロセス全体へ波及しやすい
主な注意点通信や切替えの負荷排他制御、競合状態

「軽量だから常にスレッドが優れる」という選択肢は誤りです。独立性を求めるならプロセス、共有データを使う細かな並行処理ならスレッド、というように目的で判断します。また、並行処理は処理が時間的に重なって進む概念であり、必ず複数CPUコアで同時実行されるとは限りません。

ラウンドロビンの実行順を時系列で解く

時刻0に、必要CPU時間がA=5、B=3、C=1の三つのプロセスが到着し、タイムクォンタムが2だとします。ラウンドロビンでは、実行可能待ち行列の先頭へ2時間単位ずつCPUを渡し、未完了なら末尾へ戻します。

時刻実行実行後の残り時間次の待ち行列
0〜2AA=3B→C→A
2〜4BB=1C→A→B
4〜5CC=0(完了)A→B
5〜7AA=1B→A
7〜8BB=0(完了)A
8〜9AA=0(完了)なし

実行順はA→B→C→A→B→Aです。クォンタムより早く終わったCは、残り時間を使い切るまで待たずにCPUを返します。典型的な誤りは、各プロセスへ一度だけ2を割り当てて終了したと考えること、または未完了のプロセスを待ち行列の先頭へ戻すことです。選択肢を比べるときは、時刻・残り時間・待ち行列の三つを一行ずつ更新します。

方式の目的とデッドロックを切り分ける

方式・状態判断の手掛かり注意点
FIFO到着した順に完了まで実行後ろの短い処理が長く待つことがある
SJFCPU処理時間が短いジョブを優先長いジョブが待ち続ける可能性
優先度方式設定された優先度が高いものを先に実行低優先度の飢餓をエージングで緩和
ラウンドロビン一定時間ごとに順番を交代切替えが多すぎるとオーバーヘッド増加

デッドロックはスケジューリング方式の名称ではなく、例えばプロセスPが資源Xを保持してYを待ち、QがYを保持してXを待つように、互いが永久に待つ状態です。「相互排他・保持と待機・横取り不可・循環待機」の4条件がすべて成立すると発生可能になります。資源の取得順をX→Yに統一すれば循環待機を崩せるため、予防策になります。

桃井 すみれ(普段) 桃井 すみれ

タイムクォンタムをすごく短くすれば、待ち時間もなくなって一番速いんですかぁ?

青木 澪(普段) 青木 澪

公平には見えますが、プロセスを切り替えるコンテキストスイッチが増えます。
切替えにも時間がかかるので、短ければ短いほど全体が速いとは限りません。

日野 こむぎ(普段) 日野 こむぎ

SJFって短いのから片づくなら、いつでも一番よさそうじゃん!

藤森 さやか 先生(笑顔) 藤森 さやか 先生

平均待ち時間を短くしやすい反面、長いジョブが後回しになり続けることがあるわ。
試験では『公平な時分割』ならラウンドロビン、『短いジョブを優先』ならSJF、『到着順』ならFIFOと、目的を示す語を先に拾いましょう。

確認クイズ

OSのプロセススケジューリングで、各プロセスに一定時間 (タイムスライス) を順番に割り当てる方式はどれか。

  1. FIFO
  2. ラウンドロビン
  3. 優先度方式
  4. SJF
こたえを見る

正解: 2. ラウンドロビン

ラウンドロビンは各プロセスに一定時間ずつCPUを割り当て、時間が来たら次のプロセスに切り替える公平なスケジューリング方式です。リアルタイム性は低いですが、対話的処理に向いています。

藤森さやか先生、青木澪が紅葉の山をハイキングを楽しむ様子

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。