第11讲 调度 I:从 CPU 排队到实时约束的调度策略本文根据《第11讲 调度I.md》的对话转录整理而成,核心目标不是罗列算法名称,而是建立一条主线:调度本质上是在有限 CPU 资源上,对不同任务的时间需求、响应需求、公平需求和截止时间需求进行权衡。
1. 调度的基本问题:谁运行、在哪运行、运行多久在现代操作系统中,任务数量通常远大于 CPU 核心数量。即使是普通桌面系统,也可能同时存在上百个进程或线程,而真正能在某一时刻运行的任务数量受限于处理器核心数。
因此,调度器至少要回答三个问题:
下一个执行的任务是谁
该任务在哪个 CPU 上执行
该任务执行多长时间
在单核调度中,重点主要是第一个和第三个问题:同一个 CPU 上,多个就绪任务如何排队、如何切换、每个任务运行多久。
flowchart TD
A[多个任务进入系统] --> B[就绪队列 Ready Queue]
B --> C{调度器决策}
C --> D[选择下一个任务]
C --> E[决定运行时长]
D --> F[任务运行 Runni ...
进程与线程 II:线程模型、TCB/TLS 与纤程协程的完整理解本文根据《第10讲 进程与线程II.md》的对话内容整理而成,目标是把原始问答重构为一篇可独立阅读、可复习、可维护的正式学习文档。
引言:本讲的核心问题“进程与线程 I”主要解释进程:程序如何变成进程,操作系统如何用 PCB 管理进程,以及 fork、exec、wait、exit 如何构成进程生命周期。
“进程与线程 II”的主线则进一步推进:
进程太重,所以引入线程;内核线程仍然有开销,所以进一步引入用户态线程、纤程和协程。
本讲要解决的核心问题不是“线程是什么”这一句定义,而是以下几个问题:
为什么进程内部还需要线程?
线程和进程到底共享什么、独占什么?
用户态线程和内核态线程如何区分?
多对一、一对一、多对多模型中的“对”到底是什么意思?
TCB 和 TLS 分别解决什么问题?
pthread 的创建、等待、退出和让出 CPU 如何理解?
线程上下文切换到底发生了什么?
纤程和协程为什么比线程更轻量?
整节课的逻辑可以概括为:
1234567进程太重 ↓线程:进程内更轻量的执行流 ↓内核线程仍 ...
进程与线程 I:从进程抽象到 fork / exec 的完整理解本文根据上传的《第9讲 进程与线程I.md》整理而成,目标是把原始对话中的讲解、追问和修正重构为一篇可独立复习的学习文档。 输出方式遵循对话转正式文章的规则要求。
引言:本讲真正要解决的问题“进程与线程 I”这一讲虽然标题同时包含进程和线程,但核心内容首先是进程。进程是操作系统管理程序运行的基本抽象。理解进程之后,才能继续理解线程、调度、同步、上下文切换等后续内容。
本讲的主线可以概括为:
操作系统把“正在运行的程序”抽象成进程,再通过 PCB 记录它,通过状态机管理它,通过上下文切换暂停和恢复它,并通过 fork、exec、wait、exit 等系统调用完成进程的创建、替换、等待和退出。
换言之,本讲不是单纯记几个概念,而是要理解操作系统如何把一个静态程序变成一个可管理、可调度、可暂停、可恢复、可终止的运行实体。
1. 为什么需要进程早期计算机一次只运行一个任务。如果程序需要等待键盘输入、磁盘读取或网络响应,CPU 就可能空闲。为了提高 CPU 利用率,操作系统引入了多道程序和分时机制。
一个任务等待 ...
物理内存管理 II:换页、页替换策略与工作集模型《物理内存管理 I》讨论的是:当系统还有可用物理内存时,操作系统如何记录空闲页、分配连续页,并通过伙伴系统与 SLAB/SLUB 提高分配效率。
《物理内存管理 II》进一步讨论的是另一个问题:当物理内存不够用时,操作系统怎么办。
这一讲的核心不是“如何从空闲页中分配一个物理页”,而是:
物理内存不足时,如何继续支撑程序运行;
页不在物理内存中时,如何通过缺页异常恢复;
内存满了时,应该换出哪个页;
如何避免系统陷入频繁换页的颠簸状态;
工作集模型如何帮助系统判断进程当前真正需要哪些页。
本讲主线可以概括为:
1234567891011121314151617程序拥有虚拟地址空间↓真实物理内存有限↓OS 不一定让所有虚拟页同时驻留在物理内存↓暂时不用的页可以换出到磁盘 Swap↓再次访问时触发缺页异常↓OS 将页换入物理内存并更新页表↓内存满时需要页替换策略↓策略不好或内存压力过大,会导致颠簸↓工作集模型用于分析进程当前真正需要的页集合
❗ 核心结论: 物理内存管理 II 的核心是“物理内存不够时如何继续运行”:通过换页 ...
物理内存管理 I:从空闲页记录到伙伴系统与 SLAB虚拟内存管理回答的是“程序看到的虚拟地址如何映射到物理地址”。物理内存管理进一步回答的是:真实的物理内存页由谁管理、如何记录空闲状态、如何分配连续物理页、如何快速分配内核小对象。
《物理内存管理 I》的重点不是换页、页替换或工作集模型,而是物理内存分配器本身。它讨论的是操作系统拿到一大片真实物理内存后,如何把它组织成可分配、可回收、可合并、可复用的资源。
本讲可以用一条主线概括:
123456789物理内存↓位图分配器:用 bit 记录每个物理页是否空闲↓伙伴系统:高效分配 2^n 个连续物理页↓SLAB / SLUB:把页级大块切成小对象↓Linux 内核和用户态分配器共同使用
❗ 核心结论: 物理内存管理 I 的核心是“如何分配物理页”。位图、伙伴系统和 SLAB/SLUB 分别解决空闲页记录、连续页分配和小对象分配问题。1. 物理内存管理 I 解决什么问题物理内存可以粗略看成一组连续编号的物理页。假设页大小为 4KB,那么系统可以把物理内存划分为:
12345物理页 0物理页 1物理页 2物理页 3...
操作系 ...
虚拟内存管理 II:从页表维护到缺页异常《虚拟内存管理 I》解释了虚拟地址如何通过页表和 MMU 翻译成物理地址。《虚拟内存管理 II》进一步讨论的是:这些页表由谁创建、谁维护,操作系统如何利用页表、虚拟内存区域和缺页异常来构造进程的地址空间。
这一讲的主线可以概括为:
12345678910111213141516171819CPU 使用虚拟地址↓MMU 根据页表翻译↓页表由操作系统维护↓操作系统自己也运行在虚拟地址中↓因此需要直接映射来访问物理内存和页表页↓进程地址空间由多个虚拟内存区域组成↓mmap 可以新增虚拟内存区域↓立即映射会马上分配物理页↓延迟映射会等第一次访问时通过缺页异常再分配↓写时拷贝、内存去重、内存压缩、大页都建立在这套机制之上
❗ 核心结论: 虚拟内存不是一张静态的地址翻译表,而是操作系统通过页表、虚拟内存区域、缺页异常和一系列优化机制共同维护出来的地址空间抽象。1. 操作系统自己也使用虚拟地址一个容易被忽略的问题是:既然普通程序使用虚拟地址,那么操作系统自己访问内存时,使用的是虚拟地址还是物理地址?
答案是:操作系统代码运行时同样使用虚拟地址。
CPU 执 ...
虚拟内存管理 I:从地址隔离到页表翻译虚拟内存管理的第一层问题,并不是“物理内存不够时怎么办”,而是“程序为什么不能直接使用物理地址”。现代操作系统让每个进程运行在自己的虚拟地址空间中,程序看到的是虚拟地址,真正访问内存时再由硬件和操作系统配合,把虚拟地址翻译成物理地址。
这套机制的核心由四个部分组成:
操作系统:建立和维护地址翻译规则。
页表或段表:保存虚拟地址空间到物理内存的映射关系。
MMU:在 CPU 访存时执行地址翻译。
TLB:缓存近期翻译结果,降低查页表的成本。
❗ 核心结论: 虚拟内存不是单纯为了“扩大内存”,而是为了给每个进程提供独立、受保护、可管理的地址空间。1. 为什么不能直接使用物理地址物理内存就是机器上真实存在的内存条。程序代码、程序数据、操作系统代码和操作系统数据,最终都必须位于物理内存中,CPU 才能访问。
在早期单程序环境中,物理内存可以简单划分为:
123物理内存├── 操作系统└── 一个应用程序
但在多程序系统中,多个应用会同时驻留在内存中:
12345物理内存├── 操作系统├── 应用 A├── 应用 B└── 应用 C
如果应用程序 ...
第2讲:操作系统结构学习指南0. 本讲主线操作系统很复杂,它要管理:
CPU
内存
文件系统
设备驱动
网络
进程与线程
安全隔离
所以问题不是“OS 有哪些功能”,而是:
这些功能应该如何组织,才能既高效、又可靠、又方便扩展?
❗ 本讲核心结论:操作系统结构的本质,是为了控制复杂性。不同结构的区别,主要体现在“哪些功能放在内核态,哪些功能放在用户态,以及模块之间如何通信”。1. 为什么操作系统需要结构?复杂系统如果只堆功能,很容易失控。
课件用瓦萨沉船、N1 火箭之类的例子说明:功能越多不等于系统越强,结构不合理时,功能越多反而越危险。
操作系统也是一样。
如果一个 OS 把所有功能随便堆在一起,就会出现:
一个模块出错,可能拖垮整个系统;
模块之间耦合严重,难以修改;
新硬件、新需求出现时,扩展困难;
安全边界模糊,应用可能互相干扰。
所以,OS 结构设计的目标是:
让复杂功能可以被管理、维护、隔离和扩展。
❗ 本节核心结论:OS 结构不是为了“看起来高级”,而是为了让庞大的系统保持可控。2. 操作系统设计中的目标冲突OS 同时面对两类目标。
目标类型
关 ...
Chapter 2.3:P2P、视频流、DASH 与 CDN 的可扩展性Chapter 2.3 的主线是应用层系统的可扩展性。当很多用户同时下载文件或观看视频时,中心服务器很容易成为瓶颈。P2P、DASH 和 CDN 分别从上传能力、码率选择和内容位置三个角度解决规模问题。
本节核心结论: 大规模应用不能只依赖中心服务器;P2P 分散上传能力,DASH 让客户端适应网络变化,CDN 把内容副本放到更靠近用户的位置。1. P2P 的基本思想P2P 的基本单位是 peer。在纯 P2P 架构中,几乎没有一直运行的中心服务器,任意端系统之间可以直接通信。每个节点既可以请求服务,也可以提供服务。
P2P 的自扩展性来自一个关键事实:新节点加入时,一方面增加下载需求,另一方面也带来上传能力。当节点越多时,系统负担增加,但可用服务能力也可能同步增加。
flowchart LR
Seed[初始源节点] --> P1[Peer1]
Seed --> P2[Peer2]
P1 <--> P2
P2 <--> P3[Peer3]
...
Chapter 2.2:电子邮件、SMTP、邮件访问协议与 DNSChapter 2.2 讲两个典型应用层系统:电子邮件和 DNS。它们分别回答两个问题:一封邮件如何从 Alice 到达 Bob;用户输入域名后,主机如何获得目标服务器的 IP 地址。
本节核心结论: 邮件系统依靠用户代理、邮件服务器、SMTP 和访问协议协作;DNS 依靠分层命名和分布式数据库完成域名到 IP 地址的映射。1. 电子邮件系统不等于 SMTP电子邮件系统由三个主要部分组成:
组成
作用
User Agent
撰写、编辑、阅读邮件,如 Outlook、Apple Mail、网页邮箱
Mail Server
保存用户 mailbox,维护待发送邮件队列
SMTP
在邮件服务器之间发送和转发邮件
SMTP 不是整个邮件系统,而是邮件发送和服务器间转发协议。用户写邮件、读邮件、管理文件夹,都还需要用户代理和邮件访问协议参与。
2. Alice 给 Bob 发邮件的完整流程Bob 不在线也能收到邮件,因为邮件不是直接送到 Bob 的电脑,而是先送到 Bob 的邮件服务器 mailbox 中 ...






