定义:操作系统对程序执行过程的管理,包括进程的创建、调度、同步与销毁。进程是资源分配的基本单位,线程是 CPU 调度的基本单位。
进程状态机
PCB
调度算法
上下文切换
进程间通信
死锁
线程模型
协程
- 进程状态:新建 → 就绪 → 运行 → 阻塞 → 终止(五态模型)
- PCB 进程控制块:保存进程 ID、状态、优先级、寄存器、内存信息、打开文件表等
- 调度算法:FCFS(先来先服务)、SJF(最短作业优先)、RR(时间片轮转)、优先级调度、CFS(Linux 完全公平调度器)
- 上下文切换:保存当前进程寄存器/状态 → 恢复目标进程寄存器/状态,切换开销不可忽视
- 进程间通信 IPC:管道(pipe)、命名管道(FIFO)、消息队列、共享内存、信号量、Socket
- 死锁:四个必要条件——互斥、占有并等待、不可抢占、循环等待;处理策略:预防、避免(银行家算法)、检测与恢复
- 线程模型:内核线程(1:1)、用户线程(N:1)、混合线程(M:N),Linux 用 clone() 实现
定义:对计算机主存(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
- 缺页中断:访问的页不在物理内存时触发,由内核从磁盘加载对应页到内存
定义:每个进程看到的独立虚拟内存布局,从低地址到高地址依次排列不同段。核心意义:进程之间内存隔离,一个进程无法直接访问另一个进程的内存。
代码段
数据段
堆
栈
内存映射区
内核空间
- 代码段(Text):存储编译后的机器指令,只读,可被多进程共享(如共享库)
- 数据段(Data/BSS):已初始化的全局/静态变量(Data)+ 未初始化的全局/静态变量(BSS)
- 堆(Heap):从低地址向高地址增长,由程序员通过 malloc/new 申请,free/delete 释放
- 内存映射区(mmap):用于共享库(.so/.dll)、文件映射、匿名映射等
- 栈(Stack):从高地址向低地址增长,存储局部变量、函数参数、返回地址,由编译器自动管理
- 内核空间:用户进程不可直接访问,通过系统调用进入,存放内核代码和数据
- 内存布局(Linux x86_64):0x0000 起代码段 → 堆 → mmap → 栈 → 内核空间(高地址)
定义:操作系统对持久化数据的组织和管理方式,提供统一的文件操作接口。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 的多个目录项
定义:用户程序请求操作系统内核服务的接口,是用户态进入内核态的唯一合法途径。本质:软中断(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 系统调用;库函数在用户态执行,系统调用进入内核态
定义:CPU 在执行程序过程中,遇到某些事件需要暂停当前执行流,转去处理该事件,处理完毕后再返回。核心作用:实现 CPU 与外部设备的异步交互、错误处理和系统调度。
硬件中断
软件中断
异常/陷阱
中断向量表
中断控制器
上半部/下半部
- 硬件中断(外中断):由外部设备发起——键盘、网卡、磁盘、时钟中断等,异步发生
- 软件中断(内中断):由 CPU 执行指令产生——除零错误、缺页、非法指令、系统调用(int 0x80)
- 异常分类:Fault(可恢复故障,如缺页中断 → 重新执行指令)、Trap(陷阱,如系统调用 → 继续执行下条)、Abort(不可恢复,如硬件故障)
- 中断处理流程:设备发信号 → 中断控制器(8259A/APIC) → CPU 响应 → 保存上下文 → 查中断向量表(IDT) → 执行 ISR → 恢复上下文
- 中断上半部/下半部:上半部(硬中断)关中断快速执行关键操作,下半部(软中断/tasklet/工作队列)开中断延迟处理耗时工作
- 时钟中断:操作系统调度的"心跳",定期触发以进行进程时间片计数、定时器更新、调度决策
定义:对系统中所有 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,减少数据在内核空间与用户空间之间的拷贝次数
定义:协调多个执行单元(进程/线程)之间的执行顺序和数据交换。同步保证正确性(避免竞态条件),通信实现数据传递。
互斥锁
信号量
条件变量
读写锁
自旋锁
RCU
管道
共享内存
- 互斥锁 Mutex:同一时刻只允许一个线程访问共享资源,加锁/解锁必须配对,防止死锁
- 信号量 Semaphore:控制同时访问资源的线程数,计数信号量(>1)和二值信号量(0/1,类似互斥锁)
- 条件变量 Condition Variable:线程等待某个条件成立时挂起,由其他线程通知唤醒,必须配合互斥锁使用
- 自旋锁 Spinlock:忙等待(不释放 CPU),适用于锁持有时间极短的场景,多用于内核态
- 读写锁 RWLock:读共享、写互斥,适合读多写少的场景
- RCU(Read-Copy-Update):Linux 内核核心同步机制,读者无锁、写者复制修改后替换,极致的读性能
- 共享内存:最快的 IPC 方式,多个进程映射同一块物理内存,需要信号量同步访问
定义:在物理硬件之上抽象出多个虚拟的执行环境。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 有独立内核(重、安全、启动慢),容器共享内核(轻量、启动快、但隔离性弱)
定义:操作系统保护自身和用户数据不受未授权访问或破坏的机制。核心模型:通过权限检查、访问控制策略和安全机制来保护系统。
用户/组
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 浏览器用沙箱隔离渲染进程