当前位置: 首页 > 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.rkmt.cn/news/1458495.html

相关文章:

  • ssm员工在线知识培训考试平台(10153)
  • 从Copilot到Agent:我的团队如何用ChatDev在3天内“自动化”了一个内部工具
  • ESP8266从联网到传数据:一条AT指令搞定WiFi连接与TCP通信(实战避坑)
  • Android混合开发避坑指南:WebView与H5通信的5种姿势与安全实践
  • DDD-013:仓储(Repository)
  • 从Demo到量产:Davinci工程添加自定义模块与变体文件的完整指南(以BRS模块为例)
  • 企业级AI角色扮演对话系统
  • 钢材表面缺陷检测实战工程:含NEU-DET数据集与YOLOv5/v8多版本训练配置
  • 零基础如何学会Appium自动化测试
  • 用MATLAB复现DWA算法:从二维到三维,手把手教你搞定无人机避障路径规划
  • 保姆级教程:华为交换机DHCP地址池配置与查询全流程(含防IP冲突指南)
  • 别再死记硬背CSRF原理了!用Pikachu靶场实战Get/Post/Token三种攻击,手把手教你复现
  • Arduino读取FlySky接收机PWM信号:从硬件连接到代码实现
  • 别再到处找地图JSON了!手把手教你用ECharts-GL + 阿里云DataV下载并配置离线3D地图
  • WeChatExporter终极指南:3步永久保存你的微信聊天记录,告别数据丢失
  • Halcon region转图像踩坑实录:region_to_bin、region_to_label、region_to_mean到底怎么选?
  • 快手无水印下载终极指南:KS-Downloader完整使用教程
  • Python 爬虫分布式实战:Redis + 多进程爬虫实现分布式数据采集与任务分片
  • 从‘nvidia-smi’到跑通第一个CUDA核函数:给Python开发者的CentOS服务器GPU编程初体验
  • 自制Digispark开发板:从ATtiny85芯片到USB可编程硬件的完整实践
  • 别再只盯着GPS了!手把手教你用Arduino解析北斗/GPS模块的NMEA 0183数据(附完整代码)
  • 3步搞定Mac鼠标指针个性化:Mousecape完整使用指南
  • 告别玄学:给你的STM32 Bootloader跳转函数加个‘安全检查清单’(含代码详解)
  • 智能客服响应延迟骤降92%,企业AI工具整合避坑清单,仅剩最后87份内部文档模板
  • C++编写的BMP条形码定位与数字解码工具集(含预处理、频域增强与形态学操作)
  • Fan Control实战:3个技巧解决Windows风扇控制难题
  • 避坑指南:在RH850上发送超过16位SPI数据包,EDL位和CS信号时序你配对了吗?
  • Arxiv上传前必读:从专利风险到源码政策,这些“隐形坑”可能毁了你的工作
  • OV摄像头SCCB协议实战:用Arduino UNO配置OV7670图像传感器(附完整代码)
  • 深入PSINS工具箱:从`glvf`的全局变量设计,看严恭敏老师的编程哲学与工程考量