コース一覧
コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
mmap とメモリマップトファイル

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ソート、探索、再帰などのアルゴリズムに加え、OS (プロセス、メモリ、ファイルシステム)、ネットワーク (TCP/IP、HTTP、DNS、CDN)、データベースまで、Web エンジニアに必要な CS の基礎を一本で学べる総合コースです。エンジニア転職を目指す学習者や、CS 出身でない現役エンジニアを対象としています。約 34 時間 (1 日 30 分 × 68 日) で 135 レッスンを修了でき、修了後は技術選定やシステム設計の議論に自信を持って参加できるようになります。

1
再帰の基礎
0. 階乗(再帰)5分
1. フィボナッチ数(再帰)5分
2. 累乗(再帰)5分
3. 配列の合計(再帰)5分
4. 桁数を数える(再帰)5分
5. 文字列を逆順(再帰)5分
6. ユークリッドの互除法(GCD)5分
7. 第1章まとめクイズ — 再帰の基礎5分
2
第2章 探索
0. 線形探索で位置を返す5分
1. 二分探索 (反復版)5分
2. 二分探索 (再帰版)5分
3. lower_bound (最初に >= target の位置)5分
4. ピーク要素検索5分
5. 回転ソート配列での探索5分
6. 第2章まとめクイズ5分
3
ソート
0. バブルソート実装5分
1. 選択ソート5分
2. 挿入ソート5分
3. マージソート5分
4. クイックソート5分
5. カウントソート5分
6. 比較関数つきソート5分
7. 第3章まとめクイズ5分
4
配列 / 文字列の応用
0. 双方向ポインタで和 = K5分
1. スライド窓の最大和5分
2. 回文判定5分
3. 重複なし最長部分文字列5分
4. 大きな数の文字列乗算5分
5. アナグラムグルーピング5分
6. 第4章まとめクイズ — 配列 / 文字列の応用5分
5
クラスと OOP
0. 長方形クラス(面積と周長)5分
1. スタッククラス(push と pop)5分
2. キュークラス(enqueue と dequeue)5分
3. 単方向リンクリスト5分
4. 二分探索木 (BST) への挿入5分
5. カウンタクラス(機能合成)5分
6. 第 5 章クイズ — クラスと OOP5分
6
動的計画法 (基礎)
0. メモ化フィボナッチ5分
1. DP配列でフィボナッチ5分
2. 階段の登り方5分
3. コイン両替最小枚数5分
4. 0/1 ナップサック問題5分
5. 最長共通部分列 (LCS)5分
6. 第6章まとめクイズ5分
7
総合演習
0. ソート済み 2 配列のマージ5分
1. 配列の k 回転5分
2. カッコの妥当性5分
3. ローマ数字を整数に5分
4. 整数をローマ数字に5分
5. 雨水を溜める5分
6. 最終総まとめクイズ5分
8
[OS] Section 1. OS とは
0. コンピューターとOSの役割15分
1. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
2. カーネルとユーザーランド15分
3. システムコールの仕組み15分
4. Linux / macOS / Windows のアーキ比較15分
9
[OS] Section 2. プロセスとスレッド
0. プロセスとは15分
1. スレッドとプロセスの違い15分
2. コンテキストスイッチ15分
3. スケジューラとアルゴリズム15分
4. プロセス間通信(IPC)15分
10
[OS] Section 3. メモリ管理
0. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
1. 仮想メモリ15分
2. ページングとスワップ15分
3. mmap とメモリマップトファイル15分
4. ガベージコレクション概要15分
11
[OS] Section 4. ファイルシステム
0. ファイルシステムとは15分
1. i-node とディレクトリ15分
2. ext4 / APFS / NTFS の違い15分
3. ジャーナリングと耐障害性15分
4. パーミッションと所有者15分
12
[OS] Section 5. 同期と並行性
0. レースコンディション15分
1. Mutex と Semaphore15分
2. デッドロック15分
3. 非同期と並行15分
4. イベントループと epoll15分
13
[ネットワーク] ネットワークの全体像
0. ネットワークとは8分
1. OSI 7階層モデル10分
2. TCP/IP 4階層モデル9分
3. パケットとフレーム9分
4. ルーター・スイッチ・ハブ9分
14
[ネットワーク] IP とルーティング
0. IPアドレス (IPv4 / IPv6)10分
1. サブネットマスクと CIDR11分
2. NAT とプライベートIP9分
3. ルーティングと経路選択10分
4. ファイアウォール基礎9分
15
[ネットワーク] TCP / UDP
0. TCP と UDP の違い9分
1. 3-way ハンドシェイク9分
2. 輻輳制御と再送10分
3. UDP の用途 (DNS / 動画 / ゲーム)8分
4. ポート番号と well-known port9分
16
[ネットワーク] HTTP / HTTPS
0. HTTP の基本10分
1. HTTP メソッド9分
2. HTTPS と TLS ハンドシェイク10分
3. HTTP/2 と HTTP/3 (QUIC)10分
4. REST API の設計原則10分
17
[ネットワーク] DNS とドメイン
0. DNS とは8分
1. レコードタイプ10分
2. 名前解決の流れ10分
3. DNS キャッシュと TTL9分
4. CDN の仕組みと Anycast10分
18
[ネットワーク] 応用
0. ロードバランサ (L4 / L7)10分
1. プロキシとリバースプロキシ9分
2. WebSocket とリアルタイム通信9分
3. gRPC と HTTP/2 利用10分
19
[データベース] データベースの基礎
0. データベースとは8分
1. RDB と NoSQL の違い8分
2. データベースの歴史8分
3. エンティティ関係モデル (ER)8分
4. 主キー・外部キー・候補キー8分
20
[データベース] 正規化
0. 正規化とは何か8分
1. 第1正規形8分
2. 第2正規形8分
3. 第3正規形8分
4. 非正規化のトレードオフ8分
21
[データベース] インデックスと B-tree
0. インデックスの役割8分
1. B-tree の仕組み8分
2. B+tree(実際の DB 実装)8分
3. ハッシュインデックス8分
4. カバリングインデックス8分
22
[データベース] トランザクションと ACID
0. トランザクションとは8分
1. ACID 特性8分
2. 分離レベル8分
3. MVCC(マルチバージョン同時実行制御)8分
4. デッドロックと回避8分
23
[データベース] クエリ最適化
0. クエリプランナの役割8分
1. EXPLAIN の読み方8分
2. Nested Loop / Hash / Merge Join8分
3. インデックスチューニング8分
4. 統計情報とカーディナリティ8分
24
[データベース] スケーリング
0. レプリケーション8分
1. シャーディング8分
2. CAP 定理8分
3. 結果整合性8分
4. NewSQL と分散 SQL8分

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

01階乗(再帰)
02フィボナッチ数(再帰)
03累乗(再帰)
04配列の合計(再帰)
05桁数を数える(再帰)
06文字列を逆順(再帰)
07ユークリッドの互除法(GCD)
08第1章まとめクイズ — 再帰の基礎
09線形探索で位置を返す
10二分探索 (反復版)
11二分探索 (再帰版)
12lower_bound (最初に >= target の位置)
13ピーク要素検索
14回転ソート配列での探索
15第2章まとめクイズ
16バブルソート実装
17選択ソート
18挿入ソート
19マージソート
20クイックソート
21カウントソート
22比較関数つきソート
23第3章まとめクイズ
24双方向ポインタで和 = K
25スライド窓の最大和
26回文判定
27重複なし最長部分文字列
28大きな数の文字列乗算
29アナグラムグルーピング
30第4章まとめクイズ — 配列 / 文字列の応用
31長方形クラス(面積と周長)
32スタッククラス(push と pop)
33キュークラス(enqueue と dequeue)
34単方向リンクリスト
35二分探索木 (BST) への挿入
36カウンタクラス(機能合成)
37第 5 章クイズ — クラスと OOP
38メモ化フィボナッチ
39DP配列でフィボナッチ
40階段の登り方
41コイン両替最小枚数
420/1 ナップサック問題
43最長共通部分列 (LCS)
44第6章まとめクイズ
45ソート済み 2 配列のマージ
46配列の k 回転
47カッコの妥当性
48ローマ数字を整数に
49整数をローマ数字に
50雨水を溜める
51最終総まとめクイズ
52コンピューターとOSの役割
53OSの歴史(バッチ→マルチタスク→マルチユーザー)
54カーネルとユーザーランド
55システムコールの仕組み
56Linux / macOS / Windows のアーキ比較
57プロセスとは
58スレッドとプロセスの違い
59コンテキストスイッチ
60スケジューラとアルゴリズム
61プロセス間通信(IPC)
62メモリ階層(レジスタ→キャッシュ→RAM→ディスク)
63仮想メモリ
64ページングとスワップ
65mmap とメモリマップトファイル
66ガベージコレクション概要
67ファイルシステムとは
68i-node とディレクトリ
69ext4 / APFS / NTFS の違い
70ジャーナリングと耐障害性
71パーミッションと所有者
72レースコンディション
73Mutex と Semaphore
74デッドロック
75非同期と並行
76イベントループと epoll
77ネットワークとは
78OSI 7階層モデル
79TCP/IP 4階層モデル
80パケットとフレーム
81ルーター・スイッチ・ハブ
82IPアドレス (IPv4 / IPv6)
83サブネットマスクと CIDR
84NAT とプライベートIP
85ルーティングと経路選択
86ファイアウォール基礎
87TCP と UDP の違い
883-way ハンドシェイク
89輻輳制御と再送
90UDP の用途 (DNS / 動画 / ゲーム)
91ポート番号と well-known port
92HTTP の基本
93HTTP メソッド
94HTTPS と TLS ハンドシェイク
95HTTP/2 と HTTP/3 (QUIC)
96REST API の設計原則
97DNS とは
98レコードタイプ
99名前解決の流れ
100DNS キャッシュと TTL
101CDN の仕組みと Anycast
102ロードバランサ (L4 / L7)
103プロキシとリバースプロキシ
104WebSocket とリアルタイム通信
105gRPC と HTTP/2 利用
106データベースとは
107RDB と NoSQL の違い
108データベースの歴史
109エンティティ関係モデル (ER)
110主キー・外部キー・候補キー
111正規化とは何か
112第1正規形
113第2正規形
114第3正規形
115非正規化のトレードオフ
116インデックスの役割
117B-tree の仕組み
118B+tree(実際の DB 実装)
119ハッシュインデックス
120カバリングインデックス
121トランザクションとは
122ACID 特性
123分離レベル
124MVCC(マルチバージョン同時実行制御)
125デッドロックと回避
126クエリプランナの役割
127EXPLAIN の読み方
128Nested Loop / Hash / Merge Join
129インデックスチューニング
130統計情報とカーディナリティ
131レプリケーション
132シャーディング
133CAP 定理
134結果整合性
135NewSQL と分散 SQL

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

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 時間いつでも、あなたのレベルに合わせて日本語で答えます。