《计算机系统:系统架构与操作系统的高度集成》 第 1 章 导论
《计算机系统:系统架构与操作系统的高度集成》
第 1 章 导论
参考:Umakishore Ramachandran & William D. Leahy Jr. 著
1.1 计算机系统概述
1.1.1 什么是计算机系统
**计算机系统(Computer System)**是由硬件和软件共同构成的完整信息处理体系。它不仅仅是一台机器,而是一个精密协作的整体,能够接收输入、处理数据、存储信息并产生输出。
计算机系统的基本组成:
┌─────────────────────────────────────────────────────────────┐
│ 计算机系统 │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 软件层 │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ 应用程序 │ │ │
│ │ │ 浏览器 / 文字处理 / 游戏 / 数据库 │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ 操作系统 │ │ │
│ │ │ Windows / Linux / macOS / Android │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 硬件层 │ │
│ │ CPU / 内存 / 磁盘 / 显卡 / 网卡 / 键盘 / 显示器 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
1.1.2 计算机系统的核心功能
计算机系统具备四大核心功能:
(1)数据处理(Data Processing)
计算机能够对数据执行各种运算和变换:
数据处理示例:
输入:两个数字 a=15, b=7
处理:执行加法运算 a + b
输出:结果 22
更复杂的例子:
输入:一张 4K 分辨率的图片(约 33MB)
处理:应用高斯模糊滤镜(数百万次浮点运算)
输出:模糊后的图片
计算机每秒可以执行数十亿次这样的运算!
(2)数据存储(Data Storage)
计算机系统具有多层次的存储体系:
存储层次(速度从快到慢,容量从小到大):
寄存器(Register)
容量:几十个,每个 64 位
速度:< 1 纳秒
示例:CPU 内部的 RAX、RBX 寄存器
高速缓存(Cache)
容量:KB~MB 级别
速度:1~10 纳秒
示例:L1 Cache(32KB)、L2 Cache(256KB)、L3 Cache(8MB)
主存(RAM)
容量:GB 级别
速度:50~100 纳秒
示例:8GB DDR4 内存
辅助存储(Secondary Storage)
容量:TB 级别
速度:毫秒级(HDD)或微秒级(SSD)
示例:1TB 固态硬盘
远程存储(Cloud Storage)
容量:PB 级别
速度:毫秒~秒级(取决于网络)
示例:Google Drive、阿里云 OSS
(3)数据传输(Data Transfer)
计算机系统能够在不同组件之间、不同计算机之间传输数据:
数据传输示例:
内部传输:
CPU ←→ 内存:通过内存总线,速度约 50GB/s
CPU ←→ 显卡:通过 PCIe 总线,速度约 16GB/s
CPU ←→ 硬盘:通过 SATA/NVMe,速度约 500MB/s~7GB/s
外部传输:
计算机 ←→ 互联网:通过网卡,速度约 1Gbps(家用)
计算机 ←→ USB 设备:通过 USB 3.0,速度约 5Gbps
计算机 ←→ 显示器:通过 HDMI/DisplayPort
(4)控制(Control)
操作系统和硬件协同控制整个系统的运行:
控制功能示例:
场景:用户双击打开一个 Word 文档
控制流程:
1. 鼠标产生中断信号
2. 操作系统响应中断,识别双击事件
3. 操作系统找到 Word 程序的可执行文件
4. 操作系统为 Word 分配内存空间
5. 操作系统将 Word 程序加载到内存
6. CPU 开始执行 Word 程序的指令
7. Word 程序读取文档文件
8. Word 程序将文档内容渲染到屏幕
1.1.3 计算机系统的关键特性
案例:理解计算机系统的抽象性
抽象的力量:
当你在 Python 中写:
result = 2 + 3
你不需要知道:
- CPU 如何用二进制表示数字 2 和 3
- 加法器电路如何工作
- 结果如何存储在寄存器中
- 操作系统如何调度这段代码执行
这就是抽象(Abstraction)的力量:
高层:Python 代码(人类友好)
中层:机器指令(ADD EAX, EBX)
底层:电路信号(0101 0011...)
每一层只需要了解上一层提供的接口,
不需要了解下一层的实现细节。
1.2 计算机的发展历史
1.2.1 第一代计算机:电子管时代(1940s~1950s)
第一代计算机的特征:
代表机器:ENIAC(1946年)
- 全称:Electronic Numerical Integrator and Computer
- 重量:30 吨
- 占地:167 平方米
- 功耗:150 千瓦
- 速度:每秒 5000 次加法运算
- 存储:20 个 10 位十进制数(约 80 字节!)
- 编程方式:手动插拔电缆和设置开关
技术特征:
✓ 使用真空电子管(Vacuum Tube)作为开关元件
✓ 使用穿孔卡片输入程序
✓ 体积巨大,价格昂贵
✗ 电子管容易损坏(ENIAC 平均每天有一个电子管烧毁)
✗ 没有操作系统,每次运行不同程序需要重新接线
历史意义:
ENIAC 最初用于计算炮弹弹道表
后来用于氢弹设计计算
证明了电子计算机的可行性
1.2.2 第二代计算机:晶体管时代(1950s~1960s)
第二代计算机的特征:
关键发明:晶体管(Transistor,1947年,贝尔实验室)
- 发明者:William Shockley、John Bardeen、Walter Brattain
- 获得 1956 年诺贝尔物理学奖
代表机器:IBM 7090(1959年)
- 使用晶体管替代电子管
- 体积缩小到房间大小
- 速度:每秒 22.9 万次运算
- 用于 NASA 水星计划的轨道计算
技术进步:
✓ 晶体管比电子管小 200 倍,耗电少 100 倍
✓ 出现了高级编程语言(FORTRAN、COBOL)
✓ 出现了批处理操作系统
✓ 磁芯存储器(Magnetic Core Memory)替代了汞延迟线
批处理系统示例:
程序员将程序写在穿孔卡片上
→ 提交给操作员
→ 操作员将一批卡片输入计算机
→ 计算机依次执行所有程序
→ 打印结果返回给程序员
(整个过程可能需要几小时到几天)
1.2.3 第三代计算机:集成电路时代(1960s~1970s)
第三代计算机的特征:
关键发明:集成电路(Integrated Circuit,IC,1958年)
- 发明者:Jack Kilby(德州仪器)和 Robert Noyce(仙童半导体)
- Jack Kilby 获得 2000 年诺贝尔物理学奖
代表机器:IBM System/360(1964年)
- 第一个使用集成电路的商业计算机系列
- 引入了"兼容性"概念(同一系列不同型号可以运行相同程序)
- 引入了多道程序设计(Multiprogramming)
多道程序设计示例:
传统方式:
程序A运行 → 等待I/O → CPU空闲 → 程序A继续
CPU 利用率:约 20%
多道程序设计:
程序A运行 → 等待I/O → 切换到程序B → 程序B运行
→ 程序A的I/O完成 → 切换回程序A
CPU 利用率:约 80%
这就是现代操作系统多任务的雏形!
重要里程碑:
1969年:UNIX 操作系统诞生(贝尔实验室,Ken Thompson & Dennis Ritchie)
1972年:C 语言诞生(Dennis Ritchie)
1971年:Intel 4004,第一款商用微处理器(2300个晶体管)
1.2.4 第四代计算机:微处理器时代(1970s~至今)
第四代计算机的特征:
关键发明:大规模集成电路(LSI/VLSI)
将数百万个晶体管集成在一块芯片上
个人计算机革命:
1975年:Altair 8800(第一台商业成功的个人计算机)
1977年:Apple II(乔布斯和沃兹尼亚克)
1981年:IBM PC(使用 Intel 8088 处理器)
1984年:Apple Macintosh(第一款图形用户界面个人电脑)
摩尔定律(Moore's Law):
1965年,Gordon Moore 预测:
"集成电路上的晶体管数量每18~24个月翻一番"
验证:
1971年 Intel 4004:2,300 个晶体管
1979年 Intel 8088:29,000 个晶体管
1993年 Intel Pentium:310 万个晶体管
2006年 Intel Core 2:2.91 亿个晶体管
2019年 AMD EPYC:395 亿个晶体管
2023年 Apple M2 Ultra:1340 亿个晶体管
互联网时代:
1969年:ARPANET(互联网前身)
1991年:万维网(WWW)诞生(Tim Berners-Lee)
1993年:Mosaic 浏览器(第一款图形浏览器)
2007年:iPhone 发布(移动计算时代开始)
1.2.5 计算机发展的关键里程碑时间线
计算机发展时间线:
1936 ── 图灵机理论(Alan Turing)
1945 ── 冯·诺依曼架构提出
1946 ── ENIAC 诞生(第一台通用电子计算机)
1947 ── 晶体管发明(贝尔实验室)
1951 ── UNIVAC I(第一台商用计算机)
1958 ── 集成电路发明
1964 ── IBM System/360(第一个计算机系列)
1969 ── UNIX 诞生 / ARPANET 建立
1971 ── Intel 4004(第一款微处理器)/ C 语言诞生
1975 ── Altair 8800(个人计算机时代开始)
1981 ── IBM PC / MS-DOS
1984 ── Apple Macintosh(GUI 普及)
1991 ── Linux 内核诞生(Linus Torvalds)/ WWW 诞生
1993 ── Pentium 处理器 / Mosaic 浏览器
1995 ── Windows 95 / Java 语言
2001 ── Mac OS X / Windows XP
2007 ── iPhone(移动计算革命)
2012 ── 深度学习崛起(AlexNet)
2016 ── AlphaGo 击败人类围棋冠军
2022 ── ChatGPT(大语言模型时代)
2023 ── AI 芯片时代(NVIDIA H100)
1.2.6 冯·诺依曼架构
现代计算机的基础是 冯·诺依曼架构(Von Neumann Architecture),由数学家约翰·冯·诺依曼于 1945 年提出:
冯·诺依曼架构:
┌─────────────────────────────────────────────────────────────┐
│ 冯·诺依曼计算机 │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 中央处理器(CPU) │ │
│ │ ┌──────────────────┐ ┌──────────────────────────┐ │ │
│ │ │ 控制单元(CU) │ │ 算术逻辑单元(ALU) │ │ │
│ │ │ 负责指令的读取 │ │ 负责算术和逻辑运算 │ │ │
│ │ │ 解码和执行控制 │ │ 加减乘除、与或非 │ │ │
│ │ └──────────────────┘ └──────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ ↕ 总线(Bus) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 存储器(Memory) │ │
│ │ 程序(指令)和数据存储在同一存储器中 │ │
│ │ 这是冯·诺依曼架构的核心特征! │ │
│ └──────────────────────────────────────────────────────┘ │
│ ↕ │
│ ┌──────────────────┐ ┌──────────────────────────────────┐ │
│ │ 输入设备 │ │ 输出设备 │ │
│ │ 键盘/鼠标/摄像头 │ │ 显示器/打印机/扬声器 │ │
│ └──────────────────┘ └──────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
冯·诺依曼架构的核心思想:
1. 程序存储(Stored Program):程序和数据都存储在内存中
2. 顺序执行:CPU 按顺序读取并执行指令
3. 二进制表示:所有信息用二进制(0和1)表示
冯·诺依曼瓶颈(Von Neumann Bottleneck):
CPU 和内存之间的数据传输速度限制了整体性能
CPU 速度提升远快于内存速度提升
解决方案:Cache(高速缓存)
1.3 计算机系统的层次结构
1.3.1 层次结构的概念
计算机系统采用**层次化(Hierarchical)**设计,每一层都建立在下一层提供的服务之上,并向上一层提供更高级的抽象:
计算机系统的完整层次结构:
层次7:用户(User)
↕ 应用程序接口(API)
层次6:应用程序(Application Programs)
Word、Chrome、Python 程序、游戏...
↕ 系统调用接口(System Call Interface)
层次5:操作系统(Operating System)
进程管理、内存管理、文件系统、设备驱动...
↕ 指令集架构(ISA)
层次4:机器语言(Machine Language)
二进制指令:01001000 10000011 11000000 00000001
↕ 微架构实现
层次3:微架构(Microarchitecture)
流水线、超标量、乱序执行、分支预测...
↕ 逻辑门实现
层次2:数字逻辑(Digital Logic)
与门、或门、非门、触发器、寄存器...
↕ 晶体管实现
层次1:电子电路(Electronic Circuits)
晶体管、电阻、电容...
↕ 物理实现
层次0:物理层(Physics)
半导体物理、量子力学...
1.3.2 硬件层次
(1)晶体管与逻辑门
从物理到逻辑的抽象:
物理层:晶体管(Transistor)
晶体管是一种电子开关:
- 基极(Base)电压高 → 集电极到发射极导通 → 输出低电平(0)
- 基极(Base)电压低 → 集电极到发射极断开 → 输出高电平(1)
逻辑层:逻辑门(Logic Gate)
用晶体管构建基本逻辑门:
非门(NOT Gate):
输入 A → 输出 ¬A
A=0 → 输出1
A=1 → 输出0
与门(AND Gate):
输入 A, B → 输出 A·B
只有 A=1 且 B=1 时,输出才为1
或门(OR Gate):
输入 A, B → 输出 A+B
A=1 或 B=1 时,输出为1
案例:用逻辑门实现 1 位加法器
输入:A(被加数),B(加数),Cin(进位输入)
输出:Sum(和),Cout(进位输出)
Sum = A XOR B XOR Cin
Cout = (A AND B) OR (Cin AND (A XOR B))
这就是计算机加法的最底层实现!
(2)数字逻辑层
数字逻辑层的关键组件:
组合逻辑(Combinational Logic):
输出只取决于当前输入
例:加法器、多路选择器(MUX)、解码器
时序逻辑(Sequential Logic):
输出取决于当前输入和历史状态
例:触发器(Flip-Flop)、寄存器、计数器
案例:D 触发器(D Flip-Flop)
- 在时钟上升沿,将输入 D 的值存储到输出 Q
- 这是计算机存储信息的基本单元!
- 8 个 D 触发器 = 1 字节的存储
时序图:
CLK: ___↑___↑___↑___
D: ___1___0___1___
Q: ____1___0___1__
(Q 在时钟上升沿跟随 D 变化)
(3)微架构层
微架构(Microarchitecture):
实现指令集架构(ISA)的具体硬件设计
关键技术:
1. 流水线(Pipeline)
将指令执行分为多个阶段,多条指令同时处于不同阶段
5级流水线示例:
阶段:取指(IF) → 译码(ID) → 执行(EX) → 访存(MEM) → 写回(WB)
时间轴:
指令1: IF ID EX MEM WB
指令2: IF ID EX MEM WB
指令3: IF ID EX MEM WB
指令4: IF ID EX MEM WB
效果:理想情况下,每个时钟周期完成一条指令
(非流水线:每条指令需要5个时钟周期)
2. 超标量(Superscalar)
每个时钟周期可以发射多条指令
现代 CPU 通常可以同时执行 4~8 条指令
3. 乱序执行(Out-of-Order Execution)
CPU 不按程序顺序执行指令,而是按照数据依赖关系
充分利用 CPU 的执行单元,提高效率
4. 分支预测(Branch Prediction)
预测 if/else 等分支的走向,提前执行预测路径
现代 CPU 分支预测准确率可达 95%+
1.3.3 指令集架构(ISA)
**指令集架构(Instruction Set Architecture,ISA)**是硬件和软件之间的接口,定义了处理器能够执行的指令集合:
ISA 的重要性:
ISA 是硬件和软件的"合同":
硬件承诺:实现 ISA 中定义的所有指令
软件承诺:只使用 ISA 中定义的指令
ISA 的好处:
✓ 软件可以在不同硬件实现上运行(兼容性)
✓ 硬件可以自由改进实现方式(只要遵守 ISA)
案例:x86 ISA 的兼容性
1981年:Intel 8088(IBM PC)
1985年:Intel 80386(32位扩展)
2003年:AMD Athlon 64(64位扩展,x86-64)
2023年:Intel Core i9-13900K
这些处理器都实现了 x86 ISA(不断扩展)
1981年为 IBM PC 编写的程序,理论上仍然可以在
2023年的 Intel Core i9 上运行!
常见 ISA:
x86/x86-64:Intel 和 AMD 的 PC/服务器处理器
ARM:手机、平板、嵌入式系统(Apple M系列也是ARM)
RISC-V:开源 ISA,新兴的嵌入式和服务器市场
MIPS:路由器、早期游戏机(PlayStation)
ISA 的分类:
CISC(复杂指令集):x86,指令复杂,数量多
RISC(精简指令集):ARM、RISC-V,指令简单,数量少
x86 汇编语言示例:
; 计算 1 + 2 = 3 的 x86-64 汇编代码
section .text
global _start
_start:
mov rax, 1 ; 将数字 1 放入 RAX 寄存器
mov rbx, 2 ; 将数字 2 放入 RBX 寄存器
add rax, rbx ; RAX = RAX + RBX = 1 + 2 = 3
; 结果 3 现在在 RAX 寄存器中
; 对应的机器码(十六进制):
; 48 C7 C0 01 00 00 00 → mov rax, 1
; 48 C7 C3 02 00 00 00 → mov rbx, 2
; 48 01 D8 → add rax, rbx
; 对应的二进制:
; 01001000 11000111 11000000 00000001 00000000 00000000 00000000
; ...(CPU 实际执行的就是这些 0 和 1)
1.3.4 操作系统层
操作系统(Operating System,OS)是管理计算机硬件资源、为应用程序提供服务的系统软件:
操作系统的核心功能:
1. 进程管理(Process Management)
- 创建、调度、终止进程
- 多个程序"同时"运行的幻觉
案例:你同时运行浏览器、音乐播放器和文字处理软件
实际上:CPU 在这三个程序之间快速切换
切换频率:每秒数百次
人类感知:三个程序"同时"在运行
2. 内存管理(Memory Management)
- 为每个进程分配独立的内存空间
- 虚拟内存:让每个程序以为自己独占内存
案例:虚拟内存
物理内存:8GB
每个程序看到的地址空间:4GB(32位)或 128TB(64位)
操作系统负责将虚拟地址映射到物理地址
3. 文件系统(File System)
- 组织和管理磁盘上的数据
- 提供文件和目录的抽象
案例:你保存一个 Word 文档
你看到的:一个名为 "report.docx" 的文件
实际上:数据分散存储在磁盘的多个扇区中
文件系统负责记录哪些扇区属于这个文件
4. 设备管理(Device Management)
- 通过驱动程序控制硬件设备
- 提供统一的设备访问接口
案例:打印文档
应用程序:调用 print() 函数
操作系统:找到打印机驱动程序
驱动程序:将数据转换为打印机能理解的格式
打印机:执行打印操作
5. 安全与保护(Security & Protection)
- 防止程序相互干扰
- 用户权限管理
- 防止恶意软件
1.3.5 应用程序层
应用程序层的抽象:
高级编程语言的抽象:
Python 代码:
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()
print(numbers)
这几行代码背后发生了什么?
1. Python 解释器将代码翻译为字节码
2. 字节码调用 C 语言实现的排序函数
3. C 函数编译为 x86-64 机器指令
4. 机器指令操作 CPU 寄存器和内存
5. 内存中的数据通过总线传输
6. 最终结果显示在屏幕上
程序员只需要写 3 行 Python 代码,
底层发生了数百万次硬件操作!
这就是抽象层次的价值:
让程序员专注于解决问题,
而不是关心硬件细节。
1.3.6 各层次之间的交互
案例:从键盘输入到屏幕显示的完整旅程
案例:在终端输入 "Hello" 并按回车
步骤1:物理层
手指按下 'H' 键
键盘电路检测到按键,产生电信号
步骤2:硬件层
键盘控制器将按键编码为扫描码(0x23)
通过 USB 接口发送给计算机
步骤3:操作系统层(中断处理)
USB 控制器产生硬件中断
CPU 暂停当前任务,跳转到中断处理程序
操作系统的键盘驱动程序读取扫描码
将扫描码转换为 ASCII 码('H' = 0x48 = 72)
将字符放入键盘输入缓冲区
步骤4:操作系统层(进程调度)
终端程序(bash)等待键盘输入
操作系统唤醒 bash 进程
bash 从缓冲区读取字符 'H'
步骤5:应用程序层
bash 将 'H' 回显到终端
用户继续输入 "ello" 和回车
bash 接收完整命令 "Hello"
步骤6:操作系统层(显示)
bash 调用系统调用 write()
操作系统将字符串传递给显示驱动程序
显示驱动程序将字符转换为像素数据
像素数据写入显存(Frame Buffer)
步骤7:硬件层
显卡读取显存中的像素数据
通过 HDMI/DisplayPort 发送给显示器
显示器点亮对应的像素
步骤8:物理层
液晶分子在电场作用下改变方向
背光通过液晶层,形成可见光
用户看到屏幕上显示 "Hello"
整个过程在不到 1 毫秒内完成!
1.4 本书的组织结构与学习路线
1.4.1 本书的核心主题
《计算机系统:系统架构与操作系统的高度集成》的独特之处在于将计算机体系结构和操作系统融合讲解,强调两者之间的紧密联系:
传统教学方式(分离):
计算机体系结构课程:
→ 学习 CPU 设计、流水线、Cache
→ 但不了解操作系统如何使用这些硬件特性
操作系统课程:
→ 学习进程、内存管理、文件系统
→ 但不了解底层硬件如何支持这些功能
本书的方式(集成):
同时讲解硬件和软件,展示它们如何协同工作
例如:
讲解虚拟内存时,同时讲解:
- 硬件:MMU(内存管理单元)、TLB(快表)
- 软件:操作系统的页表管理、缺页中断处理
1.4.2 本书的章节组织
本书的学习路线图:
第一部分:基础知识
第1章:导论(本章)
→ 建立整体认知框架
第2章:指令集架构(ISA)
→ 学习计算机能理解的"语言"
→ 案例:LC-3 简化指令集
第3章:数字逻辑
→ 从晶体管到逻辑门到功能单元
→ 案例:设计一个简单的 ALU
第二部分:处理器与内存
第4章:处理器设计
→ 如何实现 ISA
→ 案例:设计单周期 CPU
第5章:流水线
→ 提高 CPU 性能的关键技术
→ 案例:5级流水线设计与冒险处理
第6章:存储器层次结构
→ 寄存器、Cache、内存、磁盘
→ 案例:Cache 命中率对性能的影响
第三部分:操作系统基础
第7章:操作系统概述
→ 操作系统的角色和功能
第8章:进程与线程
→ 程序如何"同时"运行
→ 案例:多线程 Web 服务器
第9章:内存管理
→ 虚拟内存、分页、分段
→ 案例:malloc 的实现原理
第10章:文件系统
→ 数据如何持久化存储
→ 案例:ext4 文件系统结构
第四部分:高级主题
第11章:I/O 系统
→ 设备如何与计算机交互
→ 案例:磁盘调度算法
第12章:并发与同步
→ 多个程序如何安全共享资源
→ 案例:生产者-消费者问题
第13章:网络与分布式系统
→ 计算机如何互联
→ 案例:TCP/IP 协议栈
1.4.3 学习路线建议
初学者路线
初学者推荐学习路线:
阶段1:建立基础(第1~3章)
目标:理解计算机的基本工作原理
重点:
✓ 理解二进制表示
✓ 理解逻辑门和基本电路
✓ 理解指令集的概念
实践:
- 用 Python 模拟简单的逻辑门
- 手动将十进制数转换为二进制
- 阅读简单的汇编代码
阶段2:理解处理器(第4~6章)
目标:理解 CPU 如何执行程序
重点:
✓ 理解指令执行的完整过程
✓ 理解流水线的工作原理
✓ 理解 Cache 的重要性
实践:
- 使用 CPU 模拟器(如 LC-3 模拟器)
- 分析简单程序的 Cache 行为
- 使用 perf 工具观察 Cache 命中率
阶段3:理解操作系统(第7~10章)
目标:理解操作系统如何管理资源
重点:
✓ 理解进程和线程的区别
✓ 理解虚拟内存的工作原理
✓ 理解文件系统的基本结构
实践:
- 在 Linux 上使用 ps、top 等命令
- 编写简单的多线程程序
- 分析 /proc 文件系统
阶段4:综合应用(第11~13章)
目标:理解完整的计算机系统
重点:
✓ 理解 I/O 系统的工作原理
✓ 理解并发编程的挑战
✓ 理解网络通信的基础
实践:
- 编写使用 socket 的网络程序
- 实现简单的生产者-消费者程序
- 分析系统调用的执行过程
进阶者路线
进阶者推荐学习路线:
如果你已经有编程基础,可以:
快速通过第1~3章:
重点关注你不熟悉的部分
特别注意:ISA 设计的权衡(RISC vs CISC)
深入第4~6章:
重点:
✓ 超标量和乱序执行的实现
✓ Cache 一致性协议(MESI)
✓ 内存屏障和内存模型
扩展阅读:
- 《计算机体系结构:量化研究方法》(Hennessy & Patterson)
- Intel 优化手册
深入第7~10章:
重点:
✓ 调度算法的实现细节
✓ 内存分配器的设计
✓ 文件系统的日志机制
实践:
- 阅读 Linux 内核源码
- 实现简单的内存分配器
- 分析 ext4 文件系统的日志
深入第11~13章:
重点:
✓ 异步 I/O 和事件驱动编程
✓ 无锁数据结构
✓ 分布式系统的一致性
扩展阅读:
- 《UNIX 环境高级编程》(APUE)
- 《深入理解计算机系统》(CSAPP)
1.4.4 本书的学习方法
有效学习计算机系统的方法:
1. 理解而非记忆
✗ 错误:死记硬背 Cache 的参数
✓ 正确:理解为什么需要 Cache,Cache 如何工作
2. 动手实践
每学完一个概念,立即动手验证:
学完 Cache 后:
# 测试 Cache 对性能的影响
# 顺序访问(Cache 友好)
for i in range(1000000):
arr[i] = arr[i] + 1
# 随机访问(Cache 不友好)
for i in random_indices:
arr[i] = arr[i] + 1
# 测量两种方式的时间差异
3. 建立联系
计算机系统的各个部分紧密相连:
- 理解 Cache 时,联系操作系统的内存管理
- 理解进程调度时,联系 CPU 的上下文切换
- 理解文件系统时,联系磁盘的物理结构
4. 从问题出发
每个设计都是为了解决某个问题:
- 为什么需要 Cache?→ CPU 和内存速度差异
- 为什么需要虚拟内存?→ 内存隔离和保护
- 为什么需要文件系统?→ 数据持久化和组织
5. 使用工具观察
不要只停留在理论,用工具观察真实系统:
观察 CPU 使用率:top, htop
观察内存使用:free, /proc/meminfo
观察 Cache 行为:perf stat -e cache-misses
观察系统调用:strace
观察进程:ps, /proc/PID/
观察文件系统:df, du, stat
1.4.5 关键概念预览
本书将深入讲解的关键概念:
硬件相关:
┌─────────────────────────────────────────────────────────┐
│ 概念 │ 重要性 │
├─────────────────────────────────────────────────────────┤
│ 指令集架构(ISA) │ 硬件软件接口,决定编程模型 │
│ 流水线 │ 现代 CPU 性能的基础 │
│ Cache │ 解决 CPU-内存速度差异的关键 │
│ 虚拟内存 │ 内存管理和保护的基础 │
│ 中断机制 │ 硬件与操作系统交互的桥梁 │
└─────────────────────────────────────────────────────────┘
软件相关:
┌─────────────────────────────────────────────────────────┐
│ 概念 │ 重要性 │
├─────────────────────────────────────────────────────────┤
│ 进程与线程 │ 程序执行的基本单位 │
│ 调度算法 │ 决定系统响应性和吞吐量 │
│ 内存分配 │ 程序如何使用内存 │
│ 文件系统 │ 数据持久化的基础 │
│ 同步原语 │ 并发程序正确性的保证 │
└─────────────────────────────────────────────────────────┘
硬件软件协同:
┌─────────────────────────────────────────────────────────┐
│ 概念 │ 硬件支持 │ 软件实现 │
├─────────────────────────────────────────────────────────┤
│ 虚拟内存 │ MMU、TLB │ 页表管理 │
│ 进程隔离 │ 特权级、保护位 │ 系统调用 │
│ 中断处理 │ 中断控制器 │ 中断处理程序 │
│ 原子操作 │ 原子指令 │ 互斥锁 │
│ I/O 操作 │ DMA 控制器 │ 设备驱动 │
└─────────────────────────────────────────────────────────┘
本章小结
| 节 | 核心内容 | 关键概念 |
|---|---|---|
| 1.1 计算机系统概述 | 计算机系统的四大功能(处理/存储/传输/控制);存储层次结构;抽象的重要性 | 数据处理、存储层次、抽象 |
| 1.2 计算机发展历史 | 四代计算机(电子管→晶体管→集成电路→微处理器);冯·诺依曼架构;摩尔定律 | 冯·诺依曼架构、摩尔定律、ISA兼容性 |
| 1.3 层次结构 | 7层计算机系统层次(物理→电路→数字逻辑→微架构→ISA→OS→应用);各层的抽象和接口 | ISA、流水线、操作系统功能 |
| 1.4 学习路线 | 本书的组织结构;初学者和进阶者的学习路线;有效学习方法 | 理解而非记忆、动手实践、建立联系 |
思考题
1. 为什么计算机系统需要层次化设计?
提示:考虑复杂性管理和可维护性
2. 冯·诺依曼架构的"存储程序"概念有什么革命性意义?
提示:与早期计算机(如 ENIAC)的编程方式对比
3. 摩尔定律是否会永远持续?
提示:考虑物理极限(原子大小)和量子效应
4. 为什么 ISA 的兼容性如此重要?
提示:考虑软件投资和生态系统
5. 操作系统如何让多个程序"同时"运行?
提示:考虑 CPU 时间片和上下文切换
6. 为什么 Cache 对现代计算机性能如此重要?
提示:考虑 CPU 和内存的速度差异(100倍以上)
参考文献:Umakishore Ramachandran & William D. Leahy Jr.,《计算机系统:系统架构与操作系统的高度集成》
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)