计算机技术基础知识(1) ---- CPU 原理和程序执行流程

1. 冯-诺依曼结构

冯诺依曼结构提出的计算机架构:存储程序,程序计算,主要思想有:

  • 二进制:程序,数据都采用二进制编码,存储在存储器中,二进制也是CPU能够识别,执行的编码
  • 存储程序和指令,指令序列和数据存储在主存储器中,在CPU 工作时,从存储器中取出指令,加以分析和执行
  • 计算机的五个基本组成部分:运算器,控制器,存储器,输入设备,输出设备

计算机技术基础知识(1) ---- CPU 原理和程序执行流程_第1张图片

冯诺依曼体系的改进:

  • 指令和数据都存储在一个存储器上,并且通过一个系统总线进行访问,当前的主存储器的速度是跟不上CPU的速度的,为了解决这个问题,在CPU和主存之间增加了高速缓存,并且在L1 的高速缓存上,还区分开了指令缓存(ICache)和数据缓存(DCache),进一步提高系统总线的访问速度,为了解决指令和数据共用系统总线,带来的速度慢的问题,又提出了哈佛架构,将指令和数据分别放在不同的主存上,可以并行访问,这提高了运行速度。但是哈佛架构结构复杂,不适合外部主存的扩展
  • 顺序执行指令:为了提高指令的运行速度,提出了 分支预测,乱序执行,指令流水线等功能

2. CPU架构

计算机技术基础知识(1) ---- CPU 原理和程序执行流程_第2张图片

上图绘制了CPU + 存储的架构,这基本上是现在复杂CPU的主流做法,CPU内部包含控制器、运算器、寄存器,CPU 使用的是虚拟地址,经过 MMU 转换为物理地址。其中MMU内部有一个页表高速缓存表(Table Lookup Buffer,简称TLB)和页表遍历单元(Table Walk Unit,简称TWU),当TLB中已经缓存要访问的虚拟地址到物理地址的转换关系的时候,就可以直接找到的物理地址,通过该地址在 L1 Cache 中查找数据。

如果 TLB 中没有缓存要访问虚拟地址对应的物理地址的时候,这时会通过TWU模块遍历主存中的页表,查找对应的物理地址,然后再通过这个物理地址访问 L1 Cache,如果L1 cache中存在着要访问的物理地址对应的内容,直接返回给相应的寄存器。如果L1 cache中没找到相应的数据,就依次从L2、L3 cache中查找,如果在所有层级的 Cache 中都没有查找到数据,就会直接访问主存,去除物理地址对应的数据,然后分别给到寄存器和L1 Cache。

其中实线部分是命中TLB及cache的数据访问方式,虚线部分是没有命中TLB及cache,通过TWU和页表访问主存存取数据,主要是为了解决两个问题,一个是地址空间保护、内存使用效率低的问题,另一个是冯·诺依曼体系结构访问指令、数据共用存储器慢的问题。接下来,我们分别看看各个模块的功能。

  • 控制器

控制器也称为控制单元(Control Unit,简称CU),是计算机的指挥中心,CU 包含指令寄存器,指令计数器,其中指令寄存器存放当前执行的指令,指令计数器总是指向下一条要执行的指令地址,CU 的工作流程为:从内存中取出指令,翻译指令,分析指令。然后根据指令的含义,向相关的部件发送控制命令,控制相关部件执行指令所包含的操作。

指令的执行流程:CU通过指令计数器获取下一条将要执行指令的地址,通过该地址获取具体的指令,存放在指令寄存器中,然后对该指令进行解码,如果是一个加法指令(Add),会通过将寄存器的值加载到运算器,其中寄存区的值是从 Cache 或者主存中获取的,经过运算器产生进位,溢出等信号反馈给控制器,产生的结果也存放在寄存器中。

  • 运算器

运算器是一个负责逻辑运算的模块,主要包含算术逻辑单元(Arithmetic logic unit)简称ALU,和浮点运算单元(Floating Point Unit),ALU的主要功能:在控制信号的作用下,完成算术运算和逻辑运算以及移位等运算。通常ALU有两个输入端和输出端组成(两个值用于输入,一个结果输出)。FPU 主要负责浮点运算和高精度整数运算,有一些处理器有专门的向量处理单元。

运算器的主要处理对象是数据,大多数CPU是以16,32,64位数据作为一次处理数据的长度。能够一次性对一个数据的所有位同时处理的与运算器称为并行运算器,一次只能对数据的一个位进行处理的运算器称为串行运算器,CPU 的位数就是指 ALU 一次能处理的数据的位数。

运算器的操作对象和操作类别由控制器来决定,运算器操作的数据从主存或者Cache 中读取,处理的结果也会写入内存或者CPU内部寄存器中,运算器对内存的读写,也是通过控制器进行的。

  • 寄存器

寄存器的主要功能是存储数据和指令,并且能够高速,自动完成数据的存储,寄存器是有记忆功能的器件,而且采用稳态0或1来记录数据信息,寄存器是一种组合逻辑电路

  • Cache

因为主存的读写速度无法跟上CPU的速度,同时因为程序的加载有时间,空间局部性的特点,也就是说程序的一个内存位置被访问了,附近的位置也有很大概率被访问到,可以把内存中的部分代码提前加载到访问更快的Cache里面,Cache 的主要作用是CPU和主存之间的缓冲层,Cache 速度接近于CPU,基本上是和CPU同频运作。

Cache 一般集成在CPU上,L1 Cache 分为 DCache 和 ICache,L1和L2 Cache位于同一个CPU上,L3 Cache 一般在多个CPU之间共享

计算机技术基础知识(1) ---- CPU 原理和程序执行流程_第3张图片

现代的计算机或者嵌入式系统一般有 Cache、内存、HDD、SSD等,这些设备越靠近CPU,速度越快,容量越小,价格越贵

  1. 寄存器(Register):寄存器更像是 CPU 本身的一部分,只能存放极其有限的信息,但是速度非常快,和CPU同步
  2. 高速缓存(CPU Cache):使用静态随机存取存储器(Static Random-Access Memory,简称SRAM)
  3. 内存(DRAM): 使用动态随机存取存储器(Dynamic Random Access Memory,简称DRAM)的芯片,比起 SRAM 来说,它的密度更高,有更大的容量,而且它也比 SRAM 芯片便宜不少。
  4. ROM:如固态硬盘(Solid-state drive 或 Solid-state disk,简称SSD)、硬盘(Hard Disk Drive,简称HDD)

速度越快的设备,容量越小,相应的容量越大的设备,速度也越慢,但是单位价格便宜

计算机技术基础知识(1) ---- CPU 原理和程序执行流程_第4张图片

3. 程序执行流程

CPU 执行程序的过程如下:

计算机技术基础知识(1) ---- CPU 原理和程序执行流程_第5张图片

CPU读取程序计数器的值,这个值就是指令的内存地址,然后CPU通过控制器操作地址总线指定要访问的内存地址,通知内存设备准备好数据,数据准备好后通过数据总线将指令传递给CPU,CPU会将当前的指令放到指令寄存器中。

CPU分析指令寄存器中的指令,确定指令的参数和类型,如果是计算类型的指令,就将指令交给逻辑运算单元运算,如果是存储类型的指令,就交给控制单元执行。

CPU执行完指令后,程序计数器的值会自增,表示指向下一条指令,这个自增的大小,由CPU的位宽决定,比如 32 位的CPU,指令大小是4字节,需要4个内存地址存放,程序计数器的值也会增加4;

CPU 从程序计数器读取指令、到执⾏、再到下⼀条指令,这个过程会不断循环,直到程序执⾏结束,这个不断循环的过程被称为 CPU 的指令周期

针对汇编代码,我们还需要⽤汇编器翻译成机器码,这些机器码由 0 和 1 组成的机器语⾔,这⼀条条机器码,就是⼀条条的计算机指令,这个才是 CPU 能够真正认识的东⻄。

a = 1 + 2 的执行过程

程序编译过程中,编译器编译代码,发现 1 和 2 是数据,会将1 和 2 放入专门的数据段中,如下图所示,数据 1 和数据 2 的区域位置:

  • 数据 1 被存放到 0x100 位置
  • 数据 2 被存放到 0x104 位置

计算机技术基础知识(1) ---- CPU 原理和程序执行流程_第6张图片

编译器会将 a = 1 + 2 编译为 4 条汇编指令,存放到正文段中,如上图,这 4 条指令被存放到了 0x200 ~ 0x20c的区域中:

  • 0x200 的内容是 load 指令,作用是将 0x100 地址中的数据 1 装入到寄存器 R0
  • 0x204 的内容是 load 指令,作用是将 0x104 地址中的数据 2 装入到寄存器 R1
  • 0x208 的内容是 add 指令,将寄存器 R0 的值和寄存器 R1的值相加,并将结果存储到寄存器 R2 中
  • 0x20c 的内容是 store 指令,将寄存器 R2 中的数据存回数据段中的 0x108地址中,这个地址就是 变量 a 的地址

程序执行时,指令计数器会被设置为 0x200 地址,然后依次执⾏这 4 条指令

你可能感兴趣的:(计算机基础知识,开发语言,c语言)