CPU 结构及工作原理
程序运行示例:QQ.exe
进程
程序本质上是一份存在于磁盘中的可执行文件。执行程序时,操作系统会将其加载至内存中,形成一个称为进程
的实体,并分配程序相关的资源,例如:程序暴露的通信端口,使用的文件句柄
等。
进程:程序分配资源的基本单位
线程
程序在开始运行时,会加载主线程(如 Java 中的main()
)中的命令依次写入 CPU 执行,直到程序执行完成。
线程:程序执行的基本单位
CPU 结构
PC & Registers 支持了 CPU 多线程执行中的线程切换工作。
PC (Program Counter) 程序计数器
用来存放当前欲执行指令的地址,它与主存的 MAR 之间有一条直接通路,且具有自加1的功能,即可形成下一条指令的地址。
CPU 同一时间只能运行一个线程,多线程切换时,记录线程执行的指令地址,便于下次线程切换恢复程序执行。
Registers 寄存器
存储程序运行参与运算的数据及运算结果.
CPU 同一时间只能运行一个线程,多线程切换时,记录线程执行时参与运算的数据及运算结果,便于下次线程切换恢复程序执行。
ALU (Arithmetic And Logic Unit) 算术逻辑单元
CPU 的执行单元,能实现多组算术运算和逻辑运算的组合逻辑电路
CU (Control Unit) 控制单元
控制单元负责程序的流程管理。正如工厂的物流分配部门,控制单元是整个 CPU 的指挥控制中心,由指令寄存器 IR (Instruction Register)、指令译码器 ID 和操作控制器 OC (Operation Controller) 三个部件组成,对协调整个电脑有序工作极为重要。
MMU (Memory Management Unit) 内存管理单元
内存管理单元 (MMU) 负责虚拟地址与物理地址的转换, 管理内存读/写。
MMU 的产生
许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一个办法,这就是虚拟存储器(virtual memory).虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上比如对一个16MB的程序和一个内存只有4MB的机器,OS通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割
Cache
由于 ALU 从内存读取数据计算过于耗时,增加了三级缓存以提高 CPU 的执行效率。
三级缓存
- L1 缓存:最快的缓存,通常内置于处理器核心中,每个核心都有自己的 L1 缓存。L1 缓存通常分为两部分:L1d(数据缓存)和 L1i(指令缓存),分别用于存储数据和指令。
- L2 缓存:速度比 L1 慢,但容量更大。在多核处理器中,L2 缓存可能对每个核心是独立的,也可能是几个核心共享的,这取决于具体的处理器设计。
- L3 缓存:最大的缓存,通常由处理器上所有的核心共享。L3 缓存的速度比 L1 和 L2 慢,但由于其较大的容量,它可以有效地减少对主内存的访问次数。
内存(RAM):这是计算机的主存储器,由所有的处理器共享。与缓存相比,内存的速度较慢,但容量更大。
总之,L1 和 L2 缓存通常是为单个核心或少数几个核心服务的,而 L3 缓存是为处理器上所有核心共享的。内存则是由整个系统上的所有处理器共享的。
缓存行
三级缓存在缓存数据的时候,一次缓存数据相邻64字节的所有数据。相邻的64字节的数据单位被称为缓存行
。
缓存行:缓存用来管理数据的基本单位
问题
问:缓存行是设计越大越好吗?为什么是64字节?
答:缓存行设计过于小,可以保证读取缓存查询效率,更新缓存效率成本变低,但是会增加数据命中失败的概率从而重复从内存读取数据缓存,导致效率变低。如果设计过于大,可以保证命中效率,但是在更新缓存的时候会导致更新效率变低;64字节则是设计妥协的结果,根据当前硬件设计考量。