コース一覧
OS入門:プロセス・メモリ・ファイルシステム
mmap とメモリマップトファイル

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入門:プロセス・メモリ・ファイルシステム

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

4GB のログから、末尾の 1 行だけが見たい

read でファイルを読むと、カーネルはディスクの中身をいったんカーネル側のバッファへ読み込み、そこからこちらが渡したバッファへコピーします。数 KB なら気にする必要はありませんが、大きなファイルを扱うほどこのコピーが効いてきます。読みたい範囲を自分で計算し、シークし、バッファの長さを管理する手間も付いてきます。

一方で、ファイルの中身も一度は RAM の上に載ります。番地さえ結びつけられれば、コピーせずに直接読めるはずです。そして「触ったときに初めて読み込む」仕掛けは、ページフォールトとして既に手元にあります。

ファイルを、番地の側に貼り付ける

mmap は、ファイルをプロセスの仮想アドレス空間へ割り当てるシステムコールです。呼んだ時点では 1 バイトも読まれません。翻訳表に「この番地の範囲は、あのファイルのこの位置」と書き込まれるだけです。

Python

import mmap

with open("access.log", "rb") as f:
    with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
        pos = m.rfind(b"\n", 0, len(m) - 1)
        print(m[pos + 1:].decode())

m は 4GB の bytes のように振る舞い、末尾から改行を探せます。しかし実際に RAM へ読み込まれるのは、末尾を触ったときの数ページだけです。触った瞬間にページフォールトが起き、OS がその位置のブロックだけをディスクから読み込みます。読み込み済みの位置を覚えておく変数も、バッファの継ぎ目を扱うコードも要りません。

同じファイルを貼れば、同じ物理ページを共有する

2 つのプロセスが同じファイルを共有モードで貼ると、両者の仮想アドレスは同じ物理ページへ結びつきます。片方が書いた内容がもう片方から即座に見えるので、これがそのまま共有メモリとして使えます。

実行ファイルや共有ライブラリの読み込みも、この仕組みです。libc を使うプロセスが 200 個動いていても、libc のコードは RAM 上に 1 つしか無く、200 通りの仮想アドレスがそこを指しています。プロセスを増やしても RAM が線形に増えないのは、この共有が効いているからです。

なお実行ファイルは、書き込みが自分の中だけで完結するモードで貼られます。共有していたページに書き込みが起きた瞬間だけ、そのページが複製されて自分専用になる仕組みなので、走っているコードを書き換えても元のファイルは壊れません。

常に速いわけではない

先頭から順に 1 度だけ読むなら、read に負けます。カーネルは連続読みを検知して先の分まで前もって読んでおきますが、mmap は触るまで読まないので、ページフォールトのたびに待ちが入るためです。

mmap が効くのは、巨大なファイルの一部を飛び飛びに触る場合と、複数プロセスで同じ内容を共有したい場合です。SQLite や LMDB がこの方式を採るのは、まさに前者の使い方をするからです。

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

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

  • カーネルOS の中核。資源管理を担う
  • プロセス実行中のプログラムのこと。
  • システムコールアプリが OS の機能を呼ぶ入口
  • ロック「他の人触らないでね」と DB に予約する
  • 変数データに名前をつけて参照する仕組み
  • メモリプログラムとデータを一時保持する高速領域
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

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

    不要になったメモリをランタイムが自動解放するガベージコレクションの仕組みを、参照カウントやマークアンドスイープなど主要アルゴリズムの違いで解説します。

  • ファイルシステムとは

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

  • レースコンディション

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

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

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