跳到主要内容

硬件结构

冯诺依曼模型​

运算器、控制器、存储器、输入设备、输出设备

  • 内存: 每一个字节都对应一个内存地址,内存的地址是从 0 开始编号的,然后自增排列
  • 中央处理器: 64 位 CPU 一次可以计算 8 个字节,64位是 CPU 位宽
  • 总线:
    • 地址总线,用于指定 CPU 将要操作的内存地址
    • 数据总线,用于读写内存的数据
    • 控制总线,用于发送和接收信号,比如中断、设备复位等信号,CPU 收到信号后自然进行响应,这时也需要控制总线

当 CPU 要读写内存数据的时候,首先要通过「地址总线」来指定内存的地址,然后通过「控制总线」控制是读或写命令,最后通过「数据总线」来传输数据。

线路位宽​

因为 2 ^ 32 = 4G,CPU 想要操作 4G 大的内存,那么就需要 32 条地址总线。

32 位 CPU 最大只能操作 4GB 内存

很少应用需要算超过 32 位的数字,所以如果计算的数额不超过 32 位数字的情况下,32 位和 64 位 CPU 之间没什么区别

CPU 时钟周期​

比如一个 1 GHz 的 CPU,指的是时钟频率是 1 G,代表着 1 秒会产生 1G 次数的脉冲信号

每一次脉冲信号高低电平的转换就是一个周期,称为时钟周期

存储器​

CPU Cache(SRAM)、内存(DRAM)、固体硬盘(SSD)、机械硬盘(HDD)

速度顺序:寄存器 > L1 Cache > L2 Cache > L3 Cache

  • 寄存器:半个 CPU 时钟周期内完成读写
  • L1 Cache:2~4 个时钟周期
  • L2 Cache:10~20 个时钟周期
  • L3 Cache:20~60 个时钟周期
  • 内存:200~300 个 时钟周期之间
  • SSD:比内存慢 10~1000 倍
  • HDD:比内存慢 10W 倍

每个存储器只和相邻的一层存储器设备打交道

L1 Cache 通常会分为「数据缓存」和「指令缓存」,L1 Cache 和 L2 Cache 都是每个 CPU 核心独有的,而 L3 Cache 是多个 CPU 核心共享的。

直接映射 Cache​

alt text

  1. 根据内存地址中索引信息,计算在 CPU Cache 中的索引
  2. 判断 CPU Cache Line 中的有效位(数据是否过期)
  3. 对比内存地址中组标记和 CPU Cache Line 中的组标记
  4. 根据偏移量读取

CPU 缓存一致性​

写入数据时,怎么把数据写入内存:

  • 写直达:把数据同时写入内存和 Cache 中,写入前会先判断数据是否已经在 CPU Cache 里面了
  • 写回:只有在缓存不命中,同时数据对应的 Cache 中的 Cache Block 为脏,才会写入内存;如果不是脏数据会写入 Cache,同时把数据标记为脏的。

缓存一致性产生原因:CPU 是多核的,L1/L2 Cache 是多个核心各自独有的,多个核心操作同一个数据。

解决缓存一致性问题:

  • 写传播:某个 CPU 核心里的 Cache 数据更新时,必须要传播到其他核心的 Cache
  • 事务的串行化:某个 CPU 核心里对数据的操作顺序,必须在其他核心看起来顺序是一样的

具体实现是 MESI 协议

中断​

中断是系统用来响应硬件设备请求的一种机制,操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。中断处理程序,要尽可能快的执行完,这样可以减少对正常进程运行调度地影响。

软中断:将中断过程分成了两个阶段,上半部用来快速处理中断,下半部用来延迟处理上半部未完成的工作,一般以「内核线程」的方式运行

浮点数​

负数用补码是为了在正数与负数在加减法运算时保持一致,不需要多余的判断

浮点数标准​

1000.101 规格化表示成 1.000101 x 2^3,000101 为尾数位,3 是指数位

尾数位决定了浮点数的精度

指数位指明了小数点在数据中的位置