OS TRACK
OS(オペレーティングシステム)
Linux・Windows・macOS の比較から、プロセス・メモリ・ファイルシステムといった OS の考え方まで。まず TL;DR で。
Collection 01
デスクトップ(3)
Windows
Windows NT 系
Microsoft の OS。デスクトップで圧倒的シェアを持ち、業務ソフト・ゲーム・周辺機器の対応が広い。Windows Server としてサーバ用途にも展開する。
macOS
Unix 系(BSD ベース)
Apple の Unix 系デスクトップ OS。洗練された UX とハード統合が魅力で、開発(特に Web/iOS)やクリエイティブ用途に人気。Apple のハードでのみ動く。
Linux
Unix 系
オープンソースの Unix 系 OS。サーバ・クラウドで事実上の標準だが、デスクトップ・組込み・Android の基盤としても広く使われる“どこにでもいる”OS。
Collection 04
組込み・その他(2)
Linux
Unix 系
オープンソースの Unix 系 OS。サーバ・クラウドで事実上の標準だが、デスクトップ・組込み・Android の基盤としても広く使われる“どこにでもいる”OS。
RTOS / 組込み OS
リアルタイム OS(RTOS)
マイコンや組込み機器で動く小型 OS の総称。「決められた時間内に必ず応答する(リアルタイム性)」を最優先し、家電・車載・産業機器・IoT を支える。
| 項目 | Linux | RTOS / 組込み OS |
|---|---|---|
| 区分 | デスクトップ / サーバ / 組込み・その他 | 組込み・その他 |
| 系統 | Unix 系 | リアルタイム OS(RTOS) |
| カーネル | モノリシック(Linux カーネル) | リアルタイムカーネル(プリエンプティブ) |
| ライセンス | オープンソース(GPL) | 様々(FreeRTOS=MIT、Zephyr=Apache 等) |
| 主な用途 | サーバ / クラウド | マイコン・組込み機器 |
Concept Map
考え方・概念
プロセス・メモリ・ファイルシステムなど、OS が裏で何をしているか。まず TL;DR で。
カーネルモードとユーザーモード
CPU には権限の高いカーネルモードと低いユーザーモードがあり、OS の中核だけを特権で動かして安全を守ります。アプリはシステムコールでカーネルに処理を依頼します。
コピーオンライト(CoW)
コピーオンライトは、コピーを要求された時点では実体を共有し、書き込みが起きた瞬間に初めて複製する遅延戦略です。fork やスナップショットを高速・省メモリにします。
コンテキストスイッチ
コンテキストスイッチは、CPU が実行する対象を別のプロセスやスレッドへ切り替える処理です。レジスタなどの状態を退避・復元することで、1つの CPU を見かけ上共有します。
シグナル
シグナルは、OS やプロセスから別のプロセスへ送る軽量な非同期通知です。「終了して」「中断して」といった合図を番号で送り、受け手はハンドラで応じられます。
システムコールとカーネル
アプリは画面やファイル、ネットワークを直接は触れない。OS の中核「カーネル」に“お願い”するための窓口がシステムコール。保護のために世界を二つに分けている。
スレッドプール
スレッドプールは、あらかじめ作ったスレッドを使い回してタスクを処理する仕組みです。生成・破棄のコストを抑え、同時実行数を制御しながら多数の仕事をさばけます。
ゾンビプロセスと孤児プロセス
ゾンビプロセスは終了済みなのに親に回収されず残る状態、孤児プロセスは親が先に死んだ子です。前者は wait での回収、後者は init による引き取りで処理されます。
デッドロック
複数のプロセスやスレッドが、互いの持つ資源を待ち合って永久に止まる状態がデッドロックです。発生条件と予防・回避・検出の手法を整理します。
ファイルシステム
ディスクはただのバイトの並び。それを「ファイル」と「ディレクトリ」という人間に扱える形へ翻訳するのがファイルシステム。メタデータ・inode・ブロックで中身と位置を管理する。
プロセススケジューリング
1つのCPUを多数のプロセスで“代わりばんこ”に使う仕組み。誰に・どれだけCPUを渡すかを決めるのがスケジューラの仕事。
プロセスとスレッド
プロセスは独立したメモリ空間を持つ“実行中のプログラム”、スレッドはその中でメモリを共有しながら走る“実行単位”。隔離を取るか軽さ・共有を取るかで使い分ける。
プロセス間通信(IPC)
独立したプロセスは互いのメモリを直接覗けません。データや合図をやり取りする仕組みがプロセス間通信(IPC)で、パイプ・共有メモリ・ソケットなど複数の手段があります。
ページングとスワップ
仮想メモリをページという固定長の単位で物理メモリに割り当てる方式がページングです。物理に無いページはページフォルトを契機に、足りなければスワップで補います。
メモリマップトファイル(mmap)
メモリマップトファイルは、ファイルをプロセスのメモリ空間に対応づけ、ポインタ経由でメモリのように読み書きする手法です。read/write 呼び出しを介さず効率よく扱えます。
メモリ管理(スタックとヒープ)
プログラムが使うメモリは「スタック」と「ヒープ」に大きく分かれる。自動で片付く速い領域と、自分で確保して管理する自由な領域。その違いを押さえると、メモリリークやスタックオーバーフローの正体が見えてくる。
仮想記憶(ページング)
各プロセスに“自分専用の広いメモリ”があるかのように見せる仕組み。アドレスを翻訳し、足りなければディスクへ逃がして、物理メモリ以上に使えるようにする。
割り込みと入出力(I/O)
デバイスの「準備できたよ」をCPUに知らせる仕組みが割り込み。CPUは無駄に待たず、必要なときだけ反応してI/Oを効率よくさばく。
起動(ブート)プロセス
電源を入れてから OS が使えるようになるまでの一連の流れがブートです。ファームウェア(BIOS/UEFI)→ ブートローダ → カーネル → 初期化と、バトンを渡していきます。
排他制御とデッドロック
複数の処理が同じデータを同時にいじると壊れる。それを防ぐのが排他制御(ロック)で、ロックの掛け方を誤ると今度は全員が固まるデッドロックに陥る。
名前空間と cgroups(コンテナの基盤)
コンテナの「軽い隔離」は、Linux カーネルの名前空間(見える範囲の隔離)と cgroups(使える資源の制限)という2つの機能で実現されています。