文章目录
- 1.冯·诺依曼体系结构
- (1)冯·诺依曼体系结构思想
- (2)五大部件介绍
- (3)现代计算机逻辑架构
- 2.现代计算机硬件图 和 CPU
- (1)现代计算机硬件图
- (2)CPU
- 运算器结构
- 算术运算的执行过程
- (3)执行CPU指令的过程
- 指令的组成
- 一个指令周期的过程
- 3.主存
- (1)内存的构成方式
- (2)内存的寻址方式
- (3)典型真题:内存容量计算
- 4.存储器
- (1)存储器的分类
- (2)典型真题:存储器的分类
- (3)存储器之间的层级关系
- 5.校验码
- (1)码距与检错纠错公式
- (2)码距与检错纠错举例
- (3)奇偶校验码
- (4)海明码
- 实例
- (1)计算分组数
- (2)确定校验码位置
- (3)确定分组
- (4)计算偶校验时校验码的值
- (5)海明码纠正
- 典型真题:海明码中校验位的数量
- (5)CRC 循环冗余校验码
- 实例1
- (1)化简多项式
- (2)信息码加 0 ,做模二除运算(不进位加法)
- (3)得到的余数即为校验码
- (4)用校验码替换信息码0的占位得到最终传输的数据![在这里插入图片描述](https://img-blog.csdnimg.cn/dc7c1503895a4a31af3f84b789f6b5e1.png)
- 实例2
- 6.指令
- (1)指令周期
- (2)指令执行的方式
- (1)顺序方式
- (2)重叠方式
- (3)流水方式
- 指令流水技术
- 流水线建立时间与流水线周期
- 流水线的执行时间
- 典型真题:计算流水线的执行时间
- 流水线的吞吐率、最大吞吐率、加速比
- 典型真题:流水线的吞吐率、最大吞吐率、加速比
- 7.高速缓冲存储器
- (1)程序的局部性原理
- 数据引用的局部性
- 取指令的局部性
- 局部性小结
- (2)Cache 与主存、CPU 的交互过程
- (3)Cache 的映像方法
- 直接映像
- 全相联映像
- 组相联映像
- 小结
- (4)Cache 的性能
- (5)写策略
- 写回法
- 写直达法
- 标记法
- (6)Cache 的替换策略
- 8.磁盘存储器
1.冯·诺依曼体系结构
(1)冯·诺依曼体系结构思想
- 采用二进制逻辑。指令和数据用二进制表示。
- 程序存储执行。指令和数据以同等地位存于存储器,可按地址寻址。
- 计算机由五大部件组成(运算器、控制器、存储器、输入设备、输出设备)。
补充:
- 指令由操作码和地址码组成。操作码用来表示操作的性质,地址码用来表示操作数在存储器中的位置。
- 指令在存储器内按顺序存放。通常,指令是顺序执行的,在特定条件下,可根据运算结果或根据设定的条件改变执行顺序。
- 以运算器为中心。输入输出设备与存储器间的数据处理通过运算器完成(现代计算机已转化为以存储器为中心)。
(2)五大部件介绍
- 运算器:算术运算、逻辑运算。
- 存储器:存放程序和数据。
- 控制器:指挥程序运行。
- 输入设备:将信息转换成计算机能识别的形式。
- 输出设备:将结果转换成人们熟悉的形式。
(3)现代计算机逻辑架构
- 运算器和控制器合在一起称为中央处理器,简称CPU。
- 以存储器为中心。
2.现代计算机硬件图 和 CPU
(1)现代计算机硬件图
(2)CPU
运算器结构
- 算术逻辑单元 (Arithmetic&logical Unit,ALU):数据的算术运算和逻辑运算。
- 累加器(Accumulator,ACC):为 ALU 提供一个工作区,用来暂存数据。
- 乘商寄存器(MQ)。
- 操作数寄存器(X)。
- 程序状态寄存器(PSW):存放两类信息:一类是体现当前指令执行结果的各种状态信息,如有无进位(CY位),有无溢出(OV位),结果正负(SF位),结果是否为零(ZF位),奇偶标志位(P位)等;另一类是存放控制信息,如允许中断(IF位),跟踪标志(TF位)等。
- 不同的计算机,部件组成是不一样的,下图为模型机例子。
算术运算的执行过程
加法运算:5 + 2
- 将存储器中的 5 取出,放到 ACC 中。
- 将存储器中的 2 取出,暂存到 X 寄存器。
- ALU 计算,将结果存放到 ACC 中。
(3)执行CPU指令的过程
指令的组成
- 指令:操作码 + 地址码
一个指令周期的过程
- 程序计数器(Program Counter,PC)中存储的是下一条指令所在的内存单元地址(程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC。在拥有 MMU 的情况下,其中存放的是虚拟地址,在无 MMU 平台中,其中存放的是物理地址)。因为冯诺依曼体系结构计算机中的指令是顺序存储在内存中的,所以 PC 每一次加一就得到了下一条指令的内存单元地址。
- 指令寄存器(Instruction Register,IR)中存储的是即将执行的指令。
- 指令译码器(Instruction Decoder,ID)对指令中的操作码字段进行分析解释。
- 地址寄存器(Memory Address Register,MAR)用来存放预访问的指令在物理内存中的真实地址,其位数对应存储单元的个数。假如一个存储体中共有 8 个 存储单元,用 3 位二进制数就可以表示所有的地址,地址总线的个数为 3。
- 数据寄存器(Memory Data Register,MDR)用来存放从存储体某单元取出的代码。
- 时序部件:同步数字系统都需要“时钟” (Clock)。时钟是一种信号,它给数字系统中每一个时序逻辑指定一个开始工作的时间点。假想一条流水生产线:每一个加工步骤的工人在完成对一个部件的加工后, 如果啥也不管就直接扔给下一步骤的工人,同时下一步骤完成加工比前一工位慢;那么可以想见 ,部件就在比较慢的这个工位上堆积起来, 越堆越多, 最后造成生产线的阻塞。所以为了保持流水线流畅不阻塞的运转,我们需要找出最慢的工位, 并把最慢工位处理一个部件需要的时间作为 “时钟周期”,然后由工长通过哨音,每隔一个时钟周期吹响一次哨子,工人们只在哨子吹响的时候才把部件传递给下一工位,这样就可以保证流水线不再发生阻塞。时钟频率就是时钟周期的倒数,也就是上面例子中,每秒钟工长吹响哨子的次数。再扩展一下,如果这个流水线特别长,比如有数公里长,工长的哨音传播到每个工位的时间其实可以相差很久,这样一来哨音的同步作用就失效了。所以我们必须采取措施来保证每个工位能同时听到哨音。在实际的同步数字电路中,设计者采用专门的线路来传输时钟,并且通过对较短的路径插入时钟缓冲器来保证时钟到达每个时序元件的时间完全一致(延迟平衡)。异步系统不需要时钟,它一般用握手信号来保证系统的流畅运行。也就工位之间商量好了再传递部件。
取指:
- 程序计数器(Program Counter,PC)中存储的是指令的虚拟地址,送到总线上,去地址寄存器(Memory Address Register,MAR)找到指令的物理地址(现在的 MAR 已经集成到 CPU 中)。
- 根据地址映射表找到指令的物理地址。
- 把指令取出来放到数据寄存器(Memory Data Register,MDR)中(MDR 已经集成到 CPU 中)。
- 将指令从 MDR 送到指令寄存器(Instruction Register,IR)中。
分析:
- 从 IR 送到指令译码器(Instruction Decoder,ID)对指令进行翻译。
- CU 控制单元控制 CPU 做运算。
执行:
- 将 IR 中 “数字1” 的数据地址送到 MAR。
- 找到 “数字1” 的物理地址,将数据送到MDR。
- 将 MDR 中“数字1” 的数据送到累加器(Accumulator,ACC)中。
- 将 IR 中 “数字2” 的数据地址送到 MAR。
- 找到 “数字2” 的物理地址,将数据送到 MDR。
- 将 MDR 中“数字2” 的数据送到 X 寄存器中。
- ALU 计算,将结果存放到 ACC 中。
3.主存
(1)内存的构成方式
- 冯诺依曼计算机把指令和数据以同等的地位存到主存(内存)当中。
- 内存由一个大的存储体组成,存储体是由一个个的存储单元构成。
- 一个存储单元的容量大小一般是8 bit(即1 Byte,1个字节)。一个 int 型变量占 4 个字节,那么需要用 4 个存储单元存储,变量的地址以存储单元的首地址为准 。
- 每个存储单元都有一个地址,地址用十六进制数表示(前缀表示:0x00000000,后缀表示:00000000H)。
(2)内存的寻址方式
- 总线可以分为控制总线、数据总线和地址总线。
- 地址总线:传递地址的信息。假如需要 n 位二进制来表示所有的地址,则地址总线的个数为 n。假如一个存储体中共有 8 个 存储单元,用 3 位二进制数就可以表示所有的地址,地址总线的个数为 3。
- 数据总线:传递数据的信息。CPU 一次能处理 n 位的数据,则数据总线的长度为 n 。n 的位数为一个字的长度。
(3)典型真题:内存容量计算
内存按字节编址:数据总线长度为 8。
地址总个数:CBFFFFH - A4000H + 1 = CC0000H - A4000H = 28000H 。
转为十进制数:28000H = 2 * (16 ^ 4)+ 8 * (16 ^ 3)= 2 ^ 17 + 2 * 15 = (2 ^ 7 + 2 * 5 )* (2 ^ 10)= 160 KB(个)。
芯片个数:160KB / 32KB = 5(个)。
内存按字节编址:数据总线长度为 8。
地址总个数:8FFFFH - 84000H + 1 = 90000H - 84000H = 0C000H 。
转为十进制数:0C000H = 12 * (16 ^ 3)= 48 * (2 ^ 10)= 48 KB(个)。
芯片个数:48 KB / 4 KB = 12(个)。
4.存储器
(1)存储器的分类
- 按照构成材料分类:机械硬盘和固态硬盘均属于外部存储设备,机械硬盘属于磁存储器,固态硬盘属于半导体存储器(闪存颗粒)。
- 按照工作方式分类:内存和外存属于 RAM。
- 按照访问方式分类:内存属于按照地址访问的存储器,Cache属于按照内容访问的存储器。
- 缓存补充
- 本地缓存(如 HashMap、Guava Cache),本地缓存没有成熟的超时机制;其次本地缓存使用的是jvm的内存;各个进程间的缓存不可以共享;这种缓存没有持久化机制,随着服务的重启,缓存所占用的空间会释放掉;
- 集中式缓存(如 redis),他们一般由成熟的 expire 超时机制;是和业务分离的独立的服务,使用的是 redis 本进程分配的缓存,不是 jvm 的缓存;这种缓存也叫分布式缓存,各个进程间可以共享,不需要在各个进程本地都缓存一份,可以保证各个进程间的缓存一致;支持持久化;
- 缓存补充
(2)典型真题:存储器的分类
(3)存储器之间的层级关系
5.校验码
- 存储器中的信息保存在电容中。
- 校验码的思想:信息的错误无法避免,但是如果信息错了,能够发现并且纠正错误。
(1)码距与检错纠错公式
码距的判断:两个码字逐位比较,看有几位是不同的。
(2)码距与检错纠错举例
- 长度为 1 时不能检测纠错
- 长度为 2 时可以检测 1 个误码,不能纠错
- 长度为 3 时可以检测 1 个误码,纠正1 个误码
(3)奇偶校验码
- 结论:奇偶校验码只能发现奇数个位出错的情况,偶数个位出错发现不了。
- 偶校验:在信息的 最前面 或者 最后面 加上1个校验位,使得传输数据中1的个数变为偶数。
- 奇校验:在信息的 最前面 或者 最后面 加上1个校验位,使得传输数据中1的个数变为奇数。
(4)海明码
- 结论:建立在奇偶校验码的基础之上。
- 奇偶校验码只能发现奇数个位出错的情况,偶数个位出错发现不了。产生这种缺点的原因在于奇偶校验码的校验位加少了。
- 海明码是建立在奇偶校验码的基础之上,但是不再是一串信息只加一个校验码,而是采用分组校验的方式(并不是简单的分组校验),具有检验并纠正一位错误的能力。
实例
现在有一个二进制编码 1011,求按偶校验配置的海明码:
(1)计算分组数
- 分组数 k 需满足公式: 2 ^ k >= n + k + 1(信息位是 n 位,校验位是 k 位)
- 公式可转换为 2 ^ k - 1 >= n + k,n + k 为海明码的位数
- k 应该取满足公式的最小值,以保证信息的传输速率
- n 和 k 对应关系:
信息码位数(n) | 1 | 2~4 | 5~11 | 12~26 | 27~57 | 58~120 |
---|---|---|---|---|---|---|
校验码位数(k) | 2 | 3 | 4 | 5 | 6 | 7 |
答:二进制编码 1011 的 n 为 4,由上可知,k 为 3,即分为 3 组。
(2)确定校验码位置
- 校验码的位置:必须是在 2 ^ n 位置(n 从 0 开始,分别代表从右边数起分别是1、2、4、8、16…)。
- 信息码的位置:非 2 ^ n 位置。
答:校验码在编码中的位置为:D4 D3 D2 P3 D1 P2 P1
(3)确定分组
位置(从右至左) | 所在位置的二进制编码 | 组 |
---|---|---|
P1(校验码) | 001 | 1 |
P2(校验码) | 010 | 2 |
D1 | 011 | 1,2 |
P3(校验码) | 100 | 3 |
D2 | 101 | 1,3 |
D3 | 110 | 2,3 |
D4 | 111 | 1,2,3 |
答:
- 第一组:P1(校验码),D1(值为1),D2(值为0),D4(值为1)
- 第二组:P2(校验码),D1(值为1),D3(值为1),D4(值为1)
- 第三组:P3(校验码),D2(值为0),D3(值为1),D4(值为1)
(4)计算偶校验时校验码的值
- 偶校验:看1的个数,如果是偶数,校验码为0,如果是奇数,校验码为1。
答:
- P1 = 0
- P2 = 1
- P3 = 0
D4(1) D3(1) D2(0) P3(0) D1(1)P2(1) P1(0),生成的海明码为:1 1 0 0 1 1 0。
(5)海明码纠正
假设传输中 D3 发生了错误,原码变为了: 1 0 0 0 1 1 0,如何检错纠错:
答:
- 第一组:P1(0),D1(1),D2(0),D4(1)
- 与校验值码值对比相同:0
- 第二组:P2(1),D1(1),D3(0),D4(1)
- 与校验码的值对比不同:1
- 第三组:P3(0),D2(0),D3(0),D4(1)
- 与校验码的值对比不同:1
检错结果的二进制编码为 110 ,转换为十进制为 6,即第 6 位发生了错误,纠正后为 1 1 0 0 1 1 0。
典型真题:海明码中校验位的数量
(5)CRC 循环冗余校验码
实例1
(1)化简多项式
- 把 X 都当成是 2,得到初步的结果。
- 把缺少的 2 ^ 3, 2 ^ 2 虚拟上去。
- 把题目中现有的 2 ^ 4、2 ^ 1、2 ^ 0 用二进制 1 代替,虚拟出来的 2 ^ 3、2 ^ 2 用 0 代替。
答:
多项式化简为:1 0 0 1 1。
(2)信息码加 0 ,做模二除运算(不进位加法)
- 信息码后面加 0 ,多项式最高是几,就加几个 0。
- 除数和被除数做模二除运算(不进位加法)
- 够除时商为 1,不够除时商为 0。
(3)得到的余数即为校验码
答:
余数为 1 1 0 0。
(4)用校验码替换信息码0的占位得到最终传输的数据
答:
最终传输的数据 = 信息位 + 校验位 = 1 0 1 1 1 1 1 0 0。
实例2
6.指令
(1)指令周期
- 指令周期:取出(解释)并执行一条指令所需的全部时间。
- 一个指令周期可以大概分为:取指周期、分析周期、执行周期。
(2)指令执行的方式
(1)顺序方式
(2)重叠方式
- 假设每一段的执行时间是相同的。
(3)流水方式
指令流水技术
流水线建立时间与流水线周期
- 流水线周期:△t,执行时间最长的一段。如取指 2ns、分析 3ns、执行 1ns,则 △t 为 3ns。
- 流水线建立时间:第一条指令执行完毕所需的时间。理论上是各部分时间之和(t1 + t2 + … + tk),实践中每个部分的执行时间是相同的,都是 △t。
流水线的执行时间
- 理论公式:(t1 + t2 + … + tk) + (n - 1)* △t
- 实践公式:k * △t + (n -1 )* △t
典型真题:计算流水线的执行时间
答:
- 流水线周期是 2ns。
- 理论公式:(2 + 2 + 1)+ 99 * 2 = 203ns。
- 实践公式:3 * 2 + 99 * 2 = 6 + 204ns。
流水线的吞吐率、最大吞吐率、加速比
- 最大吞吐率:指令周期的倒数。
- 流水线加速比:串行方式执行时间 / 流水线方式执行时间
典型真题:流水线的吞吐率、最大吞吐率、加速比
答:
- 最大吞吐率 = 指令周期的倒数 = 1 / (3△t)
- 加速比 = (9△t * 10)/ (9△t + 9 * 3△t)= 90△t / 36△t = 5 : 2
7.高速缓冲存储器
(1)程序的局部性原理
一个优秀的程序、优美的代码,一般都具有良好的局部性。简洁、高效是每个程序员的追求。了解程序的局部性,能编写出更高效的代码。因为有良好局部性的程序能更好的利用缓存。
- 时间局部性(temporal locality):被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
- 空间局部性(spatial locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
参考:局部性原理浅析——良好代码的基本素质
数据引用的局部性
- 图(a)中的 sum 具有良好的时间局部性。因为在 for 循环结束之前,每次执行循环体都有对 sum 的访问。sum 没有空间局部性,因为sum 是标量,即通过 sum 这个地址(可认为是基址)只能得到一个值。
- 循环体中对 a[][] 的引用具有良好的空间局部性。for循环体中,是以行序为主序对元素进行遍历,也就是说内层循环先访问第一行的元素,然后第二行。图 (b)中是二维数组的存储情况。可以看出,在存储器中也是按照行序为主序来进行存储的,存储顺序和访问顺序一致,所以对 a[][] 的引用有良好的空间局部性。对 a[][] 的引用没有时间局部性,因为每个元素只被访问一次。
- 按顺序、连续的对数组进行引用,我们称为步长为1的引用模式。同理,在一个连续的向量中,每隔 k 个元素对向量进行访问,称为步长为 k 的引用。一般来说,随着步长的增加,空间局部性会下降。对于多维数组而言,步长对空间局部性的影响显得尤为重要。例子中对a[][] 实行的是步长为1 的引用。
- 例子中交换了索引 i、j 的位置。也就是说在对 a[][] 进行遍历的时候,以列序为主序。即先访问第一列,在访问第二列。图 (b)中是二维数组的存储情况,可以看出,对 a[][] 的存储仍是行序为主序。这意味着每访问一个元素,就要跳过 k 个存储器才能访问下一个。于是得到一个简单的结论:该例中对 a[][] 的访问是以步长为 k 的模式(k 为每行的元素个数)没有良好的空间局部性。
- 在对向量的访问中,如果访问数序和存储顺序一致,并且是连续访问,那么这种访问具有良好的空间局部性。
取指令的局部性
- 指令存在于存储器中,cpu 要读指令就必须取出指令。所以也能评价对于取指令的局部性。
- 在 for 循环中,循环体内的指令多次被执行,所以有良好的时间局部性。
- 循环体中的指令是桉顺序执行的,有良好的空间局部性(指令在存储器中是顺序存放的)。
局部性小结
- 重复引用同一个变量有良好的时间局部性。
- 对于步长为 k 的引用的程序,步长越小,空间局部性越小。步长为 1 的引用具有良好的空间局部性。k 越大,空间局部性越差。
- 对于取指令来说、循环有较好的时间和空间局部性。
(2)Cache 与主存、CPU 的交互过程
- CPU 将数据的主存地址发送到地址总线上。
- 主存地址与主存Cache地址变换机构做映射(主存和 Cache 不是一一对应的关系,主存当中的第一页可能存在 Cache 中的任何一页当中,映射关系在操作系统章节)。
- 判断要找的数据在不在 Cache 当中。
- 命中:将映射到的 Cache 内块号与块内地址拼接起来得到信息在 Cache 中的真正地址,经过数据总线把数据取出来。
- 不命中:判断 Cache 中还有没有相应的空间,如果有,直接把主存中这部分内容装入 Cache。如果没有,经过 Cache 替换机构,用一定替换算法,把需要的内容替换到 Cache 中,不需要的数据替换出来,放入主存中。
(3)Cache 的映像方法
直接映像
- 主存分为了 128 个区,每个区的大小相同。每个区分为 16 个页,每一页的大小相同。Cache 的大小等于每个区的大小。
- 每个区的第 0 页都映射到 Cache 的第 0 页,每个区的第 1 页都映射到 Cache 的第 1 页,以此类推。
- Cache 中除了划分的页,还有标记位(记录相映射的内存页数)。
- 优点:地址变换简单。
- 缺点:不灵活,页冲突率高。
全相联映像
- 主存和 Cache 不分区。
- 主存中的任何一页都可以映射到 Cache 中的任何一页。
- 优点:不会有冲突的情况。
- 缺点:不能从主存的页号直接获得 Cache 的页号,变换比较复杂,速度比较慢,需要查看所有标记位。
组相联映像
- 主存分区,每个区又划分成若干个组。Cache 的大小等于每个区的大小,内部也划分成组。
- 组间是直接映像,每个区的第 0 组都映射到 Cache 的第 0 组,每个区的第 1 组都映射到 Cache 的第 1 组,以此类推。
- 组内是全相联映像。
- 缺点:更加复杂。
小结
- 距离 CPU 近:直接映像或组相联映像,速度快。
- 距离 CPU 远:全相联映像。、
(4)Cache 的性能
- Cache 的平均访问时间 = 访问命中率 * Cache 的存取时间 + (1 - 访问命中率)* 主存的访问时间 = 98% * 2ns + 2% * 5ns。
(5)写策略
写回法
写直达法
标记法
(6)Cache 的替换策略