アプリとOSは何が違うのか

概要 — まず全体をつかむ

初級では「お願いする側と、引き受けて仕切る側」という関係を見ました。ここではその境界線が何によって強制されているのかを、実際の名前で追います。読み終わる頃には、タスクマネージャの見方と「なぜ強制終了してもPC全体は無事なのか」が理屈で分かるはずです。

用語には「※1・※2…」と番号を付けて、各セクション末尾の「登場人物メモ」で説明します。

アニメーション『保存ボタンの裏側』を開く
あなたアプリ(メモ帳)OSストレージ(円盤)
  • あなた保存ボタンを押す人
  • アプリ(メモ帳)画面と機能を持つ係。ただし機械そのものには触れない
  • OS機械の中の世話役。アプリの「お願い」を一手に引き受ける
  • ストレージ(円盤)データを物理的に記録しておく部品。電源を切っても消えない
「▶ 再生」で通しで見るか、「次へ」で1手ずつ進めてください。
0 / 8

詳細 — 1段階ずつ追う

① アプリは「お願い」しかできない

🎬 アニメーション『保存ボタンの裏側』の ②〜③ のところです!

「アプリは部品に触れない」は、行儀の問題ではなくCPUの機能で強制されています:

  1. CPUにはユーザーモード / カーネルモード※1 という2つの動作モードがある
  2. 部品への入出力など危険な命令は、カーネルモードでしか実行できない
  3. アプリは常にユーザーモードで動く。部品に用があるときはシステムコール※2 で境界を越え、OS側のコード(カーネル)に処理を委ねる
  4. 実際にはアプリが直接システムコールを書くことは少なく、標準ライブラリ※3 が包んでくれている

登場人物メモ(※の説明):

  • ※1 ユーザーモード / カーネルモード — CPU自体が持つ権限の切り替え。境界の強制力の源
  • ※2 システムコール — モードの境界を越えるための正式な窓口。open / read / write / send など数百種類ある
  • ※3 標準ライブラリ — システムコールを使いやすく包んだ部品集。「ファイルを開く」と書くと、内部で適切なシステムコールに翻訳される

⚠️ イレギュラー(境界が破られるとき):

  • カーネルの脆弱性 — 境界そのものに穴があると、アプリがカーネル権限を奪える(権限昇格攻撃)。OSアップデートが最重要と言われる理由
  • 昔のOS — この境界が緩い時代は、1つのアプリのバグがOSごと巻き込んで青画面・全体フリーズを起こしていた
この部分をもっと深く(上級

初級の「アプリはお願いしかできない」、中級の「CPUのモードで強制される」を、上級ではCPUの特権レベルという一段下まで下ろします。

  1. CPUは命令を実行するとき、自分が今どの特権レベル※1 にいるかを持っている。大きくカーネルモード(特権)ユーザーモード(非特権)の2つ
  2. 入出力ポートへのアクセス、ページテーブルの差し替え、割り込みの制御といった特権命令※2 は、カーネルモードでしか実行できない
  3. アプリのコードは常にユーザーモードで走る。ユーザーモードで特権命令を実行しようとした瞬間、CPUは例外を上げ、制御を強制的にカーネルへ移す
  4. つまり「触れない」は監視でも善意でもなく、ハードウェアが引いた壁。アプリが部品に用があるなら、この壁を正式な入口から越えるしかない

登場人物メモ(※の説明):

  • ※1 特権レベル — CPUが持つ「今どれだけ強い権限で動いているか」の状態。x86では歴史的にリング0(カーネル)〜リング3(ユーザー)と呼ばれ、実運用ではこの両端だけを使うことが多い
  • ※2 特権命令 — 機械全体に影響する危険な命令。ユーザーモードで実行すると例外になり、勝手には通らない

⚠️ イレギュラー(壁の外側にもう1段ある):

  • もっと下の階層 — 仮想マシンを動かすと、OSカーネルの下にさらに強い権限層(ハイパーバイザ)が入る。ゲストOSの「特権」が、ホストから見ると特権でなくなる入れ子構造になる
  • 壁に穴があると全部崩れる — この境界の実装にバグがあると、後述の権限昇格でユーザーモードのコードがカーネル権限を得てしまう
やさしく言うと(初級

🎬 アニメーション『保存ボタンの裏側』の ②〜③ のところです!

アプリ(メモ帳・ブラウザ・ゲーム)は、画面と機能を持っていますが、機械の部品を動かす力を持っていません

  1. あなたが保存ボタンを押す
  2. アプリはデータを用意して、OSの窓口に「これを保存してください」と頼む(この窓口をシステムコールって言います)
  3. 保存だけでなく、画面に何かを出すのも、ネットに何かを送るのも、音を鳴らすのも、ぜんぶ同じ形のお願い

実は『パケットの旅』で「ブラウザがOSに住所調べをお願いする」場面がありました。あれもこれと同じ構造——どのアプリの、どんな仕事も、必ずOSを通るのです。

⚠️ イレギュラー(お願いが却下されるとき):

  • 権限がない — 「写真へのアクセスを許可しますか?」の確認で許可していなければ、OSはアプリのお願いを却下する。検問しているのはアプリではなくOS
  • お願いの相手が違うOS — お願いの作法はOSごとに違う。Windows用アプリがMacで動かないのは、作法が通じないから

② OSは世話役と交通整理

🎬 アニメーション『保存ボタンの裏側』の ④〜⑤ のところです!

初級で見た「区切り」と「順番の調整」の正式名はこうです:

  1. 実行中のアプリの単位をプロセス※1 と呼ぶ。タスクマネージャに並んでいるアレ
  2. 各プロセスは仮想メモリ※2 により「自分専用のメモリ空間」を持っているように見える——実際の物理メモリとの対応表はOSが管理し、他人の領域はそもそも見えない
  3. CPUの割り当てはスケジューラ※3 が数ミリ秒単位でプロセスを高速交代させる。「同時に動いている」は錯覚で、実体は超高速な切り替え
  4. 交代はタイマー割り込みによる強制。アプリの協力に頼らない(プリエンプティブ※4)

登場人物メモ(※の説明):

  • ※1 プロセス — 実行中のプログラム1個分の入れ物(メモリ空間 + 実行状態)
  • ※2 仮想メモリ — 「見かけの番地」と「物理の番地」を分離する仕組み。隔離と、メモリ不足時のディスク退避を両立する
  • ※3 スケジューラ — どのプロセスに次のCPU時間を与えるか決める係。優先度もここで効く
  • ※4 プリエンプティブ — 「OSが強制的に取り上げる」方式。譲り合い頼み(協調的)の対義語

⚠️ イレギュラー(区切りが効いている証拠):

  • 1つのアプリが無限ループ — そのプロセスのCPU時間を食い潰すだけで、他は動き続ける。タスクマネージャからの強制終了は「プロセスごと回収」
  • メモリを食い尽くすアプリ — 仮想メモリの退避(スワップ)で全体が重くなることはあるが、他プロセスのデータが壊れることはない
この部分をもっと深く(上級

初級の「区切り」、中級の「仮想メモリ」を、上級ではアドレス変換のハードウェアまで下ろします。境界は特権レベルだけでなく、アドレス空間でも引かれています。

  1. 各プロセスは自分専用の仮想アドレス空間を持つ。どのプロセスも「0番地から自分だけが全部使っている」ように見える
  2. 仮想アドレスから物理アドレスへの対応表がページテーブル※1。これはプロセスごとに別々にOSが用意する
  3. 実際の変換はCPU内のMMU※2 が命令ごとに行う。自分の表に載っていない物理ページは、そもそもアドレスとして表現できない
  4. だから他プロセスのメモリは「踏まないように気をつける」以前に届かない。プロセス切替のたびにOSは使うページテーブルを差し替える(これも特権命令)

登場人物メモ(※の説明):

  • ※1 ページテーブル — 仮想の番地と物理の番地の対応表。ページという固定サイズの単位で管理し、アクセス許可(読み/書き/実行)もここに持つ
  • ※2 MMU — Memory Management Unit。CPUに内蔵された住所変換係。変換の高速化のため直近の対応を覚える小さなキャッシュ(TLB)を持つ

⚠️ イレギュラー(分離が効く/揺らぐ場面):

  • 1プロセスがクラッシュしても他は無事 — 不正な番地に触れば、そのプロセスにだけ例外(セグメンテーション違反)が飛び、OSがそのプロセスだけ回収する
  • わざと壁の一部を共有する — 共有ライブラリや共有メモリは、複数プロセスの仮想空間から同じ物理ページを指させる。分離が原則で、共有は明示的な例外
  • 境界を漏らすハード欠陥 — 投機実行の副作用でアドレス空間の境界越しに情報が漏れる攻撃(Spectre/Meltdown系)は、ソフトの分離が正しくてもハード側から滲む例

プロセスとその中の作業員(スレッド)の関係は プロセスとスレッド で詳しく見ます。

アニメーション『プロセスとスレッド』を開く
プロセスA独立したメモリ空間スレッド1スレッド2スレッド3共有メモリ(ヒープ・グローバル変数など)↑ 同一プロセス内のスレッドが共有プロセスB独立したメモリ空間スレッド1スレッド2スレッド3共有メモリ(ヒープ・グローバル変数など)↑ 同一プロセス内のスレッドが共有隔離互いに見えないプロセスは独立(メモリを隔離)/スレッドは同一プロセス内でメモリを共有
やさしく言うと(初級

🎬 アニメーション『保存ボタンの裏側』の ④〜⑤ のところです!

OSはお願いを受けると、実行の段取りをします。

  1. ストレージの空いている場所を探して決める
  2. 同時に届いている他のアプリのお願いと順番を調整する(音楽を鳴らしながらファイルも保存できるのはこの整理のおかげ)
  3. 部品ごとの方言を翻訳して、具体的な命令を出す(この翻訳係をドライバって言います)

OSのもう1つの大仕事が区切ることです。メモリやCPUをアプリごとに区切って貸し出すので、アプリ同士はお互いの領域に手を出せません。

⚠️ イレギュラー(区切りが効く場面):

  • アプリが1つ固まった — 区切られているので、OSはそのアプリだけを強制終了できる。機械全体は巻き込まれない
  • お願いが殺到した — OSが順番待ちの列を作る。全体が遅くなることはあっても、データが混ざることはない

③ 部品が実行して、報告が遡る

🎬 アニメーション『保存ボタンの裏側』の ⑥〜⑧ のところです!

部品とのやり取りにも、隠れた工夫が2つあります:

  1. 割り込み※1 — 部品の作業完了をCPUが待ち続けるのは無駄なので、部品側から「終わりました」と通知させる。OSはその間、他のプロセスを動かしている
  2. 書き込みキャッシュ※2 — 遅いストレージへの書き込みは、いったんメモリに溜めてからまとめて行う。「保存しました」の表示時点で、実はまだ書き終わっていないことがある
  3. だから突然の電源断で「保存したはずのデータ」が消えることがあり、USBメモリに「安全な取り外し」が存在する

登場人物メモ(※の説明):

  • ※1 割り込み — 部品からCPUへの「手が空いたら見て」の通知。待ち時間をゼロにする仕組みで、キーボード入力もマウスも全部これ
  • ※2 書き込みキャッシュ — 速いメモリを遅いストレージの手前に挟む緩衝。性能と引き換えに「表示と実態のズレ」が生まれる

⚠️ イレギュラー(報告と実態のズレ):

  • 電源ぶち抜き — キャッシュ未書き込み分が消える。データベースや一部アプリが「本当に書き切る」指示(フラッシュ)をわざわざ発行するのはこのため
  • 「安全な取り外し」スキップ — 最近のOSは既定でキャッシュを弱めて耐性を上げているが、「表示=記録済み」ではない原理は変わらない
タスクマネージャは「今日の内容」の実況中継

Windowsのタスクマネージャ(Macのアクティビティモニタ)を開くと、今日の登場人物が全員見えます: 並んでいる行がプロセス、CPU列はスケジューラの配分結果、メモリ列は仮想メモリの使用量。フリーズしたアプリを「タスクの終了」で消せるのは、OSがプロセス単位で区切って管理しているからです。このユニットを読んだ後に開くと、ただの表が仕組み図に見えるはずです。

まとめ——初級の「全部の道がOSを通る」の正体は、CPUのモード(強制力)/ プロセスと仮想メモリ(隔離)/ スケジューラ(交代)/ 割り込みとキャッシュ(部品との緩衝)でした。この4点は、この先のコンテナ・仮想マシン・サーバ運用の話すべての土台になります。

やさしく言うと(初級

🎬 アニメーション『保存ボタンの裏側』の ⑥〜⑧ のところです!

命令を受けた部品(ストレージ)が、実際の記録を行います。

  1. ストレージが指定の場所にデータを物理的に書き込む(電源を切っても消えない)
  2. 「書けました」とOSに報告
  3. OSがアプリに「保存できましたよ」と返す
  4. アプリが画面に「保存しました」と表示——あなたに見えるのは、旅の最初と最後だけ
OSって具体的にどれのこと?

あなたが使っているのはたぶんこのどれかです: Windows(PC)、macOS(Mac)、Android(スマホ)、iOS(iPhone)。ゲーム機やテレビ、車にもそれぞれOSが入っています。見た目はまったく違いますが、やっている本業は今日の話——「アプリのお願いを受けて、部品を動かし、交通整理する」——で全部共通です。ちなみにサーバの世界でシェアが大きいのは Linux で、この先の学びの山で登場します。

まとめると、アプリとOSの関係は「お願いする側と、引き受けて仕切る側」です。全部の道がOSを通る——この一点を覚えておくと、権限の確認画面も、対応OSの表記も、フリーズしたアプリだけ終了できる理由も、全部同じ理屈で読めるようになります。

関連する知識

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. USBメモリの「安全な取り外し」が必要とされる技術的な理由はどれ?

2. CPUが1個でも複数のアプリが「同時に」動いているように見える理由はどれ?

3. 昔の「協調的マルチタスク」が、行儀の悪いアプリ1つで全体フリーズを起こしたのはなぜ?

4. アプリのソースに「ファイルを開く」と書くだけで動くのは、アプリとOSの間に何が入っているからか?

5. OSがタイマー割り込みでアプリからCPUを強制的に取り上げて交代させる方式を「〜マルチタスク」と呼ぶ。〜に入る語をカタカナで答えてください。

6. Windows用アプリがMacで動かない理由として、最も正確なものはどれ?

7. ユーザーモードとカーネルモードの区別が存在する目的はどれ?

8. 各アプリ(プロセス)が「自分専用のメモリ空間」を持っているように見える仕組みはどれ?