コース一覧
OS入門:プロセス・メモリ・ファイルシステム
ガベージコレクション概要

OS入門:プロセス・メモリ・ファイルシステム

OSがCPU・メモリ・ストレージをどのように管理しているかを、プロセス、スレッド、仮想メモリ、ファイルシステム、同期と並行性から体系的に学びます。アプリケーションの裏側で何が起きているかを説明できるようになります。

1
OS とは
0. コンピューターとOSの役割15分
1. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
2. カーネルとユーザーランド15分
3. システムコールの仕組み15分
4. Linux / macOS / Windows のアーキ比較15分
2
プロセスとスレッド
0. プロセスとは15分
1. スレッドとプロセスの違い15分
2. コンテキストスイッチ15分
3. スケジューラとアルゴリズム15分
4. プロセス間通信(IPC)15分
3
メモリ管理
0. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
1. 仮想メモリ15分
2. ページングとスワップ15分
3. mmap とメモリマップトファイル15分
4. ガベージコレクション概要15分
4
ファイルシステム
0. ファイルシステムとは15分
1. i-node とディレクトリ15分
2. ext4 / APFS / NTFS の違い15分
3. ジャーナリングと耐障害性15分
4. パーミッションと所有者15分
5
同期と並行性
0. レースコンディション15分
1. Mutex と Semaphore15分
2. デッドロック15分
3. 非同期と並行15分
4. イベントループと epoll15分

OS入門:プロセス・メモリ・ファイルシステム

01コンピューターとOSの役割
02OSの歴史(バッチ→マルチタスク→マルチユーザー)
03カーネルとユーザーランド
04システムコールの仕組み
05Linux / macOS / Windows のアーキ比較
06プロセスとは
07スレッドとプロセスの違い
08コンテキストスイッチ
09スケジューラとアルゴリズム
10プロセス間通信(IPC)
11メモリ階層(レジスタ→キャッシュ→RAM→ディスク)
12仮想メモリ
13ページングとスワップ
14mmap とメモリマップトファイル
15ガベージコレクション概要
16ファイルシステムとは
17i-node とディレクトリ
18ext4 / APFS / NTFS の違い
19ジャーナリングと耐障害性
20パーミッションと所有者
21レースコンディション
22Mutex と Semaphore
23デッドロック
24非同期と並行
25イベントループと epoll

OS入門:プロセス・メモリ・ファイルシステム

ガベージコレクション概要

誰からも指されない箱は回収される

解放を書き忘れた 1 行が、3 日後にサーバーを落とす

C で malloc した領域は、free を呼ぶまで空きに戻りません。1 リクエストにつき 200 バイト解放し忘れるだけでも、毎秒 100 リクエストを捌くサーバーなら 1 日で 1.7GB 積み上がります。逆に、まだ誰かが持っているポインタの先を free してしまうと、次にそこを読んだコードが意味不明な値をつかみます。前者がメモリリーク、後者が use-after-free です。

どちらも「もう誰も使っていないか」を人間が判断しているから起きます。ならばその判断を機械にやらせよう、というのがガベージコレクションです。

素朴な答えは、指されている数を数えること

一番わかりやすいのは、オブジェクトごとに「今いくつの変数から指されているか」を数える方法です。代入で 1 増え、変数がスコープを抜けると 1 減り、0 になった瞬間に解放します。CPython の主力はこれで、sys.getrefcount で数を覗けます。

不要になった瞬間に回収されるので、掃除のために止まる時間もほぼありません。ただしこの方式には、塞げない穴が 1 つあります。

Python

a = {}
b = {}
a["next"] = b
b["prev"] = a
del a, b        # 変数は消えたが、互いに指し合っているのでカウントは 1 のまま

外から見れば完全なゴミですが、2 つは互いを指しているためカウントが 0 になりません。輪になったゴミは、数を数える方式では永久に回収できません。

「指されているか」ではなく「辿り着けるか」で決める

そこで発想を変えます。実行中のスタックやグローバル変数を出発点として、参照をひたすら辿ります。辿り着けたものが生きているもので、それ以外はすべてゴミです。印を付けて回る工程をマーク、印の無いものを回収する工程をスイープと呼びます。

diagram (will load when visible)

D と E は互いを指していますが、出発点から辿り着けないので回収されます。先ほどの穴が塞がりました。

代わりに支払うものがあります。辿っている最中にオブジェクトの繋がりが書き換わると答えが狂うため、この方式はアプリを止めて実行する必要が出てきます。数十ミリ秒アプリ全体が固まる、あの停止時間の正体です。Java の ZGC や Go のように、アプリと並行して辿ることで停止を 1 ミリ秒以下に抑える実装が主流になってきました。

GC があってもリークは起きる

回収されないのは「辿り着けてしまうゴミ」です。グローバルな辞書にキャッシュを入れっぱなしにする、イベントリスナーを登録したまま外し忘れる。参照が残っている以上、GC から見れば生きているオブジェクトなので、いつまでも解放されません。

自動になったのは解放の実行であって、「もう要らない」と手放す判断ではない、ということです。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • メモリプログラムとデータを一時保持する高速領域
  • 判断YES/NO 分岐を表す菱形
  • オブジェクトキーと値のペアで構造を作るデータ
  • 変数データに名前をつけて参照する仕組み
  • スコープ変数が参照可能な範囲
  • スタック後入れ先出し(LIFO)のデータ構造
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • ファイルシステムとは

    ディスク上の生のバイト列を人間が扱えるファイルとディレクトリへ組織化するファイルシステムの役割を、何を解決しているかという視点から解説します。

  • レースコンディション

    複数スレッドが同じ資源を同時に変更し実行順で結果が変わるレースコンディションの正体と、アトミック操作やロックで防ぐ具体策を実務目線で解説します。

  • mmap とメモリマップトファイル

    ファイルを仮想メモリ空間に貼り付ける mmap で、I/O をポインタ操作に変える仕組みと、共有メモリや実行ファイル読込みなど現代 OS での使われ方を解説します。

  • ページングとスワップ

    メモリを固定サイズのページに区切って仮想と物理を対応づけるページングと、使わないページをディスクへ退避するスワップ、スラッシングの危険を解説します。

分からないところは Tap (AI先生) に質問できます

24 時間いつでも、あなたのレベルに合わせて日本語で答えます。