cpu 多级缓存L1、L2、L3 与主存关系

news2025/3/13 21:43:49

现代 CPU 的多级缓存(L1、L2、L3)和主存(DRAM)构成了一个层次化的内存系统,旨在通过减少内存访问延迟和提高数据访问速度来优化计算性能。以下是对多级缓存和主存的详细解析:


1. 缓存层次结构

现代 CPU 通常采用三级缓存结构:L1、L2 和 L3。每一级缓存的容量、速度和访问延迟都不同,形成了一个从快到慢、从小到大的层次结构。

L1 缓存(一级缓存)
  • 位置:最接近 CPU 核心,通常每个核心独享。

  • 容量:最小,通常为 32KB 到 64KB(分为 L1 指令缓存和 L1 数据缓存)。

  • 速度:最快,访问延迟通常为 1-3 个时钟周期。

  • 作用:存储 CPU 核心最频繁使用的指令和数据,提供最快的访问速度。

L2 缓存(二级缓存)
  • 位置:位于 L1 缓存和 L3 缓存之间,通常每个核心独享或共享。

  • 容量:中等,通常为 256KB 到 1MB。

  • 速度:比 L1 慢,访问延迟通常为 10-20 个时钟周期。

  • 作用:作为 L1 缓存的补充,存储更多的指令和数据,减少对 L3 缓存的访问。

L3 缓存(三级缓存)
  • 位置:位于 L2 缓存和主存之间,通常由多个核心共享。

  • 容量:最大,通常为几 MB 到几十 MB。

  • 速度:比 L2 慢,访问延迟通常为 30-50 个时钟周期。

  • 作用:作为 L2 缓存的补充,存储更多的数据,减少对主存的访问。

主存(DRAM)
  • 位置:位于缓存层次结构的最外层,通过内存控制器与 CPU 通信。

  • 容量:最大,通常为几 GB 到几百 GB。

  • 速度:最慢,访问延迟通常为 100-300 个时钟周期。

  • 作用:存储所有运行程序的数据和指令,是 CPU 访问的最终数据源。

  •         图示如下:

2. 缓存的工作原理

缓存的核心思想是利用局部性原理(Locality Principle),包括时间局部性和空间局部性:

  • 时间局部性:如果一个数据被访问,那么它很可能在不久的将来再次被访问。

  • 空间局部性:如果一个数据被访问,那么它附近的数据也可能被访问。

缓存通过以下机制工作:

  • 缓存行(Cache Line):缓存以缓存行为单位存储数据,通常为 64 字节。当 CPU 访问一个数据时,整个缓存行会被加载到缓存中。

  • 缓存命中(Cache Hit):如果 CPU 需要的数据在缓存中,则直接从缓存中读取,速度极快。

  • 缓存未命中(Cache Miss):如果数据不在缓存中,则需要从下一级缓存或主存中加载,导致较高的延迟。


3. 缓存一致性(Cache Coherence)

在多核 CPU 中,每个核心都有自己的 L1 和 L2 缓存,而 L3 缓存通常是共享的。为了确保多个核心访问同一数据时的一致性,CPU 使用缓存一致性协议(如 MESI 协议)来管理缓存数据的状态:

  • MESI 协议:缓存行可以处于以下四种状态:

    • Modified(M):缓存行已被修改,与主存不一致。

    • Exclusive(E):缓存行未被修改,且只存在于当前缓存中。

    • Shared(S):缓存行未被修改,且可能存在于多个缓存中。

    • Invalid(I):缓存行无效,不能使用。

通过缓存一致性协议,CPU 可以确保多个核心对同一数据的访问是正确且一致的。


4. 缓存对性能的影响

缓存的设计和性能对 CPU 的整体性能有重大影响:

  • 缓存命中率:缓存命中率越高,CPU 访问内存的延迟越低,性能越好。

  • 缓存未命中惩罚:缓存未命中会导致 CPU 等待数据从下一级缓存或主存中加载,增加了延迟。

  • 伪共享(False Sharing):当多个核心频繁修改同一缓存行中的不同数据时,会导致缓存行在不同核心之间频繁无效化,降低性能。


5. 缓存与主存的对比

特性L1 缓存L2 缓存L3 缓存主存(DRAM)
容量32KB - 64KB256KB - 1MB几 MB - 几十 MB几 GB - 几百 GB
速度最快(1-3 周期)较快(10-20 周期)较慢(30-50 周期)最慢(100-300 周期)
位置每个核心独享每个核心独享或共享多个核心共享所有核心共享
作用存储最频繁使用的数据补充 L1 缓存补充 L2 缓存存储所有数据

6. 优化缓存使用的策略

为了充分利用多级缓存,程序设计和内存分配可以采取以下策略:

  • 局部性分配:将相关的数据分配在相邻的内存区域中,提高缓存命中率。

  • 减少伪共享:通过填充或对齐数据,避免多个核心频繁修改同一缓存行。

  • 数据预取:通过预取技术提前将数据加载到缓存中,减少缓存未命中。

  • 缓存友好的算法:设计算法时考虑缓存行的大小和访问模式,减少缓存未命中。


总结

多级缓存(L1、L2、L3)和主存构成了现代 CPU 的内存层次结构,通过减少内存访问延迟和提高数据访问速度来优化性能。缓存的设计和性能对 CPU 的整体性能有重大影响,程序设计和内存分配可以通过优化缓存使用来进一步提升性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python+SQLite实现校园信息化统计平台

一、项目基本情况 概述 本项目以清华大学为预期用户,作为校内信息化统计平台进行服务,建立网页端和移动端校内信息化统计平台,基于Project_1的需求实现。 本项目能够满足校内学生团体的几类统计需求,如活动报名、实验室招募、多…

[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现

标题:[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点:二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…

vue组件库el-menu导航菜单设置index,地址不会变更的问题

请先确认 1.路由已配置好 route-index.js如下, 2.view-ProHome.vue中已预留路由展示位 3.导航菜单复制组件库,并做修改 其中index与路由配置的地址一致 运行后发现点击菜单,url地址还是不变,查看组件库 Element - The worlds …

MySQL 优化方案

一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器,再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作,包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器:管理…

智能对话小程序功能优化day1-登录鉴权

目录 1.数据库表构建。 2.完善登录相关的实例对象。 3.登录相关功能实现。 4.小程序效果。 最近尝试下trae加入claude3.7后的读图生成代码功能,可以看到简单的页面一次性生成确实准确率高了不少,想起来之前笔记中开发的智能问答小程序功能还是有些简…

MinIO的预签名直传机制

我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力…

Qt开源控件库(qt-material-widgets)的编译及使用

项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址:qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图: 直接使用Qt Crea…

用python批量生成文件夹

问题描述 当批量生成文件夹时,手动右键创建文件夹是一个繁琐的过程,尤其是文件夹的命名过程。假设从3月10日到3月19日,每天要为某个日常工作创建一个名为2025031x的文件夹,手动创建文件夹并命名费时费力。 百度给出了以下四种方法…

【MySQL】基本操作 —— DDL

目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…

游戏引擎学习第152天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾昨天的内容 这个节目展示了我们如何从零开始制作一款完整的游戏。我们不使用任何游戏引擎或库,而是从头开始创建一款游戏,整个开发过程都会呈现给大家。你将能够看到每一行代码的编写,了解…

考研数学非数竞赛复习之Stolz定理求解数列极限

在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…

故障诊断——neo4j入门

文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客:https://www.cnblogs.com/nhdlb/p/18703804,使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…

【JavaWeb】快速入门——HTMLCSS

文章目录 一、 HTML简介1、HTML概念2、HTML文件结构3、可视化网页结构 二、 HTML标签语法1、标题标签2、段落标签3、超链接4、换行5、无序列表6、路径7、图片8、块1 盒子模型2 布局标签 三、 使用HTML表格展示数据1、定义表格2、合并单元格横向合并纵向合并 四、 使用HTML表单收…

若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值

目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的,但由于业务需求,我需要新添加一个age字段: 修改SysUser类 添加age字段后,要在SysUser类 …

前端监测窗口尺寸和元素尺寸变化的方法

前端监测窗口尺寸变化和元素尺寸变化的方法 window.resize 简介 window.resize事件是浏览器提供的一种事件,用于监听窗口大小的改变。这意味着当用户调整浏览器窗口大小时,相关的JavaScript代码将被触发执行。这为开发者提供了一种机制,可…

ubuntu 部署deepseek

更新 apt update 升级 apt upgrade 格式化硬盘 mkfs.ext4 /dev/sdb 安装nginx 查看端口 一、安装Ollama Ollama是一个开源的大型语言模型(LLM)推理服务器,为用户提供了灵活、安全和高性能的语言模型推理解决方案。 ollama/docs/linux.m…

MySQL库和表的操作详解:从创建库到表的管理全面指南

目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…

PyTorch 系列教程:使用CNN实现图像分类

图像分类是计算机视觉领域的一项基本任务,也是深度学习技术的一个常见应用。近年来,卷积神经网络(cnn)和PyTorch库的结合由于其易用性和鲁棒性已经成为执行图像分类的流行选择。 理解卷积神经网络(cnn) 卷…

Java 大视界 -- Java 大数据中的数据可视化大屏设计与开发实战(127)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例

在不同分辨率的屏幕下,UI元素按照自身像素大小,会发生位置与比例的变化,本文仅利用锚点(Anchors)使用,来实现UI元素,固定在某个比例距离的屏幕边缘。 首先,将元素的锚点设置为中心&…