- L1 Cache , 分为数据缓存和指令缓存 , 逻辑核独占
- L2 Cache , 物理核独占 , 逻辑核共享
- L3 Cache , 所有物理核共享
文章插图
存储器存储空间大小:内存>L3>L2>L1>寄存器;
存储器速度快慢排序:寄存器>L1>L2>L3>内存;
还有一点值得注意的是:缓存是由最小的存储区块-缓存行(cacheline)组成 , 缓存行大小通常为64byte 。
缓存行是什么意思呢?
比如你的L1缓存大小是512kb,而cacheline = 64byte,那么就是L1里有512 * 1024/64个cacheline
CPU读取存储器数据过程
1、CPU要取寄存器X的值 , 只需要一步:直接读取 。
2、CPU要取L1 cache的某个值 , 需要1-3步(或者更多):把cache行锁住 , 把某个数据拿来 , 解锁 , 如果没锁住就慢了 。
3、CPU要取L2 cache的某个值 , 先要到L1 cache里取 , L1当中不存在 , 在L2里 , L2开始加锁 , 加锁以后 , 把L2里的数据复制到L1 , 再执行读L1的过程 , 上面的3步 , 再解锁 。
4、CPU取L3 cache的也是一样 , 只不过先由L3复制到L2 , 从L2复制到L1 , 从L1到CPU 。
5、CPU取内存则最复杂:通知内存控制器占用总线带宽 , 通知内存加锁 , 发起内存读请求 , 等待
回应 , 回应数据保存到L3(如果没有就到L2) , 再从L3/2到L1 , 再从L1到CPU , 之后解除总线锁
定 。
CPU为何要有高速缓存
CPU在摩尔定律的指导下以每18个月翻一番的速度在发展 , 然而内存和硬盘的发展速度远远不及CPU 。这就造成了高性能能的内存和硬盘价格及其昂贵 。然而CPU的高度运算需要高速的数据 。为了解决这个问题 , CPU厂商在CPU中内置了少量的高速缓存以解决IO速度和CPU运算速度之间的不匹配问题 。在CPU访问存储设备时 , 无论是存取数据抑或存取指令 , 都趋于聚集在一片连续的区域中 , 这就被称为局部性原理 。
- 时间局部性(Temporal Locality):如果一个信息项正在被访问 , 那么在近期它很可能还会被再次访问 。比如循环、递归、方法的反复调用等 。
- 空间局部性(Spatial Locality):如果一个存储器的位置被引用 , 那么将来他附近的位置也会被引用 。比如顺序执行的代码、连续创建的两个对象、数组等 。
1. 程序以及数据被加载到主内存
2. 指令和数据被加载到CPU的高速缓存
3. CPU执行指令 , 把结果写到高速缓存
4. 高速缓存中的数据写回主内存
CPU运行安全等级
CPU有4个运行级别 , 分别为:
- ring0
- ring1
- ring2
- ring3
JVM创建线程CPU的工作过程
- step1:CPU从ring3切换ring0创建线程
- step2:创建完毕,CPU从ring0切换回ring3
- step3:线程执行JVM程序
- step4:线程执行完毕 , 销毁还得切会ring0
操作系统内存管理
执行空间保护
操作系统有用户空间与内核空间两个概念 , 目的也是为了做到程序运行安全隔离与稳定 , 以
32位操作系统4G大小的内存空间为例
文章插图
Linux为内核代码和数据结构预留了几个页框 , 这些页永远不会被转出到磁盘上 。从0x00000000 到 0xc0000000(PAGE_OFFSET) 的线性地址可由用户代码 和 内核代码进行引用(即用户空间) 。从0xc0000000(PAGE_OFFSET)到 0xFFFFFFFFF的线性地址只能由内核代码进行访问(即内核空间) 。内核代码及其数据结构都必须位于这 1 GB的地址空间中 , 但是对于此地址空间而言 , 更大的消费者是物理地址的虚拟映射 。
推荐阅读
- linux操作系统上安装docker
- 河州人的刮碗子茶,茶叶的传播云贵川为核心的西南茶乡
- 图解 K8s 核心概念和术语
- HTTP长连接是啥?底层是如何工作的?Tomcat是如何实现长连接的?
- 我国为什么要以Linux为基础开发操作系统?什么是linux
- 淘宝直播三大核心技术揭秘
- Linux操作系统:文件的逻辑组织
- 几十年前的操作系统用到现在,下一代操作系统会是什么样的?
- 什么是个人品牌的核心内涵?
- Windows危机重重,谷歌全新操作系统Fuchsia发布在即