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

システムコールの仕組み

自分のメモリしか触れないのに、どうやってファイルを開くのか

リング 3 で動くプロセスは、割り当てられたメモリの外に手が届きません。ということは、ディスクにも、ネットワークカードにも、画面にも、自分では一切触れないということです。それでも open("a.txt") は動きます。

種明かしは単純で、自分でやるのをあきらめて、できる人に頼んでいます。プロセスは「このファイルを開いてほしい」という依頼をカーネルへ渡し、カーネルがリング 0 の権限で実行して、結果だけを返します。この依頼の窓口がシステムコールです。窓口は Linux でおよそ 400 個あり、これ以外にカーネルへ入る入口はありません。

番号を書いた紙を渡して、呼ばれるのを待つ

依頼といっても関数を呼び出すわけにはいきません。呼び出した先はリング 0 で、リング 3 からは番地すら見えないからです。代わりに使うのが、CPU が持っている専用の命令です。

やることは決まっています。何番の仕事を頼みたいのかを 1 つのレジスタに置き、引数を決められた順番で別のレジスタに置き、syscall 命令を実行します。CPU はそこで特権をリング 0 に切り替え、カーネルが用意した表を引いて、番号に対応する処理へ飛びます。

asm

mov rax, 1        ; 1 番の仕事、つまり write
mov rdi, 1        ; 書き込み先は標準出力
mov rsi, msg      ; 書きたい文字列の先頭
mov rdx, 3        ; 3 バイト
syscall           ; ここでカーネルへ渡る

引数を置く場所が決まっているのは、リング 3 とリング 0 で信頼していないもの同士が話すからです。好きな形式で渡させたら、カーネルが受け取った値を検証しきれません。Python の print も、何段か下ればこの形に行き着きます。

1 バイトずつ書くと、なぜ遅いのか

窓口を通るたびに、CPU はレジスタを退避し、特権を切り替え、渡された番地が本当にそのプロセスのものか確かめます。1 回あたり数百ナノ秒から数マイクロ秒です。単体では小さくても、1 バイト書くたびに窓口へ並べば、10 万バイトで 10 万回並ぶことになります。

ファイル出力を数キロバイト分ためてから 1 回で流す作り方が定番なのは、処理そのものが速くなるからではなく、並ぶ回数が減るからです。実際に何回並んでいるかは計測できます。

ターミナル

strace -e openat,read,write echo hello

プレーンテキスト

openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
read(3, "...", 832) = 832
write(1, "hello\n", 6) = 6

たった 1 語を表示するだけでも、共有ライブラリを探して開いて読む一式が先に走っています。-c を付けると集計だけが出るので、自分のプログラムでどの依頼が何回出ているかを数えてみてください。futex や mmap が異様に多ければ、疑うべきは自分の計算部分よりその周辺です。

ついでに 1 つ、ライブラリ関数がすべてシステムコールというわけではありません。malloc や printf の多くは、ライブラリの中だけで完結して窓口まで来ません。

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

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

  • メモリプログラムとデータを一時保持する高速領域
  • プロセス実行中のプログラムのこと。
  • カーネルOS の中核。資源管理を担う
  • システムコールアプリが OS の機能を呼ぶ入口
  • 関数処理に名前を付けて再利用できる単位
  • 引数位置引数=順番で渡す。
  • 処理計算や代入を表す長方形
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • Linux / macOS / Windows のアーキ比較

    Linux / macOS / Windows のアーキ比較

  • プロセスとは

    実行中のプログラムをカーネルが管理する単位であるプロセスの構成要素と、fork で複製し exec で中身を入れ替える OS の基本動作モデルを解説します。

  • メモリ階層(レジスタ→キャッシュ→RAM→ディスク)

    メモリ階層(レジスタ→キャッシュ→RAM→ディスク)

  • ファイルシステムとは

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

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

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