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

非同期と並行

100 件の API を順に叩いたら 100 秒かかった

1 件 1 秒で返る API を 100 件呼びます。素直に for 文で書けば 100 秒です。その 100 秒間、CPU が何をしているかというと、ほとんど何もしていません。リクエストを送ってから返事が届くまで、やることが無いのです。

1 秒という待ちは、CPU にとって途方もない長さです。ナノ秒単位で動く側から見れば、10 億回分の仕事ができる時間を、ただ座って過ごしていることになります。

スレッドを 100 本立てる、では届かない

待っている間に他の仕事をさせればよい、という方針は正しいです。素直な実装は、100 件それぞれに 1 本ずつスレッドを割り当てることで、実際これで 100 秒は 1 秒あまりまで縮みます。

では 10,000 件ならどうか。ここで頭打ちになります。OS スレッドは 1 本ごとにスタック用の領域を抱え、既定では 8MB 分の番地が確保されます。加えて OS がスレッドを切り替えるたびに、レジスタの退避と復元が必要です。1 回あたりはわずかでも、待っているだけのスレッドが 1 万本あると、切り替えのために CPU を使う割合が無視できなくなります。

そもそも、やりたいのは「返事が来た人から順に処理する」だけです。それ専用の道具として、スレッドは重すぎます。

待ちに入るところで、自分から譲る

非同期処理は、待ちが発生する場所をコード上に明示させます。

Python

async def fetch(session, url):
    async with session.get(url) as resp:
        return await resp.text()

results = await asyncio.gather(*[fetch(s, u) for u in urls])

await と書いた行で、この関数は「ここから先は返事待ちなので、他の人にどうぞ」と中断します。中断した関数の状態は数 KB のオブジェクトとして残るだけで、OS スレッドは 1 本のまま次に進める関数へ移ります。返事が届いた関数は、中断した行から再開します。

スレッドの切り替えを OS が勝手に行うのに対し、こちらは書いた本人が譲る場所を決めています。譲る場所が分かっているぶん切り替えは桁違いに軽く、同じ 1 スレッドで数万件を抱えられます。

同時に進むことと、同時に走ることは違う

ここまでの話に、CPU コアを増やす要素は 1 つも出てきません。1 コアでも 100 件を「進行中」にはできます。これが 並行 です。対して、複数のコアで物理的に同時に計算するのが 並列 です。

シェフが 1 人でフライパン 3 つを順に振るのが並行、シェフが 3 人いるのが並列、という例えがよく使われます。非同期処理が効くのは前者、つまり待ち時間が支配的な仕事です。

裏を返すと、待ちのない計算では逆効果になります。await を挟まない重いループを書くと、その関数は誰にも譲らないので、同じスレッドに乗っている全タスクがその間まったく動きません。画像の変換や巨大な集計は、別のスレッドかプロセスへ逃がすのが定石です。

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

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

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • スレッド1 つの質問に紐づく返信の集まり
  • スタック後入れ先出し(LIFO)のデータ構造
  • 処理計算や代入を表す長方形
  • 非同期完了を待たずに次へ進み、後で結果を受ける
  • 同期処理が終わるまで次に進まない実行順
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • イベントループと epoll

    I/O 完了イベントを一スレッドで順次処理するイベントループと、その基盤となる epoll や kqueue を使って大量同時接続をさばく仕組みを解説します。

  • デッドロック

    複数スレッドが互いのロックを待ち合って永久停止するデッドロックの成立条件と、ロック順序の固定やタイムアウトなど複数の防止策を実務目線で解説します。

  • Mutex と Semaphore

    同時に一つしか入れない Mutex と、N 個まで入れる Semaphore の違いを、所有権の概念と具体的な使いどころを示しながら分かりやすく整理します。

  • レースコンディション

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

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

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