# 计算机系统基础


## 一、处理器体系结构

### CPU中的时序电路
#### 组合电路和时序电路是什么，它们有什么区别

- 组合电路：将逻辑门组合成一张网，所构成的计算块
- 时序电路：逻辑门电路和反馈逻辑回路或器件（寄存器）组成

核心区别是：时序电路的输出不仅取决于当时的输入值，而且还与电路过去的状态有关；任意时刻的输出仅仅取决于该时刻的输入，与电路原来的状态无关。

### 单周期处理器的设计

单周期处理器：在一个时钟周期内完成单条指令：取指、译码、执行、访存、写回、更新PC

- 1、取指：从内存中读取指令，加载至处理器
- 2、译码：对取指令操作中得到的指令进行分析并译码，确定这条指令需要完成的操作，从而产生相的操作控制信号
- 3、执行：进行相应的逻辑或算术运算
- 4、访存：内存访问（非必要）
- 5、写回：将指令结果写回至寄存器（非必要）
- 6、更新PC：更新程序计数器（将程序计数器指向接下来要执行的指令的地址）

### 流水线处理器的基本原理

#### 流水线处理器的概念及基本原理

可以结合单周期处理器的不足进行回答，因为流水线就是单周期处理器的改进。

！！！！一定要点出**并行**！！！！！

- 概念：流水线处理器将待执行的指令拆分成若干个阶段，每个阶段后添加寄存器，使每个阶段
  可以在允许其独立使用的硬件电路上与其他阶段并行，以此提高系统的吞吐量。

- 流水线是如何提高程序性能的？（或者说是流水线的特点）
  - 拆分指令，并且在每个阶段对应的硬件电路后添加寄存器
  - 以流水线的形式执行指令，充分利用硬件，减少了硬件的闲置时间（对比单周期处理器）

#### 流水线处理器的局限性

- 不一致的划分：每个阶段的延迟不一致，导致系统吞吐量取决于最慢的阶段。
- 流水线过深，收益反而下降：在组合逻辑被分成较小的块时，由寄存器更新引起的延迟成为了一个限制因素，降低了收益。

#### 流水线冒险、冒险的种类及对应解决方法

流水线冒险：邻近指令之间出现了某种关联后，下一条指令无法正确执行。

冒险的种类及解决方法：

- 结构冒险：争用硬件（一个指令需要的硬件部件还在为之前的指令工作，而无法为这条指令提供服务）
  - 插入气泡（流水线气泡）
  - 设置相互独立的指令存储和数据存储

- 数据冒险：存在数据依赖，数据还未产生
  - 插入气泡（流水线气泡或者空指令：气泡前的指令继续执行，气泡后的指令被阻塞。直到冒险条件不再满足）
  - 数据转发（将结果值直接从一个流水线阶段传到较早阶段，需要在硬件结构中增加一些额外的数据连接和控制逻辑）
  - 加载互锁（就是暂停加上数据转发，因为在转发将值转发到已经过去的时间中，所以要插入暂停周期）
  - 乱序执行（这个CSAPP中没有，但是应用广泛，可以了解。就是分析指令间的依赖，将无依赖关系的指令提前执行，代替暂停周期，避免时钟浪费）

- 控制冒险：存在分支和跳转时可能发生，不确定下一条执行什么指令
  - 插入气泡
  - 分支预测策略：从不选择策略（60%），反向选择策略（40%），正向选择反向不选择（65%）
  - 条件跳转语句中，可以将每个条件的结果都进行计算，计算的开销小于流水线清空带来的代建

#### 影响流水线效率的因素

局限性和流水线冒险，根据上面的解释这两点

#### 流水线插入气泡技术

插入气泡技术可以解决所有的流水线冒险，但是每一个气泡都会浪费一个时钟周期，代价非常高。因此尽量少用插入气泡解决流水线冒险，选用其他效率高的方法。参考上面提到的。

### Data Hazard的处理

### 流水线设计中的其他问题

#### 流水线若干问题及注意点

- 流水线并不能减少(而且一般是增加)单条指令的执行时间，但却能提高系统吞吐率。
- 适当增加流水线的深度(段数)可以提高流水线的性能。（参考流水线的局限性-不一致的划分）
- 流水线的深度(级数)受限于流水线的延迟和流水线的额外开销
- 如果流水线中的指令相互独立 ，则可以充分发挥流水线的性能。但在实际中 ，指令间可能会是相互依赖，这会降低流水线的性能。

#### 解决流水线的局限性-不一致的划分，超标量技术（选看）

Intel处理器中的超线程技术的本质就是超标量技术。

在CPU中有一条以上的流水线，并且每时钟周期内可以完成一条以上的指令，这种设计就叫超标量技术。其实质是以时间换取空间。

处理器的执行阶段往往是处理器中最耗时的阶段，也就是说执行阶段往往是处理器的瓶颈。

----

## 二、优化程序性能

### 优化程序性能

### 优化编译器的能力和局限性以及表示程序性能

- 1、高级设计：选择合适的算法和数据结构。
- 2、基本编码原则：避免限制优化的因素，使编译器产生高效的代码
  - 1)、消除连续的函数调用（消除低效率循环、减少过程调用）：在可能时，将计算移到循环外。
  - 2)、消除不必要的内存引用：引入临时变量来保存中间结果，只有在最后的值计算出来时，才将结果存放到数组或全局变量中。
- 3、低级优化：结构化代码以利用硬件功能。
  - 1)、展开循环，降低开销
  - 2)、提高指令级并行：通过多个累积变量和重新结合技术
  - 3)、用功能性的风格重写条件操作，使得编译采用数据传送。

### 特定体系结构或应用特性的性能优化

### 限制因素

- 1、寄存器溢出：并行度超过了可用寄存器的数量，就会发生溢出。将某些临时值放到内存中，通常是在运行时堆栈上分配空间。
- 2、分支预测和预测错误的惩罚：分支预测逻辑不能正确预测分支是否要跳转，这时条件分支可能会招致很大的预测错误处罚
  - 不要过分关心可预测分支
  - 书写适合用条件传送实现的代码

### 确认和消除性能瓶颈

程序剖析运行版本的一个版本，其中插入了工具代码，以确定程序的各个部分需要多少时间．再根据Amdahl定律进行优化。

### Amdahl定律

**Amdahl定律**的主要思想是当我们加快系统的一个部分的速度时，对系统整体性能的影响依赖于这个部分有多重要和速度提高了多少．

公式：`S = 1 / ((1 - a) + a / k)`

其中a为某部分需要时间的百分比，k为性能提升倍数．

主要观点是要想大幅度提高整个系统的速度，我们必须提高整个系统很大一部分的速度．

----

## 三、存储器结构及虚拟存储器

### 局部性

**局部性**通常有两种形式：时间局部性(temporal locality)和空间局部性(spatial locality)．

- 在一个具有良好时间局部性的程序中，被引用过一次的存储器位置很可能在不远的将来再被多次引用．
- 在一个具有良好空间局部性的程序中，如果一个存储器位置被引用了一次，那么程序很可能在不远的将来引用附近的一个存储器位置．

### 存储器层级结构

![memoryHierarchy.png](memoryHierarchy.png)

#### 存储器的层级结构

从高层往低层走，存储设备逐渐从小而快变得更大、更慢、更便宜，每层都会缓存来自较低一层的数据对象。被缓存的数据对象一般是处理器近期可能会需要的信息，这样可以有效提高读/写效率。

- 寄存器
- L1高速缓存
- L2高速缓存
- L3高速缓存
- 主存
- 本地二级存储（本地磁盘）
- 远程二级存储（分布式文件系统，WEB服务器）

主要思想：上一层的存储器作为低一层的存储器的高速缓存。利用高速缓存的局部性原理：程序具有访问局部区域里的数据和代码的趋势。

### 计算机高速缓存器原理

### 高速缓存对性能的影响

### 地址空间

地址空间是一个非负整数地址的有序集合．

如果地址空间中的整数是连续的，那么就是一个线性地址空间．

在一个带虚拟存储器的系统中，CPU从一个有2^n个地址的地址空间中生产虚拟地址，这个地址空间称为虚拟地址空间．

物理地址空间与系统中的物理存储器相对应．

### 虚拟存储器

虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互，它为每个进程提供了一个大的、一致的、私有地址空间．

### 虚拟内存的管理、翻译和映射

### TLB

TLB(Translation Lookaside Buffer)叫做翻译后备缓冲器．

TLB是一个小的、虚拟寻址的缓存，其中每一行都保存着一个由PTE组成的块．

### 动态存储器分配

### 垃圾收集

----

## 四、链接、进程及并发编程

### 静态链接

### 目标文件

### 符号和符号表

### 重定位和加载

### 动态链接库

### 异常

### 进程

### 进程控制和信号

### 进程间的通信

### 进程间信号量的控制、信号量

### 各种并发编程模式

### 共享变量

### 线程同步

### 其他并行问题

----

## 五、系统级I/O和网络编程

### I/O相关概念

### 文件及文件操作

### 共享文件

### 网络编程

### 客户端-服务器模型

### 套接字接口

### HTTP请求

### Web服务器

## RISC和CISC（20年考到了但是考纲中没有）

----

<!-- EOF -->


