Appearance
CPU组成
CPU
内部由ALU
(算术逻辑单元)、CU
(控制器)、寄存器(PC、IR、PSW、DR、通用寄存器等)、中断系统组成,外部通过总线与控制总线、数据总线、地址总线进行相连接,对数据和程序进行相关的操作。
CPU
的功能
- 指令控制:按照顺序进行取指操作,由控制器CU完成取指和分析指令的操作。
- 操作控制:能对指令进行译码、寄存、执行的有关操作。
- 时间控制:对各种操作进行的时间实施定时。
- 数据加工:能够进行算术运算和逻辑运算,该功能的实现由ALU寄存器(算术逻辑单元)完成。
- 处理中断:能够响应输入输出设备发出的中断请求。
控制器
控制器,又叫控制单元(CU
,Control Unit)
控制器的功能:
- 从指令cache中取出一条指令,并指出下一条指令在指令cache中的位置。
- 对指令进行译码或测试,并产生相应的操作控制信号,以便于启动规定的动作。例如:一次数据cache的读写操作,一个算术逻辑运算操作,一个输入输出操作
- 指挥并控制CPU,数据cache和输入输出设备之间的数据流向的方向。
控制器的内部组成部分:
程序计数器(PC):用来存放下一条要执行的指令的地址 指令寄存器(IR):用来存放当前正在执行的指令 指令译码器(ID):对指令进行“翻译”,确定指令执行什么操作,以决定操作的性质和方法。 控制电路:根据指令译码器的分析,发出控制信号,完成该指令的所有操作。
详细分析CPU取指的流程:
指令的地址保存在程序计数器(PC)中,取指过程中,不需要使用ALU,要想把指令从内存单元中取出来,先要知道指令的地址,即需要从PC中取出指令地址。PC先把指令地址传输到MAR
(存储器地址寄存器),通过MAR
把信号送到地址总线,最后送到存储器。这时存储器已经得到系统将要执行的指令地址。
然后由控制单元CU
向存储器发出读命令,读出的数据由存储器通过数据总线送到MDR
,再由MDR
送到IR
(指令寄存器)中。这时程序计数器PC自动加一,从而确定了下一条指令的地址。
运算器
运算器,又叫算术逻辑单元(ALU
, Arithmetic Logic Unit)
针对每一种算术运算,都必须有一个相对应的基本硬件配置,其核心部件是加法器和寄存器。
算术逻辑单元的功能:
- 执行所有的算术运算
- 执行所有的逻辑运算,并进行逻辑测试。如零值测试或两个数的比较。
寄存器
寄存器是用来暂时保存运算和控制过程中的原始数据、中间结果、最终结果以及控制、状态信息的。CPU的寄存器被分为:用户可见寄存器、控制和状态寄存器。
用户可见寄存器:
- 通用寄存器:存放原始数据和运算结果,可以作为某种寻址方式所需的专用寄存器。当算术逻辑单元
ALU
执行算数或逻辑运算时,通用寄存器为ALU提供一个工作区。现代计算机中,为了减少CPU访问存储器的次数,提高运算速度,往往设置大量的寄存器。通用寄存器一般由CPU直接访问,CPU对寄存器的访问速度远大于访问主存的速度。 - 数据寄存器:存放操作数、运算结果和运算的中间结果,以减少访问存储器的次数,或者存放从存储器读取的数据以及写入存储器的数据的寄存器。寄存了将要写入到计算机主存储器(例如:
RAM
)的数据,或由计算机主存储器读取后的数据。它就像缓冲器,持有从内存复制的数据,以准备给处理器使用。 - 地址寄存器:用来保存当前CPU访问的内存单元的地址。由于在内存和CPU之间存在着操作速度上的差别,所以必须使用地址寄存器来保持地址信息,直到内存的读/写操作完成为止。
- 条件码寄存器:存放条件码(条件码:体现当前指令执行结构的各种状态信息,如有无进位(CF位)、有无溢出(OV位)、结果正负(SF位)、结果是否为零(ZF位)、奇偶标志位(P位)等),可作程序分支的依据。
控制和状态寄存器:
- 控制寄存器:控制寄存器(CR0 ~ CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性。
- 状态寄存器:存放条件码
- PSW寄存器:保存由算术指令和逻辑指令运算或测试结果建立的各种条形码;保存中断和系统工作状态等信息。
多核和单核,多线程与单线程
**控制单元是整个CPU的指挥控制中心,**包括指令寄存器IR
(Instruction Register)、指令译码器ID
(Instruction Decoder)和操作控制器OC
(Operation Controller)、时序发生器和程序计数器等部件,对协调整个电脑有序工作极为重要。
**运算单元是核心组成部分,**其包括执行算术运算和逻辑运算。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。
存储单元包括CPU片内缓存和寄存器组,是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时间短。
通常,**控制单元和运算单元统称为一个核Core,换言之,单核是指CPU中包括一个控制单元和一个运算单元。**那么对于多核CPU而言,就是由多个核组成(多个控制单元和多个运算单元),共用存储单元。如下图多核CPU架构图。
从上图可以发现CPU在将指令告诉DMA的时候就处于空闲状态了。
如果磁盘IO读取的数据比较大,则会长时间停留在第三步中。
那么CPU空闲下来的时间,为啥我们不好好利用起来呢?
因此就出现了多线程,当一个任务被执行到第三步,磁盘将内容 加载到内存中的时候执行时间巨长,CPU则空闲,那么我们就切换线程,让它执行其他的任务,整体就提高了任务完成的效率。
- 并发性:多线程允许应用程序同时执行多个任务。即使在单核CPU上,操作系统可以使用时间分片来切换不同线程的执行,从而实现并发性。这对于某些任务并行性不高,但需要同时处理多个任务的情况仍然有用。
- IO密集型任务:在进行大龄IO操作(如文件读写、网络请求、数据库查询)时,多线程可以提高应用程序的效率。当一个线程在等待IO完成时,CPU可以切换到另一个线程,以充分利用CPU时间。
- 异步编程:多线程可以用于异步编程,以提高应用程序的响应性。例如,在图形用户界面(GUI)应用程序中,一个线程可以负责用户界面的渲染,而另一个线程可以处理用户输入或后台任务。
- 任务分解:多线程可以用于将大型任务分解成更小的子任务,以便并行执行这些子任务。这可以提高某些计算密集型任务的性能。
- 多核CPU迁移:如果应用程序已经使用多线程,将来可以更容易地迁移到多核CPU环境中。这样,即使只有一个核心可用,应用程序也能够更好地利用多核CPU的性能。
虽然在单核CPU上无法实现真正的并行计算,但多线程仍然可以提供一定程度的并发性和任务切换,从而改善应用程序的性能和响应性。
多核CPU的话旧可以在多个CPU中同时执行。
线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。
什么时候用多线程
什么时候该用多线程?这要分四种情况讨论:
- 多核CPU——计算密集型任务。此时要尽量使用多线程,可以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据),否则只能使一个核心满载,而其他核心闲置。
- 单核CPU——计算密集型任务。此时的任务已经把CPU资源100%消耗了,就没必要也不可能使用多线程来提高计算效率了;相反,如果要做人机交互,最好还是要用多线程,避免用户没法对计算机进行操作。
- 单核CPU——IO密集型任务。使用多线程还是为了人机交互方便。
- 多核CPU——IO密集型任务,这就更不用说了,跟单核时候原因一样。