Skip to content
Published on

[オペレーティングシステム] 20. LinuxとWindows 10オペレーティングシステム比較

Authors

LinuxとWindows 10オペレーティングシステム比較

LinuxとWindowsは異なる設計哲学を持つオペレーティングシステムです。この記事では、両方のOSのカーネルアーキテクチャ、プロセス管理、メモリ管理、ファイルシステム等を比較し、Windows Subsystem for Linux(WSL)も解説します。


1. Linuxシステム概要

Linuxカーネルアーキテクチャ

Linuxはモノリシック(monolithic)カーネルを基盤としつつ、モジュール(module)システムで柔軟性を確保しています。

┌───────────────────────────────────────────────┐
│                ユーザー空間                     │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐         │
│  │ bash │ │ nginx│ │ gcc  │ │ java │         │
│  └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘         │
│     └────────┴────────┴────────┘              │
│              │ システムコールインターフェース   │
├──────────────┴────────────────────────────────┤
│                カーネル空間                     │
│  ┌─────────────────────────────────────────┐  │
│  │          プロセス管理                    │  │
│  │  スケジューラ │ プロセス生成 │ シグナル  │  │
│  ├─────────────────────────────────────────┤  │
│  │          メモリ管理                      │  │
│  │  仮想メモリ │ ページキャッシュ │ slab   │  │
│  ├─────────────────────────────────────────┤  │
│  │          VFS(仮想ファイルシステム)      │  │
│  │  ext4 │ XFSBtrfsNFS │ 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)POSIXWSL        │   │
│  └────────────────────────────────────────┘   │
│  ┌────────────────────────────────────────┐   │
│  │       環境サブシステムDLL              │   │
│  │  ntdll.dll │ kernel32.dll │ user32.dll││  └────────────────────────────────────────┘   │
├───────────────────────────────────────────────┤
│              カーネルモード                     │
│  ┌────────────────────────────────────────┐   │
│  │        エグゼクティブ(Executive)      │   │
│  │  Object MgrProcess MgrMemory Mgr││  │  I/O MgrCache MgrSecurity  │   │
│  │  Config MgrPnP MgrPower 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 ├──────────────────┤
 0Idle0: システムアイドルスレッド
   └──────────────────┘

優先度ブースト:
- 対話型プロセス: フォアグラウンドブースト
- I/O完了: 一時的優先度上昇
- 飢餓防止: 長期待ちスレッドブースト

NTFS(NT File System)

NTFSの主要特徴:
┌──────────────────────────────────────────┐
MFT (Master File Table):- すべてのファイル/ディレクトリの       │
│    メタデータを保存                      │
- 各エントリ約1KB                       │
- 小さいファイルはMFTレコードに直接保存 │
│                                          │
│  追加特徴:- ジャーナリング(トランザクションログ)│
- ファイルレベル圧縮                    │
- ファイルレベル暗号化(EFS)           │
- 代替データストリーム(ADS)           │
- ACLベースの細かなアクセス制御         │
- ディスククォータ                      │
- シンボリックリンク、ジャンクション    │
└──────────────────────────────────────────┘

3. Linux vs Windows 比較

カーネルアーキテクチャ比較

特性LinuxWindows
カーネル種類モノリシック(+モジュール)ハイブリッド
ソースコードオープンソース(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)
メタデータinodeMFTレコード
最大ファイルサイズ16 TiB256 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 1WSL 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もサポートします。