31-深入浅出计算机组成原理随记

计算机指令

不同的CPU有不同的指令集,也就对应不同的汇编语言和机器码,对应的汇编代码会对应这个指令集的机器码,汇编语言不是类似C语言的统一编程语言,汇编语言”其实可以理解成“机器码”的一种别名或者书写方式,不同的指令集和体系结构的机器会有不同的“机器码”,高级语言在转换成为机器码的时候,是通过编译器进行的,需要编译器指定编译成哪种汇编/机器码,编译器如果支持编译成不同的体系结构的汇编/机器码,就要维护很多不同的对应关系表,但是这个表并不会太大。以最复杂的Intel X86的指令集为例,也只有2000条不同的指令而已。
 

指令跳转

cpu运行程序的过程:cpu从PC寄存器中取地址,找到地址对应的内存位子,取出其中指令送入指令寄存器执行,然后指令自增,重复操作。所以只要程序在内存中是连续存储的,就会顺序执行这也是冯诺依曼体系的理念吧。而实际上跳转指令就是当前指令修改了当前PC寄存器中所保存的下一条指令的地址,从而实现了跳转。
 

函数调用

栈是一个抽象概念,实际就是放在内存里面的栈是用来管理函数调用的"现场"得,确保函数调用完成后,还能回到调用者那里;

通过压栈和出栈操作,使得程序在不同的函数调用过程中进行转移;

通过加入程序栈,相当于在指令跳转的过程中加入一个"记忆"的功能,能在跳转去运行新的指令之后,再回到跳出去的位置,能够实现更加丰富和灵活的指令执行流程;

ELF和静态链接

只有通过链接器把多个目标文件以及调用的各种函数库链接起来,才能得到一个可执行文件;

C语言编译,汇编,链接生成一个可执行文件,通过装载器把可执行文件装载到内存中,CPU从内存中读取指令和数据,才开始真正执行程序;

在Linux下,可执行文件和目标文件所使用的都是一种叫ELF的文件格式,中文名字叫可执行与可链接文件格式,不仅存了编译成的汇编指令,还保留了很多别的数据;

函数名称(add,main等)及定义的全局可以访问的变量名称,都存放在ELF格式文件里的符号表的位置里;

Windows的可执行文件是一种叫PE的文件格式,Linux下的装载器只能解析ELF格式而不能解析PE格式;

程序装载

运行可执行文件的时候,通过装载器解析ELF或者PE格式的可执行文件,之后装载器会把对应的指令和数据加载到内存里让CPU执行;

指令里用到的内存地址叫作虚拟内存地址,实际在内存硬件里的空间地址叫作物理内存地址;

找出一段连续的物理内存和虚拟内存地址进行映射的方法叫作分段;

 和分段这样分配一整段连续的空间给到程序相比,分页是把整个物理内存空间切成一段固定尺寸的大小;

动态链接

动态链接想要链接的不是存储在硬盘上的目标文件代码,而是加载到内存中的共享库;

PLT程序链接表

GOT全局偏移量

二进制编码

 现代计算机都是用0和1组成的二进制来表示所有的信息;

理解电路

我们通过电路的"开"和"关"来表示"1"和"0",就想晶体管在不同的情况下表现为导电的"1"和绝缘的"0"的状态;

中继就是不断地通过新的电源重新放大已经开始衰减的原有信号;

加法器

异或门是一个最简单的整数加法所需要的基本门电路;

通过异或门计算出个位,通过一个与门计算出是否进位,通过电路算出一个一位数的加法,把两个门电路打包,就叫做半加器;

用两个半加器和一个或门,就能组成一个全加器,即接受进位信号、加数和被加数组成的加法;

用来做算术逻辑计算的组件叫作ALU;

乘法器

完整的加法器可以由很多个全加器串联起来;全加器由两个半加器外加一个或门组成;
半加器由一个与门和一个异或门组成;半加器只是整个加法器中最基础的一个零件。

乘法器的实现过程里,我们其实就是把乘法展开,变成了“加法 + 位移”来实现。

浮点数和定点数

在二进制里面,我们应该把它变成一个“符号位 s+ 指数位 e+ 有效位数 f”的组合;

建立数据通路
计算机每执行一条指令的过程,可以分解成这样几个步骤。
1.Fetch(取得指令),也就是从 PC 寄存器里找到对应的指令地址,根据指令地址从内存
里把具体的指令,加载到指令寄存器中,然后把 PC 寄存器自增,好在未来执行下一条指
令。
2.Decode(指令译码),也就是根据指令寄存器里面的指令,解析成要进行什么样的操
作,是 R、I、J 中的哪一种指令,具体要操作哪些寄存器、数据或者内存地址。
3.Execute(执行指令),也就是实际运行对应的 R、I、J 这些特定的指令,进行算术逻辑
操作、数据传输或者直接的地址跳转。
把从内存里面读取一条指令的最短时间,称为 CPU 周期。
一个CPU 周期,通常会由几个时钟周期累积起来。一个 CPU 周期的时间,就是这几个 Clock
Cycle 的总和。
一个指令周期,包含多个 CPU 周期,而一个 CPU 周期包含多个时钟周期。
数据通路就是我们的处理器单元。它通常由两类原件组成。
第一类叫操作元件,也叫组合逻辑元件(Combinational Element),其实就是我们的
ALU。在前面讲 ALU 的过程中可以看到,它们的功能就是在特定的输入下,根据下面的组
合电路的逻辑,生成特定的输出。
第二类叫存储元件,也有叫状态元件(State Element)的。比如我们在计算过程中需要用
到的寄存器,无论是通用寄存器还是状态寄存器,其实都是存储元件。
我们通过数据总线的方式,把它们连接起来,就可以完成数据的存储、处理和传输了,这就
是所谓的建立数据通路了。
CPU 运转需要的数据通路和控制器需要的四种电路:ALU 这样的组合逻辑电路、用来存储数
据的锁存器和 D 触发器电路、用来实现 PC 寄存器的计数器电路,以及用来解码和寻址的
译码器电路。
有了时钟信号,我们可以提供定时的输入;有了 D 型触发器,我们可以在时钟信号控制的
时间点写入数据。我们把这两个功能组合起来,就可以实现一个自动的计数器了。
我们可以通过自动计数器的电路,来实现一个 PC 寄存器,不断生成下一条要执行的计算机
指令的内存地址。然后通过译码器,从内存里面读出对应的指令,写入到 D 触发器实现的
指令寄存器中。再通过另外一个译码器,把它解析成我们需要执行的指令和操作数的地址。
这些电路,组成了我们计算机五大组成部分里面的控制器。
我们把 opcode 和对应的操作数,发送给 ALU 进行计算,得到计算结果,再写回到寄存器
以及内存里面来,这个就是我们计算机五大组成部分里面的运算器。
 

面向流水线的指令设计

流水线技术并不能缩短单条指令的响应时间这个性能指标,但是可以增加在运行很多条指令时候的吞吐率。
通过流水线设计来提升 CPU 的吞吐率;

冒险和预测

结构冒险

现代的 CPU 虽然没有在内存层面进行对应的拆分,却在CPU 内部的高速缓存部分进行了区分,把高速缓存分成了指令缓存(Instruction Cache)和数据缓存(Data Cache)两部分。
内存的访问速度远比 CPU 的速度要慢,所以现代的 CPU 并不会直接读取主内存。它会从主内存把指令和数据加载到高速缓存中,这样后续的访问都是访问高速缓存。

数据冒险

数据冒险,其实就是同时在执行的多个指令之间,有数据依赖的情况。这些数据依赖,我们可以分成三大类,分别是先写后读(Read After Write,RAW)、先读后写(Write After Read,WAR)和写后再写(Write After Write,WAW)。
 

Superscalar和VLIW(超标量和超长指令字设计)

超标量可以让CPU不仅在指令执行阶段是并行的,在取指令和指令译码的时候,也是并行的,通过超标量技术可以使得你所使用的CPU的IPC超过1;

在乱序执行和超标量的CPU架构里,指令的前后依赖关系,是由CPU内部的硬件电路来检测的,而到了超长指令的架构里面,这个工作交给了编译器这个软件;

超标量技术能够让取指令以及指令译码也并行进行,在编译过程超长指令字技术可以搞定指令先后的依赖关系,使得一次可以取一个指令包;

超线程(Hyper-Threading)技术和单指令多数据流(SIMD)技术

在一个物理CPU核心内部,会有双份的PC寄存器,指令寄存器乃至条件码寄存器,CPU核心就可以维护两条并行的指令的状态;

SIMD技术则是一种"指令级并行"的加速方案,在处理向量计算的情况下,同一个向量的不同维度之间的计算是相互独立的,CPU的寄存器可以放的下多条数据,所以我们可以一次性取出多条数据交给CPU并行计算;

异常与中断

I/O发出的信号的异常代码是由操作系统来分配的,也就是由软件来设定的,而像加法溢出的异常代码则是由CPU预先分配好的,也就是由硬件来分配的;

异常的分类:

中断:程序执行到一半被打断,打断执行的信号来自于CPU外部的I/O设备;

陷阱:程序员"故意"主动触发的异常;

故障:在异常程序处理完成之后仍然回来处理当前的指令,而不是去执行程序的下一条指令;

中止:CPU遇到故障,但是恢复不过来不得不中止;

异常的处理:上下文切换

对于异常这样的处理流程,不像是顺序执行的指令间的函数调用关系,而是更像两个不同的独立进程之间在CPU层面的切换;

CISC(复杂指令集)和RISC(精简指令集)

RISC通过减少CPI提升性能,而CISC通过减少需要的指令数来提升性能;

GPU

图像进行渲染的过程可以被分解为5个:

顶点处理,图元处理,栅格化,片段处理,像素操作;

FPGA(现场可编程门序列),ASIC(专用集成电路)

FPGA:

用存储换功能实现组合逻辑;

对于需要实现的时序逻辑电路,在FPGA里直接放上D触发器作为寄存器;

FPGA是通过可编程逻辑布线,来连接各个不同的CLB,最终实现我们想要实现的芯片功能;

理解虚拟机

虚拟机技术就是指在现有硬件的操作系统上,能够模拟一个计算机系统的技术;

要模拟一个计算机系统,就是兼容这个计算机系统的指令集,把原先的系统叫作宿主机,把能够有能力去模拟指令执行的软件叫作模拟器,实际运行在模拟器上被"虚拟"出来的系统叫客户机;

存储器层次结构全景

缓存用的SRAM芯片(静态随机存取存储器)处于通电状态,里面的数据就可以保持存在,一旦断电,数据就会丢失;

内存用的DRAM芯片(动态随机存取存储器)需要靠不断地"刷新",才能保持数据被存储起来;

局部性原理

局部性原理包括时间局部性和空间局部性,时间局部性是如果一个数据被引用了,那么短时间内还会再次被引用,空间局部性是如果一个数据被访问了,那么和它相邻的数据也很快会被访问;

理解CPU Cache(高速缓存)

直接映射(Cache)确保任何一个内存块的地址始终映射到一个固定的CPU Cache地址,而这个映射关系通常用mod运算(求余运算)来实现;

一个内存的访问地址,最终包括高位代表的组标记,低位代表的索引,以及在对应的实际数据中定位的位置偏移量;

内存地址对应到Cache里的数据结构,则多了一个有效位和对应的数据,由"索引+有效位+组标记+数据"组成;

volatile关键字最核心的知识点关系到Java内存模型(JMM)上;它会确保我们对于这个变量的读取和写入,都一定会同步到主内存里,而不是从Cache里面读取;

MESI协议:如何让多核CPU的高速缓存保持一致

多核CPU核都有独立的属于自己的L1 Cache和L2 Cache,多个CPU之间只是共用L3 Cache和主内存;

实现缓存一致性关键要满足两点:写传播和保障事务的串行化;

MESI协议是一种基于写失效的缓存一致性协议,写失效的协议的好处是我们不需要在总线上传输数据内容而只需要传输操作信号和地址信号就好了,不需要占总线带宽;

涉及到数据一致性,CPU层,单机多线程内存层,分布式系统多台机器层,处理办法都差不多,原理相通;

理解内存

对于一个内存地址转换分为3步:

把虚拟内存地址切分成页号和偏移量的组合;

从页表里面查询出虚拟页号对应的物理页号;

直接拿物理页号,加上前面的偏移量就得到了物理内存地址; 

总线

总线是用来计算机里各个不同的组件之间用来通信的渠道;总线的核心设计思路是为了减少多个模块之间交互的复杂性和耦合度;

输入输出设备

硬盘的两个硬性的指标:响应时间和数据传输率理解和研究I/O性能问题;

机械硬盘HHD

机械硬盘的硬件主要由盘面,磁头和悬臂三部分组成;

固态硬盘SSD

SSD的使用寿命受限于块的擦除次数;

DMA(直接内存访问)

DMA技术就是我们在主板上放一块独立的芯片,在进行内存和I/O设备的数据传输不再通过CPU来控制数据传输而直接通过DMA控制器;

数据的完整性

分布式计算

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值