咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
**🏆本文收录于「滚雪球学Java」专栏,数十年后端开发经验总结,引导 1000+ 同学入门成功就业,欢迎大家关注&订阅&收藏!一次订阅,永久免费阅读;up!up!up!!**,
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
在 ARM、RISC-V、Intel 和 AMD 等 CPU 架构中,一条存储器读写指令的执行过程虽然在具体细节上有所不同,但基本的执行流程是类似的。这里我们将讨论一条存储器读写指令的执行流程,包括从指令发出到数据完成读取或写入的全过程。
一、基本步骤
1. 指令获取(Instruction Fetch)
- CPU 从内存中获取需要执行的指令。对于读写操作,指令可能是
LOAD
(读取数据)或STORE
(写入数据)。 - CPU会通过程序计数器(PC)确定下一条指令的位置,然后从内存或缓存中获取该指令。
2. 指令译码(Instruction Decode)
- CPU 对指令进行译码,确定该指令是存储器操作指令(
LOAD
或STORE
)。 - 指令中会包括操作码(操作类型)、源寄存器、目标寄存器、内存地址等信息。
- 译码后,CPU 确定需要从哪个地址读数据或将数据写入哪个地址。
3. 地址计算(Address Calculation)
- 对于存储器读写指令,通常需要计算或解算内存地址。
- 对于
LOAD
指令,计算目标内存地址。 - 对于
STORE
指令,计算存储数据的位置。
- 对于
- 如果指令中包含立即数(如偏移量),CPU 将这些值与寄存器的值相加,形成最终的内存地址。
- 在这一步,可能会进行地址对齐的检查,确保访问的是有效的内存区域。
4. 访问缓存/内存(Memory Access)
- 缓存检查:首先检查是否存在缓存(L1、L2 或 L3 缓存),CPU 会首先尝试在缓存中查找数据(缓存命中)。
- 如果缓存命中,数据会从缓存中直接读取或写入(此时跳过内存访问)。
- 如果缓存未命中,CPU 会发起对主内存的访问。
- 内存访问:如果缓存未命中,CPU 会发出对主内存的读或写请求。此时,内存控制器会将请求发送到内存或直接通过总线与其他设备进行交互。
- 读操作会从内存读取数据并将其发送回CPU。
- 写操作会将数据从寄存器写入内存。
5. 数据处理(Data Write-back / Load Completion)
- LOAD 操作:如果是读取数据(
LOAD
指令),CPU 将从内存或缓存中获取到的数据返回到目标寄存器中。 - STORE 操作:如果是写入数据(
STORE
指令),CPU 将源寄存器的数据写入内存指定地址。
6. 指令执行完成(Instruction Completion)
- 存储器读写操作完成后,CPU 继续执行下一条指令。
二、不同架构的差异
虽然上述步骤是大致相同的,但不同的架构(ARM、RISC-V、Intel、AMD)在具体实现上有一些差异,尤其是在如何管理缓存、内存访问的时序以及处理器的流水线设计方面。
1. ARM
- ARM 处理器在处理内存访问时,使用了多级缓存,并且其架构支持指令的乱序执行(out-of-order execution)。
- ARM 采用的是负载/存储(Load/Store)架构,这意味着只有寄存器和内存之间可以进行数据交换,而不直接允许内存对内存的操作。
2. RISC-V
- RISC-V 是一种开源指令集架构,设计上遵循简洁的哲学。它的内存访问指令(如
LW
、SW
)也遵循Load/Store模型,与ARM相似。 - RISC-V 中的内存访问指令相对简洁,且其流水线设计也允许更高效的指令调度。
3. Intel
- Intel 处理器(如x86架构)通常采用复杂的流水线和超标量设计,允许多个指令并行执行。在内存访问时,Intel 采用了更复杂的缓存体系(包括L1、L2、L3缓存),并且在数据访问时进行更多的预测与优化。
- Intel 处理器还具有强大的乱序执行和指令重排机制,缓存一致性协议(如MESI)也与内存访问密切相关。
4. AMD
- AMD 和 Intel 基本使用类似的x86架构,但AMD的Ryzen系列处理器采用了不同的缓存管理和核心架构设计(例如:Zen架构)。这些设计对存储器访问的性能有影响,例如缓存一致性和数据传输优化。
- 现代AMD处理器也会采用高效的缓存一致性协议和多级缓存,确保存储器访问尽可能高效。
三、总结
尽管 ARM、RISC-V、Intel 和 AMD 架构在内部实现细节上有所不同,但它们的存储器读写指令执行过程都遵循一个大致相同的流程:指令获取 → 译码 → 地址计算 → 缓存/内存访问 → 数据处理 → 完成执行。各架构在执行这些步骤时,可能采用不同的缓存策略、流水线设计和乱序执行等技术,以提升性能和效率。
...
好啦,这期的内容就基本接近尾声啦,若你想学习更多,可以参考这篇专栏总结《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。
🌴附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
✨️ Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。