- Authors

- Name
- Youngju Kim
- @fjvbn20031
LinuxとWindows 10オペレーティングシステム比較
LinuxとWindowsは異なる設計哲学を持つオペレーティングシステムです。この記事では、両方のOSのカーネルアーキテクチャ、プロセス管理、メモリ管理、ファイルシステム等を比較し、Windows Subsystem for Linux(WSL)も解説します。
1. Linuxシステム概要
Linuxカーネルアーキテクチャ
Linuxはモノリシック(monolithic)カーネルを基盤としつつ、モジュール(module)システムで柔軟性を確保しています。
┌───────────────────────────────────────────────┐
│ ユーザー空間 │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ bash │ │ nginx│ │ gcc │ │ java │ │
│ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ │
│ └────────┴────────┴────────┘ │
│ │ システムコールインターフェース │
├──────────────┴────────────────────────────────┤
│ カーネル空間 │
│ ┌─────────────────────────────────────────┐ │
│ │ プロセス管理 │ │
│ │ スケジューラ │ プロセス生成 │ シグナル │ │
│ ├─────────────────────────────────────────┤ │
│ │ メモリ管理 │ │
│ │ 仮想メモリ │ ページキャッシュ │ slab │ │
│ ├─────────────────────────────────────────┤ │
│ │ VFS(仮想ファイルシステム) │ │
│ │ ext4 │ XFS │ Btrfs │ NFS │ tmpfs │ │
│ ├─────────────────────────────────────────┤ │
│ │ ネットワークスタック │ │
│ │ TCP/IP │ ソケット │ Netfilter │ eBPF │ │
│ ├─────────────────────────────────────────┤ │
│ │ デバイスドライバ │ │
│ │ ブロック │ 文字 │ ネットワーク │ USB │ │
│ └─────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────┐ │
│ │ ハードウェア抽象化 │ │
│ └─────────────────────────────────────────┘ │
├───────────────────────────────────────────────┤
│ ハードウェア │
└───────────────────────────────────────────────┘
Linuxプロセス管理
// Linux의 프로세스 구조 (task_struct 주요 필드)
struct task_struct {
volatile long state; // 프로세스 상태
int prio; // 우선순위
struct mm_struct *mm; // 메모리 정보
struct fs_struct *fs; // 파일 시스템 정보
struct files_struct *files; // 열린 파일 테이블
struct signal_struct *signal; // 시그널 정보
pid_t pid; // 프로세스 ID
pid_t tgid; // 스레드 그룹 ID
struct task_struct *parent; // 부모 프로세스
struct list_head children; // 자식 프로세스 목록
// ...
};
Linuxプロセス状態:
┌─────────┐ fork() ┌─────────┐
│ 存在しない│────────→│ READY │
│ │ │(実行 │
└─────────┘ │ 可能) │
└────┬────┘
スケジューリング│ プリエンプション
┌────┴────┐
│ RUNNING │
│(実行中)│
└────┬────┘
I/O待ち│ │exit()
┌────┴──┐ │
│SLEEPING│ │
│(待機中)│ │
└────────┘ │
┌─────┴───┐
│ ZOMBIE │
│(終了済)│ → wait() → 除去
└─────────┘
Linuxプロセススケジューラ(CFS)
CFS(Completely Fair Scheduler)は仮想ランタイムに基づいて公平にCPU時間を分配します。
CFS レッドブラックツリー:
(vruntime基準ソート)
B (vruntime=50)
╱ ╲
A (30) ╱ ╲ D (80)
╱ ╲
C (45) E (100)
→ 最左端ノード(A, vruntime=30)が次の実行対象
→ 実行後Aのvruntimeが増加 → ツリー再配置
→ O(log n) 挿入/削除
Linuxメモリ管理
Linuxプロセス仮想アドレス空間(64ビット):
高いアドレス
┌──────────────────────┐ 0xFFFFFFFF...
│ カーネル空間 │
│ (全プロセス共有) │
├──────────────────────┤ 0x7FFF...
│ スタック(↓成長) │
│ (空き領域) │
│ mmap領域 │ ← 共有ライブラリ、mmap
│ (空き領域) │
│ ヒープ(↑成長) │ ← malloc/brk
├──────────────────────┤
│ BSS(未初期化) │
├──────────────────────┤
│ データ(初期化済)│
├──────────────────────┤
│ テキスト(コード)│
└──────────────────────┘ 0x0000...
低いアドレス
Linuxファイルシステム管理
# Linux에서 지원하는 주요 파일 시스템
# ext4 : 범용 (가장 널리 사용)
# XFS : 대용량 파일/고성능
# Btrfs : CoW, 스냅샷, 압축
# tmpfs : 메모리 기반 임시 파일 시스템
# procfs : 프로세스 정보 (/proc)
# sysfs : 장치/드라이버 정보 (/sys)
df -hT
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/sda1 ext4 100G 45G 50G 48% /
# tmpfs tmpfs 16G 0 16G 0% /dev/shm
Linuxカーネルモジュール
ランタイムにカーネル機能を動的に追加/削除できます。
// 간단한 커널 모듈 예시
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Example");
MODULE_DESCRIPTION("Hello World Module");
static int __init hello_init(void) {
printk(KERN_INFO "Hello, Kernel Module!\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, Kernel Module!\n");
}
module_init(hello_init);
module_exit(hello_exit);
# 커널 모듈 관리 명령어
lsmod # 로드된 모듈 목록
sudo insmod hello.ko # 모듈 로드
sudo rmmod hello # 모듈 언로드
sudo modprobe module_name # 의존성 자동 해결 로드
modinfo module_name # 모듈 정보 확인
2. Windows 10システム概要
Windowsアーキテクチャ
Windowsはハイブリッドカーネル構造を使用します。
┌───────────────────────────────────────────────┐
│ ユーザーモード │
│ ┌────────────────────────────────────────┐ │
│ │ システムプロセス │ │
│ │ サービスマネージャ │ LSA │ セッションMgr│ │
│ └────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────┐ │
│ │ サブシステム │ │
│ │ Windows (Win32) │ POSIX │ WSL │ │
│ └────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────┐ │
│ │ 環境サブシステムDLL │ │
│ │ ntdll.dll │ kernel32.dll │ user32.dll│ │
│ └────────────────────────────────────────┘ │
├───────────────────────────────────────────────┤
│ カーネルモード │
│ ┌────────────────────────────────────────┐ │
│ │ エグゼクティブ(Executive) │ │
│ │ Object Mgr │ Process Mgr │ Memory Mgr│ │
│ │ I/O Mgr │ Cache Mgr │ Security │ │
│ │ Config Mgr │ PnP Mgr │ Power Mgr │ │
│ ├────────────────────────────────────────┤ │
│ │ カーネル(Kernel) │ │
│ │ スケジューリング │ 同期 │ 割り込み処理│ │
│ ├────────────────────────────────────────┤ │
│ │ HAL(ハードウェア抽象化層) │ │
│ └────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────┐ │
│ │ デバイスドライバ │ │
│ └────────────────────────────────────────┘ │
├───────────────────────────────────────────────┤
│ ハードウェア │
└───────────────────────────────────────────────┘
Windowsオブジェクトマネージャー(Object Manager)
Windowsカーネルはほぼすべてのリソースをオブジェクトとして管理します。
オブジェクトマネージャー名前空間:
\
├── Device
│ ├── HarddiskVolume1
│ ├── Tcp
│ └── Null
├── ObjectTypes
│ ├── Process
│ ├── Thread
│ ├── File
│ ├── Mutex
│ └── Semaphore
├── Sessions
│ └── 1
│ └── BaseNamedObjects
└── GLOBAL??
├── C: → Device\HarddiskVolume1
└── D: → Device\CdRom0
Windowsスケジューリング
Windows優先度レベル:
31 ┌──────────────────┐
│ リアルタイムクラス│ 16-31: リアルタイム優先度
16 ├──────────────────┤
15 │ 可変クラス │ 1-15: 動的優先度
│ │ (I/O完了時に一時的ブースト)
1 ├──────────────────┤
0 │ Idle │ 0: システムアイドルスレッド
└──────────────────┘
優先度ブースト:
- 対話型プロセス: フォアグラウンドブースト
- I/O完了: 一時的優先度上昇
- 飢餓防止: 長期待ちスレッドブースト
NTFS(NT File System)
NTFSの主要特徴:
┌──────────────────────────────────────────┐
│ MFT (Master File Table): │
│ - すべてのファイル/ディレクトリの │
│ メタデータを保存 │
│ - 各エントリ約1KB │
│ - 小さいファイルはMFTレコードに直接保存 │
│ │
│ 追加特徴: │
│ - ジャーナリング(トランザクションログ)│
│ - ファイルレベル圧縮 │
│ - ファイルレベル暗号化(EFS) │
│ - 代替データストリーム(ADS) │
│ - ACLベースの細かなアクセス制御 │
│ - ディスククォータ │
│ - シンボリックリンク、ジャンクション │
└──────────────────────────────────────────┘
3. Linux vs Windows 比較
カーネルアーキテクチャ比較
| 特性 | Linux | Windows |
|---|---|---|
| カーネル種類 | モノリシック(+モジュール) | ハイブリッド |
| ソースコード | オープンソース(GPL) | 非公開(一部公開) |
| デバイスドライバ | カーネル内/モジュール | カーネル/ユーザーモード |
| ファイルシステム | VFS抽象化 | I/Oマネージャ+フィルタDrv |
| セキュリティ | DAC + MAC(SELinux) | ACL + 整合性レベル |
プロセスモデル比較
Linux: Windows:
┌─────────────────────┐ ┌─────────────────────┐
│ プロセス(fork) │ │ プロセス │
│ ┌────┐ │ │ (CreateProcess) │
│ │Task│ = プロセス │ │ ┌──────┐ ┌──────┐ │
│ └────┘ │ │ │Thread│ │Thread│ │
│ │ │ └──────┘ └──────┘ │
│ スレッド = 軽量 │ │ │
│ プロセス(clone) │ │ ファイバ(Fiber): │
│ ┌────┐ ┌────┐ │ │ ユーザーモードスレッド│
│ │Task│ │Task│ │ │(協調スケジューリング)│
│ └────┘ └────┘ │ └─────────────────────┘
│ → 同じmm_struct共有│
└─────────────────────┘
Linux fork(): プロセス複製(CoW)
Windows CreateProcess(): 新プロセスを直接生成
ファイルシステム比較
| 特性 | Linux (ext4) | Windows (NTFS) |
|---|---|---|
| メタデータ | inode | MFTレコード |
| 最大ファイルサイズ | 16 TiB | 256 TiB |
| ジャーナリング | サポート | サポート |
| 権限 | POSIX (rwx) | ACL |
| 大文字小文字 | 区別 | 保存(デフォルト非区別) |
| ファイルストリーム | 単一 | 複数(ADS) |
| 暗号化 | dm-crypt(ボリューム) | EFS(ファイル単位) |
IPC(プロセス間通信)比較
Linux IPC: Windows IPC:
- pipe / named pipe (FIFO) - Named Pipes
- UNIXドメインソケット - Mailslots
- System V IPC - Shared Memory (Section)
(shmem, semaphore, msgqueue) - COM / DCOM
- POSIX IPC - Windows Messages
- D-Bus - RPC
- netlinkソケット - ALPC (Advanced Local
- io_uring Procedure Call)
4. Windows Subsystem for Linux(WSL)
WSLはWindowsでLinuxバイナリをネイティブに実行可能にします。
WSL 1 vs WSL 2
WSL 1:
┌──────────────────────────────────────┐
│ Linuxユーザー空間 │
│ (bash, gcc, python等) │
├──────────────────────────────────────┤
│ LxCore.sys / Lxss.sys │
│ (Linuxシステムコール → NTシステムコール変換)│
├──────────────────────────────────────┤
│ Windows NTカーネル │
└──────────────────────────────────────┘
→ システムコール変換方式(互換性の限界)
WSL 2:
┌──────────────────────────────────────┐
│ Linuxユーザー空間 │
│ (bash, gcc, python, docker等) │
├──────────────────────────────────────┤
│ 実際のLinuxカーネル(軽量VM内部) │
├──────────────────────────────────────┤
│ 軽量ユーティリティVM(Hyper-Vベース) │
├──────────────────────────────────────┤
│ Windows NTカーネル + Hyper-V │
└──────────────────────────────────────┘
→ 完全なLinuxカーネル実行(高い互換性)
| 特性 | WSL 1 | WSL 2 |
|---|---|---|
| アーキテクチャ | システムコール変換 | 軽量VM(実Linuxカーネル) |
| システムコール互換 | 部分的 | 完全 |
| ファイルシステム性能 | Windows FS高速 | Linux FS高速 |
| ネットワーク | ホストと同一 | NATベース |
| Dockerサポート | 非サポート | サポート |
| メモリ | 共有 | 別途割当(動的) |
# WSL 기본 명령어
wsl --list --online # 설치 가능한 배포판 목록
wsl --install -d Ubuntu # Ubuntu 설치
wsl -l -v # WSL 버전 확인
wsl --set-default-version 2 # 기본 WSL 2로 설정
wsl -d Ubuntu # Linux 배포판 시작
# Windows에서 Linux 파일 접근: \\wsl$\Ubuntu\home\user\
5. まとめ
Linux
- カーネル: モノリシック + 動的モジュールローディング
- プロセス: fork/execモデル、task_structベース、CFSスケジューラ
- メモリ: 仮想メモリ、ページキャッシュ、slabアロケータ
- ファイルシステム: VFSで多様なファイルシステムを統合、ext4がデフォルト
- 強み: オープンソース、サーバー/クラウド環境、カスタマイズ容易
Windows 10
- カーネル: ハイブリッド構造、Executiveサービス層
- プロセス: CreateProcessモデル、オブジェクトベース管理、優先度ブースト
- メモリ: Paged/NonPagedプール、Sectionオブジェクト、ワーキングセット管理
- ファイルシステム: NTFS(MFTベース、ACL、ADS、EFSサポート)
- 強み: デスクトップ互換性、エンタープライズ管理、WSLでLinux統合
クイズ:LinuxとWindows比較
Q1. LinuxのモノリシックカーネルとWindowsのハイブリッドカーネルの違いは?
A1. Linuxのモノリシックカーネルはプロセス管理、メモリ管理、ファイルシステム、ドライバ等すべての核心機能が1つのカーネル空間で実行され性能が良いですが、エラー時にシステム全体に影響します。Windowsのハイブリッドカーネルは核心機能はカーネルモードに置きつつ、一部サービス(環境サブシステム等)をユーザーモードに配置して安定性と性能のバランスを取ります。
Q2. Linuxのfork()とWindowsのCreateProcess()の違いは?
A2. fork()は現在のプロセスを複製して子プロセスを作ります。親と子は同じコードを実行しexec()で別のプログラムをロードします。Copy-on-Writeで効率的です。CreateProcess()は最初から新しいプロセスを作り指定された実行ファイルをすぐにロードします。fork+execの2段階を1つにまとめたものに類似しています。
Q3. WSL 1とWSL 2の核心的な違いは?
A3. WSL 1はLinuxシステムコールをNTカーネルシステムコールに変換するエミュレーション方式で、一部のシステムコールがサポートされない互換性の限界があります。WSL 2はHyper-Vベースの軽量VMで実際のLinuxカーネルを実行するため完全なシステムコール互換性を提供し、Dockerもサポートします。