当前位置: 首页 > news >正文

【深入理解计算机系统】第一章(计算机系统漫游)笔记

Chapter 1:计算机系统漫游

预习完成:2026-06-01 | 复习完成:2026-06-03 | 共 31 个知识点


CSAPP

  • Chapter 1:计算机系统漫游
      • 1. 信息 = 位 + 上下文(1.1)
      • 2. 程序的翻译过程(1.2)
      • 3. 了解编译系统的好处(1.3)
      • 4. 系统的硬件组成(1.4.1)
      • 5. 运行 hello 程序的过程(1.4.2)
      • 6. 高速缓存至关重要(1.5)
      • 7. 存储设备形成层次结构(1.6)
      • 8. 操作系统管理硬件(1.7)
        • 进程(1.7.1)
        • 线程(1.7.2)
        • 虚拟内存(1.7.3)
        • 文件(1.7.4)
      • 9. 系统之间利用网络通信(1.8)
      • 10. 重要主题(1.9)
        • Amdahl 定律(1.9.1)
        • 并发和并行(1.9.2)
        • 抽象的重要性(1.9.3)
    • 关键公式 / 技巧
    • 易错点
    • 与其他章节的联系
    • 习题记录

1. 信息 = 位 + 上下文(1.1)

  • 计算机中所有信息都由位(0/1)组成,同一串位在不同上下文中有不同的解释(整数、浮点数、指令、字符等)。

2. 程序的翻译过程(1.2)

  • 源程序.c→ 预处理.i→ 编译.s(汇编) → 汇编.o(可重定位目标文件) → 链接 → 可执行文件。
  • 四个阶段:预处理器 → 编译器 → 汇编器 → 链接器

3. 了解编译系统的好处(1.3)

  • 优化程序性能、理解链接时错误、避免安全漏洞(如缓冲区溢出)。

4. 系统的硬件组成(1.4.1)

  • 总线:在部件间传输固定大小的字节块(字)。
  • I/O 设备:通过控制器或适配器连接系统。
  • 主存(DRAM):临时存放程序和数据的线性字节数组。
  • 处理器(CPU):核心是 PC(程序计数器,x86-64 中为%rip),始终指向下一条指令地址。
  • CPU 的核心操作:加载、存储、操作、跳转
  • 指令集架构(ISA):处理器支持的指令及其编码规范,是对处理器硬件的抽象。

5. 运行 hello 程序的过程(1.4.2)

  • 键盘输入 → shell 读入 → 加载可执行文件(DMA) → CPU 执行指令 → 输出到显示器。

6. 高速缓存至关重要(1.5)

  • 核心问题:系统花费大量时间把数据从一个地方搬到另一个地方。
  • 物理规律:较大的存储设备比较小的慢,快速设备比同类的贵得多。
  • CPU-主存差距:处理器与主存之间的速度差距在持续增大。
  • 解决方案:在 CPU 和主存之间加入更小更快的高速缓存(cache),存放处理器近期可能需要的指令和数据。
  • 依赖的关键前提:局部性原理——程序倾向访问局部区域的数据和代码(时间局部性 + 空间局部性)。
  • L1(数万字节,≈寄存器速度)→L2(数十万~数百万字节,比 L1 慢 5×)→L3(更大)。
  • L1/L2/L3 用SRAM实现。程序员利用缓存知识可将程序性能提升一个数量级

7. 存储设备形成层次结构(1.6)

  • 所有存储设备组织成金字塔:寄存器(L0) → L1 → L2 → L3 → 主存(L4) → 本地磁盘(L5) → 远程存储(L6)。
  • 从上至下:速度越来越慢、容量越来越大、每字节造价越来越便宜
  • 核心思想:每一层存储器作为下一层的高速缓存。
  • 寄存器是 L1 的缓存,L1 是 L2 的缓存,…,主存是磁盘的缓存。

8. 操作系统管理硬件(1.7)

  • 操作系统:应用程序和硬件之间的一层软件,两个基本功能:①防止硬件被滥用 ②提供简单统一的硬件接口。
  • 三大抽象:进程、虚拟内存、文件。
进程(1.7.1)
  • 进程:对一个正在运行的程序的抽象。每个进程都觉得自己独占 CPU、主存、I/O 设备。
  • 并发运行:多个进程的指令交错执行
  • 上下文切换:保存当前进程上下文 → 恢复新进程上下文 → 转移控制权。由内核管理。
  • 内核:操作系统代码常驻主存的部分,不是独立的进程,而是管理所有进程的代码和数据结构的集合。
线程(1.7.2)
  • 线程:进程内的执行单元,同一进程的多个线程共享代码和全局数据。
  • 多线程之间比多进程更容易共享数据,也比进程更高效。
虚拟内存(1.7.3)
  • 虚拟内存:为每个进程提供独享主存的假象。每个进程看到一致的虚拟地址空间
  • 虚拟地址空间布局(从低到高):代码/数据 → 堆 → 共享库 → 栈 → 内核虚拟内存
  • 核心机制:进程的虚拟内存内容存在磁盘上,主存充当磁盘的高速缓存
  • 栈向下增长(函数调用),堆向上增长(malloc/free)。
文件(1.7.4)
  • 文件就是字节序列。所有 I/O 设备都可以看成文件(万物皆文件)。
  • 通过一小组Unix I/O系统调用提供统一接口。

9. 系统之间利用网络通信(1.8)

  • 网络对系统而言只是一个I/O 设备
  • 数据流:本地内存 → 网络适配器 → 远程机器。
  • 网络应用遵循客户端-服务器模型

10. 重要主题(1.9)

Amdahl 定律(1.9.1)
  • 公式S = 1 ( 1 − a ) + a / k S = \frac{1}{(1-a) + a/k}S=(1a)+a/k1(a=优化部分占比,k=该部分加速比,S=整体加速比)
  • 核心结论:要想显著加速整个系统,必须提升全系统中相当大的部分的速度。
  • 上界:即使优化部分无限加速(k→∞),整体加速比 ≤ 1/(1-a)。
并发和并行(1.9.2)
  • 并发:一个同时具有多个活动的系统。
  • 并行:用并发来使系统运行得更快。
  • 三个层次:
    1. 线程级并行:多核处理器、超线程(SMT)。
    2. 指令级并行:流水线、超标量。
    3. 数据级并行(SIMD):一条指令同时操作多个数据。
抽象的重要性(1.9.3)
  • 抽象是计算机科学中最重要的概念之一
  • 三大抽象:文件(对 I/O)、虚拟内存(对存储器)、进程(对运行中的程序)。
  • 虚拟机:对整个计算机的抽象。
  • 核心价值:只要执行模型一样,不同的处理器实现也能执行同样的机器代码

关键公式 / 技巧

公式名称说明
S = 1 ( 1 − a ) + a / k S = \frac{1}{(1-a) + a/k}S=(1a)+a/k1Amdahl 定律a=可优化部分占比,k=该部分加速比,S=整体加速比
S ∞ ≤ 1 1 − a S_{\infty} \leq \frac{1}{1-a}S1a1Amdahl 上界即使优化部分免费,整体加速比也受限

易错点

  1. 内核不是进程——内核是管理进程的代码集合,本身不以进程形式运行。(1.7.1)
  2. 虚拟内存 ≠ 物理内存——进程看见的地址空间是假象,实际数据可能部分在磁盘 swap 中。(1.7.3)
  3. 并发 ≠ 并行——单核通过切换也能并发,但不等于并行;并行要求真正的同时执行。(1.9.2)
  4. Amdahl 定律的"上界陷阱"——把 60% 的部分优化到免费,最多快 2.5 倍,瓶颈永远在不可优化的部分。(1.9.1)
  5. 存储速度差距在拉大——CPU 在加速,但内存没有同步加速,差距持续扩大。(1.5)

与其他章节的联系

本章概念展开章节
编译系统(预处理/编译/汇编/链接)第 7 章 链接
缓冲区溢出第 3 章 程序机器级表示
高速缓存和存储器层次结构第 6 章存储器层次结构
进程、上下文切换、内核第 8 章 异常控制流
虚拟内存、堆、栈第 9 章 虚拟内存
Unix I/O、文件第 10 章 系统级 I/O
网络、客户端-服务器第 11 章 网络编程
线程、并发第 12 章 并发编程
流水线、超标量、指令集架构第 4 章 处理器体系结构
SIMD、程序优化、Amdahl 定律第 5 章 优化程序性能

习题记录

  • Practice Problem 1.1(Amdahl 定律 — 卡车运土豆)
    • A. a=0.6, k=1.5 → S=1/(0.4+0.6/1.5)=1.25X;直觉验证:25/(10+10)=1.25X
    • B. S=1.67, a=0.6 → k=3 → 300 km/h(对卡车不现实!)
  • Practice Problem 1.2(Amdahl 定律 — 软件性能 2X)
    • S=2, a=0.8 → k=0.8/0.3≈2.67。核心教训:80% 部分需加速 2.67X 才能整体 2X,瓶颈永远在不可优化部分
http://www.jsqmd.com/news/946993/

相关文章:

  • 彻底理清 B+ 树页分裂与页合并对大批量写入 MySQL分库分表与分区表的设计抉择 数据时吞吐量的影响路径
  • ssm员工在线知识培训考试平台(10153)
  • 从Copilot到Agent:我的团队如何用ChatDev在3天内“自动化”了一个内部工具
  • AD软件大电流布线必备:一招把Top层铺铜“变成”阻焊开窗,告别焊盘锡量不足的烦恼
  • Python 爬虫进阶技巧:元数据 meta 标签提取辅助爬虫页面判重
  • 保姆级教程:在嵌入式Linux上实战I3C SDR模式的热加入与带内中断(附代码避坑)
  • 拆解Botsch经典算法:手写半边结构,一步步实现Isotropic Remeshing(附C++代码)
  • 深入GL3224固件升级工具:如何手动添加Flash芯片支持(以Winbond W25Q16为例)
  • NarratoAI完整教程:三步掌握AI视频解说制作神器
  • ESP8266从联网到传数据:一条AT指令搞定WiFi连接与TCP通信(实战避坑)
  • 用STM32F103C8T6搞定74HC165扩展16个按键(附完整代码和接线图)
  • Harness Engineering:Agent自主决策审计
  • Android混合开发避坑指南:WebView与H5通信的5种姿势与安全实践
  • 2026降AIGC革命:AI率92%暴降至5%!实测10款降AI率工具!薅羊毛技巧!
  • 别再用BertModel直接喂给Chroma了!手写一个EmbeddingFunction解决HuggingFaceEmbeddings离线调用难题
  • AUTOSAR SPI实战避坑:同步调用Spi_SyncTransmit阻塞了CPU?试试异步Spi_AsyncTransmit提升效率
  • 深入探秘 Golang 源码中 channel 管道通信的真正设计意图与边界
  • 用MATLAB批量生成卫星TLE文件:STK11自动化脚本实战(附完整代码)
  • DDD-013:仓储(Repository)
  • Python 爬虫进阶技巧:批量解析 html 实体转义字符还原原始文本
  • Xcode 15开发者的终端效率手册:除了CMD+R运行,你的快捷键还缺这一块
  • 从Demo到量产:Davinci工程添加自定义模块与变体文件的完整指南(以BRS模块为例)
  • 告别WebView黑盒:用Chrome DevTools调试Android混合开发页面(附Androidx-WebKit实战)
  • 钢材表面缺陷检测实战工程:含NEU-DET数据集与YOLOv5/v8多版本训练配置
  • 2026深度测评10款降AI率软件红黑榜!优缺点全曝光,达标率直接对标行业天花板
  • 绝区零自动化脚本终极指南:3分钟快速上手完整教程
  • 用FPGA控制步进电机是种什么体验?从状态机到分频器,详解Verilog驱动A4988全流程
  • 企业级AI角色扮演对话系统
  • MATLAB图像质量评价避坑指南:为什么你的PSNR/SSIM结果和OpenCV差那么多?
  • 你的旧笔记本别扔!巧用闲置MiniPCIe接口,低成本变身4G物联网网关或监控终端