Skip to content
Published on

[操作系统] 20. Linux 与 Windows 10 操作系统对比

分享
Authors

Linux 与 Windows 10 操作系统对比

Linux 与 Windows 是设计哲学截然不同的两套操作系统。 本文对比这两套操作系统的内核架构、进程管理、内存管理、 文件系统等方面,并介绍 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 采用混合内核结构。

┌───────────────────────────────────────────────┐
│                  用户模式                      │
│                                               │
│  ┌────────────────────────────────────────┐   │
│  │              系统进程                  │   │
│  │  服务管理器    │ LSASession Manager │   │
│  └────────────────────────────────────────┘   │
│                                               │
│  ┌────────────────────────────────────────┐   │
│  │               子系统                   │   │
│  │  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
│           └── MyMutex
└── GLOBAL??
    ├── C:Device\HarddiskVolume1
    └── D:Device\CdRom0
Windows 对象结构:
┌─────────────────────────────────┐
│ 对象头                          │
- 名称                          │
- 目录                          │
- 安全描述符                    │
- 引用计数                      │
- 句柄计数                      │
- 对象类型指针                  │
├─────────────────────────────────┤
│ 对象体                          │
- 按类型划分的数据              │
│   (进程、线程、文件等)        │
└─────────────────────────────────┘

Windows 进程与线程管理

Windows 进程结构:
┌─────────────────────────────────────┐
进程 (EPROCESS)- 虚拟地址空间                      │
- 句柄表(已打开对象)              │
- 访问令牌(安全上下文)            │
- PID│                                     │
│ ┌─────────┐ ┌─────────┐ ┌────────┐ │
│ │Thread 1 │ │Thread 2 │ │Thread 3│ │
(ETHREAD)(ETHREAD)(ETHREAD│ │
│ │- TEB    │ │- TEB    │ │- TEB   │ │
│ │- 栈     │ │- 栈     │ │- 栈    │ │
│ │- 优先级 │ │- 优先级 │ │- 优先级│ │
│ └─────────┘ └─────────┘ └────────┘ │
└─────────────────────────────────────┘

Windows 调度

Windows 优先级层次:

31 ┌──────────────────┐
Real-time 类     │  16-31:实时优先级
16 ├──────────────────┤
15Variable 类      │  1-15:动态优先级
   │                  │  (I/O 完成时临时提升)
 1 ├──────────────────┤
 0Idle0:系统空闲线程
   └──────────────────┘

优先级提升:
- 交互式进程:前台提升
- I/O 完成:临时提高优先级
- 防止饥饿:长期等待的线程获得提升

Windows 内存管理器

Windows 虚拟内存结构(64 位):

高地址
┌──────────────────────┐
│      内核空间        │  (高半部)
- 内核代码/数据     │
- 分页/非分页       │
│    内存池            │
├──────────────────────┤  0x7FFF...
│      用户空间        │  (低半部,128TB)
- DLL- 堆                │
- 栈                │
- 可执行文件映像    │
└──────────────────────┘  0x0000...

特殊内存:
- Paged Pool: 可被换出的内核内存
- NonPaged Pool: 始终驻留在物理内存中
- Section Object: 内存映射文件

NTFS (NT File System)

NTFS 主要特性:
┌──────────────────────────────────────────┐
MFT (Master File Table):- 保存所有文件/目录的元数据             │
- 每个条目约 1KB                        │
- 小文件直接存放在 MFT 记录中           │
│                                          │
MFT 记录结构:                          │
│  ┌───────────────────────────────────┐   │
│  │ 头部                              │   │
│  ├───────────────────────────────────┤   │
│  │ Standard Information 属性         │   │
│  │ (时间戳、标志等)                │   │
│  ├───────────────────────────────────┤   │
│  │ File Name 属性                    │   │
│  ├───────────────────────────────────┤   │
│  │ Data 属性                         │   │
│  │ (小文件:直接存放数据)          │   │
│  │ (大文件:运行(run)列表)         │   │
│  ├───────────────────────────────────┤   │
│  │ Security Descriptor 属性          │   │
│  └───────────────────────────────────┘   │
│                                          │
│  附加特性:                              │
- 日志(事务日志)                      │
- 文件级压缩                            │
- 文件级加密(EFS)                     │
- 备用数据流(ADS)                     │
- 基于 ACL 的细粒度访问控制             │
- 磁盘配额                              │
- 符号链接、联接点(junction)└──────────────────────────────────────────┘

3. Linux vs Windows 对比

内核架构对比

特性LinuxWindows
内核类型单体(+ 模块)混合
源代码开源(GPL)闭源(部分公开)
设备驱动内核内/模块内核/用户模式驱动
文件系统VFS 抽象I/O 管理器 + 过滤驱动
安全模型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

# 安装 Ubuntu
wsl --install -d Ubuntu

# 查看 WSL 版本
wsl -l -v

# 将默认发行版设为 WSL 2
wsl --set-default-version 2

# 启动 Linux 发行版
wsl -d Ubuntu

# 在 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 的单体内核把进程管理、内存管理、文件系统、驱动等 所有核心功能都放在同一个内核空间中执行,性能好,但出错时会影响整个系统。 Windows 的混合内核把核心功能保留在内核模式, 同时把一部分服务(如环境子系统)放到用户模式, 从而在稳定性与性能之间取得平衡。

Q2. Linux 的 fork() 与 Windows 的 CreateProcess() 有什么区别?

A2. fork() 复制当前进程来创建子进程。 父进程与子进程先执行相同的代码,然后通过 exec() 载入另一个程序。 借助 Copy-on-Write 十分高效。 CreateProcess() 则从头创建一个新进程,并直接载入指定的可执行文件, 类似于把 fork+exec 两个步骤合并为一个。

Q3. WSL 1 与 WSL 2 的核心区别是什么?

A3. WSL 1 采用把 Linux 系统调用翻译为 NT 内核系统调用的模拟方式, 存在部分系统调用不受支持的兼容性局限。 WSL 2 在基于 Hyper-V 的轻量 VM 中运行真正的 Linux 内核, 因此提供完整的系统调用兼容性,并且支持 Docker。