Ref: https://www.cnblogs.com/valjeanshaw/p/11469514.html
CPU 架构和工作原理
计算机有 5 大基本组成部分,运算器,控制器,存储器,输入和输出。运算器和控制器封装到一起,加上寄存器组和 cpu 内部总线构成中央处理器(CPU)。cpu 的根本任务,就是执行指令,对计算机来说,都是 0、1 组成的序列,cpu 从逻辑上可以划分为 3 个模块:控制单元、运算单元和存储单元。这三个部分由 cpu 总线连接起来。
CPU 的运行原理就是:控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址 (这个地址是在内存里的) 送到地址总线上去,然后 CPU 将这个地址里的指令读到指令寄存器进行译码。对于执行指令过程中所需要用到的数据,会将数据地址也送到地址总线,然后 CPU 把数据读到 CPU 的内部存储单元 (就是内部寄存器) 暂存起来,最后命令运算单元对数据进行处理加工。周而复始,一直这样执行下去。
多核 CPU 和多 CPU
架构
多个物理 CPU,CPU 通过总线进行通信,效率比较低。
多核 CPU,不同的核通过 L2 cache 进行通信,存储和外设通过总线与 CPU 通信
CPU 的缓存
CPU 缓存是位于 CPU 与内存之间的临时数据交换器,它的容量比内存小的多但是交换速度却比内存要快得多。CPU 缓存一般直接跟 CPU 芯片集成或位于主板总线互连的独立芯片上。
随着多核 CPU 的发展,CPU 缓存通常分成了三个级别:L1,L2,L3。级别越小越接近 CPU,所以速度也更快,同时也代表着容量越小。L1 是最接近 CPU 的,它容量最小(例如:32K),速度最快,每个核上都有一个 L1 缓存,L1 缓存每个核上其实有两个 L1 缓存,一个用于存数据的 L1d Cache(Data Cache),一个用于存指令的 L1i Cache(Instruction Cache)。L2 缓存 更大一些(例如:256K),速度要慢一些,一般情况下每个核上都有一个独立的 L2 缓存;L3 缓存是三级缓存中最大的一级(例如 3MB),同时也是最慢的一级,在同一个 CPU 插槽之间的核共享一个 L3 缓存。
读取数据过程。就像数据库缓存一样,首先在最快的缓存中找数据,如果缓存没有命中 (Cache miss) 则往下一级找,直到三级缓存都找不到时,向内存要数据。一次次地未命中,代表取数据消耗的时间越长。
计算过程。程序以及数据被加载到主内存;指令和数据被加载到 CPU 的高速缓;CPU 执行指令,把结果写到高速缓存;高速缓存中的数据写回主内存
进程和线程
进程:程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,
线程:CPU 调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
联系
线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
区别
理解它们的差别,从资源使用的角度出发(所谓的资源就是计算机里的中央处理器、内存、文件、网络等)
- 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
- 开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
- 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过 CPU 调度,在每个时间片中只有一个线程执行)
- 内存分配:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了 CPU 外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻量级进程。
进程和线程在多核 CPU 或多 CPU 中的运行关系
操作系统会拆分 CPU 为一段段时间的运行片,轮流分配给不同的程序。
对于多 cpu,多个进程可以并行在多个 cpu 中计算,当然也会存在进程切换;
- 对于单 cpu,多个进程在这个单 cpu 中是并发运行,根据时间片读取上下文 + 执行程序 + 保存上下文。
同一个进程同一时间段只能在一个 cpu 中运行,如果进程数小于 cpu 数,那么未使用的 cpu 将会空闲。
多线程的概念主要有两种:一种是用户态多线程;一种是内核态多线程。
对于内核态多线程(java1.2 之后用内核级线程),在操作系统内核的支持下可以在多核下并行运行;
- 对于多核 cpu,进程中的多线程并行执行。
- 对于单核 cpu,多线程在单 cpu 中并发执行,根据时间片切换线程。
同一个线程同一时间段只能在一个 cpu 内核中运行,如果线程数小于 cpu 内核数,那么将有多余的内核空闲。