【仕組み解説】OSはどうやって複数のプログラムを同時に動かしているのか — プロセス管理の仕組みを図解


CPUタイムスライスとコンテキストスイッチ Process A Process B Process C 時間 実行中 切替 実行中 切替 実行中 切替 実行中 切替 実行中 切替 実行中 実行中 待機中 コンテキストスイッチ
CPUのタイムスライスによるプロセス切り替え
ひよこ ひよこ

パソコンでブラウザを開きながら音楽も聴けるじゃない?あれってCPUが同時に全部やってるの?

ペンギン先生 ペンギン先生

いい質問だね。実は1つのCPUコアは、ある瞬間には1つのプログラムしか実行できないんだ。でもOSが超高速に「次はこのプログラム、次はあのプログラム」って切り替えてるから、人間には同時に動いてるように見えるんだよ。これがプロセス管理の基本だね。

ひよこ ひよこ

そもそも「プロセス」って何なの?プログラムとは違うの?

ペンギン先生 ペンギン先生

プログラムは「レシピ」、プロセスは「実際に料理してる状態」だと思えばいいよ。同じプログラムでも2回起動すれば2つの別々のプロセスになる。それぞれが独立したメモリ空間を持っていて、お互いのデータには直接触れないようになってるんだ。

ひよこ ひよこ

じゃあ「スレッド」っていうのも聞いたことあるけど、プロセスとどう違うの?

ペンギン先生 ペンギン先生

スレッドプロセスの中にある「作業の流れ」だよ。1つのプロセスの中に複数のスレッドを作れて、同じメモリ空間を共有するんだ。たとえばブラウザだと、画面の描画をするスレッドネットワーク通信をするスレッドが別々に動いてる。メモリを共有するぶん高速にやり取りできるけど、データの競合に気をつけないといけないんだよ。

ひよこ ひよこ

プロセスって生まれてから終わるまで、どんな状態があるの?

ペンギン先生 ペンギン先生

プロセスには主に5つの状態があるよ。まず「生成」されて、CPUの順番待ちの「実行可能」状態になる。順番が来たら「実行中」になって、ファイル読み込みとかで待つ必要があると「待機」状態に移る。処理が終わったら「終了」だね。OSはこの状態を管理しながら、次にどのプロセスCPUを使わせるか決めてるんだ。

ひよこ ひよこ

次にどのプロセスを実行するかって、どうやって決めてるの?

ペンギン先生 ペンギン先生

それが「CPUスケジューリング」だよ。代表的なのは「ラウンドロビン」方式で、各プロセスに数ミリ秒ずつの「タイムスライス」を順番に割り当てるんだ。ほかにも優先度ベースのスケジューリングがあって、リアルタイム処理みたいに遅延が許されないプロセスは優先度を高くして先に実行させる。Linuxのスケジューラは公平性と応答性のバランスを取るために、かなり複雑な仕組みになってるよ。

ひよこ ひよこ

プロセスを切り替えるときって、何が起きてるの?

ペンギン先生 ペンギン先生

コンテキストスイッチ」っていって、今実行中のプロセスCPUレジスタの値やプログラムカウンタの位置をメモリに退避して、次のプロセスの状態を復元するんだ。要するに「今どこまでやったか」を保存して、前回の続きから再開するってこと。この切り替えは1回あたり数マイクロ秒くらいだけど、頻繁に起きるとオーバーヘッドになるから、タイムスライスの長さは慎重に設計されてるよ。

ひよこ ひよこ

マルチコアCPUだと話が変わってくるの?

ペンギン先生 ペンギン先生

そうだね。シングルコアだと「高速に切り替えて同時っぽく見せる」だけだけど、マルチコアなら本当に複数のプロセスが同時に動くよ。4コアなら最大4つのプロセスが物理的に並列で実行できる。ただしOSのスケジューラは「どのコアにどのプロセスを割り当てるか」も管理しなきゃいけなくて、キャッシュ効率を考えてなるべく同じコアで動かし続ける「アフィニティ」なんて概念もあるんだ。

ひよこ ひよこ

プロセスごとにメモリが分かれてるって言ってたけど、他のプロセスのメモリを触れちゃったりしないの?

ペンギン先生 ペンギン先生

それを防ぐのが「メモリ保護」と「仮想メモリ」だよ。各プロセスには独立した仮想アドレス空間が割り当てられていて、OSとCPUのMMU(メモリ管理ユニット)がハードウェアレベルでアクセスを制御してるんだ。あるプロセスが別のプロセスのメモリにアクセスしようとすると「セグメンテーションフォルト」っていうエラーで強制終了される。これがOSの安定性とセキュリティを支えてるんだよ。

ひよこ ひよこ

でもプロセス同士でデータをやり取りしたいときもあるよね?

ペンギン先生 ペンギン先生

あるある。それが「プロセス間通信(IPC)」だよ。パイプコマンドラインでよく使う「|」のやつで、あるプロセスの出力を別のプロセスの入力にできる。ソケットネットワーク越しの通信にも使えるし、同じマシン内でも使える。あと「共有メモリ」は特定のメモリ領域だけ複数プロセスからアクセスできるようにする仕組みで、大量データのやり取りに向いてるんだ。

ひよこ ひよこ

こういうの知ってると、普段パソコン使ってるときの見え方が変わりそうだね!

ペンギン先生 ペンギン先生

まさにそうだよ。タスクマネージャープロセス一覧を見ると、裏で何十、何百ものプロセスが動いてるのがわかる。CPUの使用率が100%に張り付いてるときは、スケジューラがフル回転してるってこと。ちなみにLinuxの/procディレクトリを覗くと、各プロセスの状態遷移やメモリマップまで詳しく見られるから、興味があったら試してみるといいよ。