🖥️ 操作系统核心概念

操作系统是管理计算机硬件与软件资源的系统软件,是用户与硬件之间的桥梁。以下是其最核心的组成部分。

用户应用程序
浏览器、编辑器、数据库、Shell…
▼ ▼ ▼
系统库 / 运行时
glibc、POSIX API、运行时环境
▼ ▼ ▼
系统调用接口(System Call)
用户态 ⟷ 内核态的桥梁 · int 0x80 / syscall 指令
▼ ▼ ▼
⚙️ 操作系统内核(Kernel)
进程管理 · 内存管理 · 文件系统 · 设备管理 · 中断管理 · 虚拟化 · 网络 · 同步与通信 · 安全
▼ ▼ ▼
硬件层
CPU · 内存 · 磁盘 · 网卡 · GPU · 外设…
核心模块详解
点击任意卡片展开详细知识点
🔄
进程与线程管理
Process & Thread Management
定义:操作系统对程序执行过程的管理,包括进程的创建、调度、同步与销毁。进程是资源分配的基本单位,线程是 CPU 调度的基本单位。
进程状态机 PCB 调度算法 上下文切换 进程间通信 死锁 线程模型 协程
  • 进程状态:新建 → 就绪 → 运行 → 阻塞 → 终止(五态模型)
  • PCB 进程控制块:保存进程 ID、状态、优先级、寄存器、内存信息、打开文件表等
  • 调度算法:FCFS(先来先服务)、SJF(最短作业优先)、RR(时间片轮转)、优先级调度、CFS(Linux 完全公平调度器)
  • 上下文切换:保存当前进程寄存器/状态 → 恢复目标进程寄存器/状态,切换开销不可忽视
  • 进程间通信 IPC:管道(pipe)、命名管道(FIFO)、消息队列、共享内存、信号量、Socket
  • 死锁:四个必要条件——互斥、占有并等待、不可抢占、循环等待;处理策略:预防、避免(银行家算法)、检测与恢复
  • 线程模型:内核线程(1:1)、用户线程(N:1)、混合线程(M:N),Linux 用 clone() 实现
🧠
内存管理
Memory Management
定义:对计算机主存(RAM)的分配、回收、保护与扩充进行管理,使每个进程拥有独立的地址空间。核心思想:虚拟内存让每个进程以为自己独占整个内存。
虚拟内存 分页 分段 TLB 页面置换 地址空间 COW
  • 虚拟内存:通过 MMU 将虚拟地址映射到物理地址,每个进程拥有独立的 4GB(32位)或 128TB(64位)虚拟地址空间
  • 分页(Paging):将虚拟地址空间划分为固定大小的页(通常 4KB),页表记录页到物理帧的映射,多级页表节省内存
  • TLB 快表:页表的高速缓存,缓存最近使用的虚拟→物理映射,TLB 命中时无需查页表
  • 段页式:分段(逻辑单元)+ 分页(固定大小)的组合,兼顾逻辑性和灵活性
  • 页面置换算法:OPT(最优)、LRU(最近最少使用)、Clock(时钟算法)、LFU、LFU
  • 写时复制 COW:fork() 时父子进程共享物理页,仅在其中一方写入时才复制,极大提高 fork 效率
  • 内存分配:伙伴系统(Buddy System)、Slab 分配器(Linux 内核对象)、kmalloc/vmalloc
  • 缺页中断:访问的页不在物理内存时触发,由内核从磁盘加载对应页到内存
📍
进程地址空间
Process Address Space
定义:每个进程看到的独立虚拟内存布局,从低地址到高地址依次排列不同段。核心意义:进程之间内存隔离,一个进程无法直接访问另一个进程的内存。
代码段 数据段 内存映射区 内核空间
  • 代码段(Text):存储编译后的机器指令,只读,可被多进程共享(如共享库)
  • 数据段(Data/BSS):已初始化的全局/静态变量(Data)+ 未初始化的全局/静态变量(BSS)
  • 堆(Heap):从低地址向高地址增长,由程序员通过 malloc/new 申请,free/delete 释放
  • 内存映射区(mmap):用于共享库(.so/.dll)、文件映射、匿名映射等
  • 栈(Stack):从高地址向低地址增长,存储局部变量、函数参数、返回地址,由编译器自动管理
  • 内核空间:用户进程不可直接访问,通过系统调用进入,存放内核代码和数据
  • 内存布局(Linux x86_64):0x0000 起代码段 → 堆 → mmap → 栈 → 内核空间(高地址)
📁
文件系统
File System / VFS
定义:操作系统对持久化数据的组织和管理方式,提供统一的文件操作接口。VFS(虚拟文件系统)是内核中的抽象层,屏蔽了底层不同文件系统的差异。
VFS Inode 超级块 ext4 日志 软硬链接 Buffer Cache
  • VFS 虚拟文件系统:定义统一的文件操作接口(open/read/write/close),上层应用无需关心底层是 ext4 还是 XFS
  • Inode(索引节点):存储文件的元数据(权限、大小、时间戳、数据块指针),文件名与 Inode 分离
  • 超级块:记录整个文件系统的元信息——块大小、总块数、空闲块数、Inode 数量等
  • 目录项缓存 dentry:加速路径名解析,将路径分量映射到对应的 Inode
  • 页面缓存 Page Cache:文件数据先缓存到内存页,读写操作直接命中缓存则无需访问磁盘
  • 常见文件系统:ext4(Linux)、NTFS(Windows)、APFS(macOS)、ZFS、Btrfs、FAT32
  • 软链接 vs 硬链接:软链接是指向文件名的指针(类似快捷方式),硬链接是指向同一个 Inode 的多个目录项
🚪
系统调用
System Call (syscall)
定义:用户程序请求操作系统内核服务的接口,是用户态进入内核态的唯一合法途径。本质:软中断(trap),通过特殊指令触发 CPU 从用户态切换到内核态执行。
用户态/内核态 trap POSIX glibc 封装 系统调用号 strace
  • 用户态 ⟷ 内核态:CPU 特权级切换,x86 下 Ring 3(用户)↔ Ring 0(内核),ARM 下 EL0 ↔ EL1
  • 触发方式:int 0x80(传统)、sysenter/sysexit(快速)、syscall/sysret(现代 64 位),通过系统调用号选择具体服务
  • 调用过程:应用 → glibc 封装函数 → 设置系统调用号到寄存器 → syscall 指令 → 内核入口 → 查系统调用表 → 执行 → 返回
  • 常见分类:进程控制(fork/exec/wait)、文件操作(open/read/write)、设备操作(ioctl)、IPC(pipe/shmget)、网络(socket)、信息(getpid/stat)
  • strace 工具:跟踪进程的所有系统调用,是调试和性能分析的利器
  • 系统调用 vs 函数库调用:printf 是库函数(glibc),最终内部调用 write 系统调用;库函数在用户态执行,系统调用进入内核态
中断与异常管理
Interrupt & Exception
定义:CPU 在执行程序过程中,遇到某些事件需要暂停当前执行流,转去处理该事件,处理完毕后再返回。核心作用:实现 CPU 与外部设备的异步交互、错误处理和系统调度。
硬件中断 软件中断 异常/陷阱 中断向量表 中断控制器 上半部/下半部
  • 硬件中断(外中断):由外部设备发起——键盘、网卡、磁盘、时钟中断等,异步发生
  • 软件中断(内中断):由 CPU 执行指令产生——除零错误、缺页、非法指令、系统调用(int 0x80)
  • 异常分类:Fault(可恢复故障,如缺页中断 → 重新执行指令)、Trap(陷阱,如系统调用 → 继续执行下条)、Abort(不可恢复,如硬件故障)
  • 中断处理流程:设备发信号 → 中断控制器(8259A/APIC) → CPU 响应 → 保存上下文 → 查中断向量表(IDT) → 执行 ISR → 恢复上下文
  • 中断上半部/下半部:上半部(硬中断)关中断快速执行关键操作,下半部(软中断/tasklet/工作队列)开中断延迟处理耗时工作
  • 时钟中断:操作系统调度的"心跳",定期触发以进行进程时间片计数、定时器更新、调度决策
🔌
设备管理(I/O 管理)
Device / I/O Management
定义:对系统中所有 I/O 设备的管理与协调,提供统一的设备访问接口。核心思想:通过驱动程序和设备文件抽象,让所有设备看起来像文件一样操作。
设备驱动 块设备/字符设备 DMA I/O 模型 Buffer/Cache /dev
  • 设备分类:块设备(按块读写,如磁盘、SSD)和字符设备(按字符读写,如键盘、串口),Linux 下还有网络设备
  • 设备驱动:内核与硬件之间的"翻译层",每个设备类型需要对应驱动,屏蔽硬件差异
  • 设备文件:Linux 一切皆文件,/dev/sda(块设备)、/dev/tty(字符设备),通过文件接口操作设备
  • I/O 控制方式:程序直接控制(轮询)→ 中断驱动 → DMA(直接内存访问,设备直接读写内存,不经过 CPU)
  • I/O 模型(网络编程):阻塞 I/O、非阻塞 I/O、I/O 多路复用(select/poll/epoll)、信号驱动 I/O、异步 I/O(AIO/io_uring)
  • 零拷贝技术:sendfile、mmap+write、splice,减少数据在内核空间与用户空间之间的拷贝次数
🤝
同步与进程间通信
Synchronization & IPC
定义:协调多个执行单元(进程/线程)之间的执行顺序和数据交换。同步保证正确性(避免竞态条件),通信实现数据传递。
互斥锁 信号量 条件变量 读写锁 自旋锁 RCU 管道 共享内存
  • 互斥锁 Mutex:同一时刻只允许一个线程访问共享资源,加锁/解锁必须配对,防止死锁
  • 信号量 Semaphore:控制同时访问资源的线程数,计数信号量(>1)和二值信号量(0/1,类似互斥锁)
  • 条件变量 Condition Variable:线程等待某个条件成立时挂起,由其他线程通知唤醒,必须配合互斥锁使用
  • 自旋锁 Spinlock:忙等待(不释放 CPU),适用于锁持有时间极短的场景,多用于内核态
  • 读写锁 RWLock:读共享、写互斥,适合读多写少的场景
  • RCU(Read-Copy-Update):Linux 内核核心同步机制,读者无锁、写者复制修改后替换,极致的读性能
  • 共享内存:最快的 IPC 方式,多个进程映射同一块物理内存,需要信号量同步访问
☁️
虚拟化与容器
Virtualization & Containers
定义:在物理硬件之上抽象出多个虚拟的执行环境。Type-1 虚拟机直接运行在裸机上,容器共享宿主内核但隔离进程视图,虚拟机模拟完整硬件环境。
VM 容器/Docker Namespaces Cgroups KVM Hypervisor
  • Hypervisor:管理虚拟机的软件层,Type-1(VMware ESXi、Xen)直接运行在硬件上,Type-2(VirtualBox)运行在宿主 OS 上
  • KVM:基于硬件虚拟化(Intel VT-x / AMD-V)的 Linux 内核模块,将 Linux 变成 Hypervisor
  • Namespaces(命名空间):Linux 容器的隔离基础——PID(进程隔离)、NET(网络隔离)、MNT(文件系统隔离)、UTS(主机名隔离)、IPC、USER(用户隔离)
  • Cgroups(控制组):限制容器可使用的资源——CPU 配额、内存上限、磁盘 I/O 速率、网络带宽
  • Docker 本质:Namespaces 做隔离 + Cgroups 做限制 + UnionFS(OverlayFS)做分层文件系统
  • VM vs 容器:VM 有独立内核(重、安全、启动慢),容器共享内核(轻量、启动快、但隔离性弱)
🛡️
安全与权限管理
Security & Access Control
定义:操作系统保护自身和用户数据不受未授权访问或破坏的机制。核心模型:通过权限检查、访问控制策略和安全机制来保护系统。
用户/组 rwx 权限 SUID/SGID SELinux Capabilities Sandbox
  • 用户与组:UID(root=0)标识用户,GID 标识组,每个进程以某个用户身份运行
  • rwx 权限模型:文件所有者(u)、所属组(g)、其他人(o) 各有读(r=4)、写(w=2)、执行(x=1)权限,如 chmod 755
  • SUID/SGID/Sticky:SUID 以文件所有者身份执行(如 passwd),SGID 以文件所属组身份执行,Sticky 位防止他人删除自己的文件(/tmp)
  • SELinux/AppArmor:MAC(强制访问控制),基于策略的细粒度权限控制,比传统 DAC 更安全
  • Capabilities:将 root 权限拆分为细粒度能力(如 CAP_NET_BIND_SERVICE),进程只需获得必要能力而非完整 root
  • Sandbox 沙箱:限制进程可访问的资源范围,Chrome 浏览器用沙箱隔离渲染进程
🔗 核心概念之间的协作关系
用户程序发起 read() 调用应用程序 → glibc
系统调用 sys_read
系统调用层(syscall)用户态 → 内核态切换
VFS 层查找 inode
虚拟文件系统(VFS)统一文件操作接口
查询 Page Cache
页面缓存 / 内存管理命中缓存直接返回
缓存未命中 → 调度 I/O
设备驱动 / I/O 调度DMA 传输 + 中断通知
中断唤醒等待进程
进程调度器唤醒阻塞进程 → 就绪 → 运行
返回用户态
用户程序获得数据read() 返回

📊 一句话总结每个模块

进程管理
决定"谁在运行"
内存管理
决定"数据放哪"
地址空间
每个进程的"私有视图"
文件系统
决定"数据怎么存"
系统调用
用户→内核的唯一通道
中断管理
CPU 响应外部事件的机制
设备管理
屏蔽硬件差异的抽象层
同步与通信
多执行单元的协调机制
虚拟化
一份硬件,多个世界
安全与权限
保护系统和数据不受侵害