《深入理解计算机系统》读书笔记 第一章 计算机系统漫游。

1 计算机系统漫游

1.1 信息就是位+上下文

从一个 Hello World 程序开始。

1.2 程序被其他程序翻译成不同的格式

1.3 了解编译系统如何工作是大有益处的

  • 优化程序性能。
  • 理解链接错误。
  • 避免安全漏洞。

1.4 处理器读并解释存储在内存中的指令

shell 是一个命令行解释器。

1.4.1 系统的硬件组成

  1. 总线

    • 携带信息字节并负责在各个部件间传递。
    • 通常设计成传送定长的字节块,也就是 字(word)
    • 大多数机器字长要么是4字节(32位),要么是8字节(64位)。
  2. I/O设备

    • 系统与外部世界的联系通道。
    • 每个I/O设备都通过 控制器 或者 适配器 与I/O总线相连。
    • 控制器是I/O设备本身或者系统的主印制电路板(主板)上的芯片组。
    • 适配器是一块插在主板上的卡。
  3. 主存

    • 临时存储设备,处理器执行程序时,用来存放程序和程序处理的数据。
    • 物理上,由一组 动态随机存取存储器(DRAM) 芯片组成。
    • 逻辑上,是一个线性的字节数组,每个字节都有唯一的地址(从0开始)。
  4. 处理器

    • CPU,解释(或执行)存储在主存中指令的引擎。
    • 核心是一个大小为一个字的存储设备(或寄存器),称为 程序计数器(PC)
    • 任何时刻,PC都指向主存中的某条机器语言指令。
    • 处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由 指令集架构 决定的。
    • 指令所对应的简单操作并不多,它们围绕着 主存寄存器文件(register file)算术/逻辑单元(ALU) 进行。这些操作包括:

      • 加载。
      • 存储。
      • 操作。
      • 跳转。
    • 现代处理器使用了非常复杂的机制来加速程序的执行。注意区分:

      • 处理器的指令集架构:每条机器代码指令的效果。
      • 处理器的微体系架构:处理器实际是如何实现的。

1.4.2 运行Hello程序

  1. shell将我们输入的./hello逐一读入寄存器,再把它放入内存。
  2. 敲回车时,shell知道我们结束了命令的输入。shell将执行一系列指令来加载可执行的hello文件,将目标文件中的代码和数据从磁盘复制到主存。
    • 注:利用 直接存储器存取(DMA)技术,数据可以不通过处理器而字节从磁盘到达主存。
  3. 处理器开始执行main中的机器语言指令,这些指令将字符串从主存复制到寄存器文件,再从寄存器文件复制到显示设备,最终显示在屏幕上。

1.5 高速缓存至关重要

  • 系统花费了大量时间把信息从一个地方挪到另一个地方。
  • 根据机械原理,较大存储设备要比较小存储设备运行得慢,快速设备得造价远高于同类的低速设备。
  • 高速缓存存储器(cache memory):作为暂时的集结区域,存放处理器近期可能会需要的信息。分为L1、L2、L3。

1.6 存储设备形成层次结构

1.7 操作系统管理硬件

  • shell 和 hello 程序都没有直接访问键盘、显示器、磁盘、主存等硬件,而是依靠操作系统提供服务。
  • 操作系统的两个基本功能:
    • 防止硬件被失控的应用程序滥用。
    • 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
  • 操作系统使用以下几个抽象概念来实现这两个基本功能:
    • 文件:对I/O设备的抽象。
    • 虚拟内存:对主存和磁盘I/O设备的抽象。
    • 进程:对处理器、主存和I/O设备的抽象。

1.7.1 进程

  • 操作系统为程序提供一种假象,就好像系统上只有这个程序在运行。程序看上去是独占地使用处理器、主存和I/O设备。
  • 并发运行:一个进程的指令和另一个进程的指令是交错执行的。
  • 上下文:操作系统保持跟踪进程运行所需的所有状态信息。
  • 上下文切换:操作系统把处理器的控制权从当前进程转移到某个新进程。它是由内核(kernel)管理的。
  • 内核:操作系统代码常驻内存的部分,不是一个独立的进程,时系统管理全部进程所用代码和数据结构的集合。
  • 当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条特殊的 系统调用(system call) 指令,将控制权传递给内核,内核执行请求并返回应用程序。

1.7.2 线程

  • 多线程比多进程更容易共享数据。
  • 往往比进程更高效。

1.7.3 虚拟内存

  • Linux中,地址空间最上面的区域是保留给操作系统中的代码和数据的。

  • 区:
    • 程序代码和数据。代码从一个固定地址开始,紧接着C全局变量。是直接按照可执行目标文件的内容初始化的。
    • 共享库
    • 内核虚拟内存。为内核保留,不允许应用程序读写或直接调用内核代码定义的函数,必须调用内核来执行这些操作。

1.7.4 文件

  • 文件就是字节序列。
  • 每个I/O设备,包括磁盘、键盘、显示器、网络,等可以看成文件。

1.8 系统之间利用网络通信

1.9 重要主题

1.9.1 Amdahl定律

  • 思想:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。

若系统执行某应用程序需要时间为T-old,假设系统某部分所需执行时间与该时间的比例为a,而该部分性能提升比例为k。由此计算加速比:
S = T-old/T-new = 1 / ((1-a) + a/k)

1.9.2 并发和并行

  • 并发(concurrency):同时具有多个活动的系统。
  • 并行(parallelism):用并发来使一个系统运行得更快。

并行可以用在计算机系统的多个抽象层次上:

  1. 线程级并发

    • 单处理器系统。
    • 多处理系统。
      • 多核处理器。
      • 超线程(hyperthreading),或称同时多线程(simultaneous multi-threading)。允许一个CPU执行多个控制流,它涉及到CPU某些硬件有多个备份,如程序计数器、寄存器文件。
  2. 指令级并行

    • 早期处理器,执行一条指令需要3~10个时钟周期。
    • 现在的处理器使用了许多聪明的技巧来同时处理多达100条指令。
    • 流水线(piplining):将执行一条指令所需要的活动划分成不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤,这些阶段可以并行地操作。
    • 如果处理器可以达到比一个周期一条指令更快地执行速率,就称之为 超标量(super-scalar)处理器
  3. 单指令、多数据并行(SIMD并行)

    • 在最低层次上,许多现代处理器拥有特殊地硬件,允许一条指令产生多个可以并行执行地操作。
    • 可以提高对影像、声音、视频数据地处理效率。
    • 有些编译器会试图从C程序中自动抽取SIMD并行性,但更好地方法是用编译器支持地特殊向量数据类型来写程序。

1.9.3 计算机系统中抽象的重要性

  • 再增加一个抽象:虚拟机,是对整个计算机的抽象,包括操作系统、处理器和程序。

习题:

  • 1.1 Amdahl定律公式的应用
  • 1.2 Amdahl定律公式的应用