内存与缓存:保姆级图文详解

server/2025/1/18 5:44:22/

文章目录

  • 前言
  • 1、计算机存储设备
    • 1.1、硬盘、内存、缓存
    • 1.2、金字塔结构
    • 1.3、数据流通过程
  • 2、数据结构内存效率
  • 3、数据结构缓存效率

前言

亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的动力,谢谢大家!有问题请私信或联系邮箱:fn_kobe@163.com

物理结构在很大程度上决定程序对内存和缓存使用效率,进而影响算法程序整体性能

1、计算机存储设备

1.1、硬盘、内存、缓存

硬盘用于长期存储大量数据,内存用于临时存储程序运行中正在处理数据,而缓存则用于存储经常访问数据和指令,以提高程序运行效率。三者共同协作,确保计算机系统高效运行。
在这里插入图片描述

1.2、金字塔结构

越靠近金字塔顶端的存储设备的速度越快、容量越小、成本越高

①硬盘难以被内存取代
内存中的数据在断电后会丢失,不适合长期存储数据;内存的成本是硬盘的几十倍,消费者市场难以普及。
缓存的大容量和高速度难以兼得
随着 L1、L2、L3 缓存容量逐步增大,其物理尺寸会变大,与 CPU 核心之间物理距离会变远,从而导致数据传输时间增加,元素访问延迟变高。
在这里插入图片描述

1.3、数据流通过程

①过程:在程序运行时,数据会从硬盘中被读取到内存中,供CPU计算使用。缓存可以看作 CPU 的一部分,它通过智能地从内存加载数据,给 CPU 提供高速数据读取,从而显著提升程序执行效率,减少对较慢内存的依赖
在这里插入图片描述

2、数据结构内存效率

在内存空间利用方面,数组和链表各自具有优势和局限性
①内存有限,且同一块内存不能被多个程序共享:数据结构能够尽可能高效地利用空间。数组的元素紧密排列,不需要额外的空间来存储链表节点间的引用(指针),因此空间效率更高。然而,数组需要一次性分配足够连续内存空间,导致内存浪费,数组扩容也需要额外的时间和空间成本。相比之下,链表以“节点”为单位进行动态内存分配和回收,提供更大灵活性
②反复申请与释放内存,空闲内存的碎片化程度会越来越高:导致内存的利用效率降低。数组其连续存储方式,相对不容易导致内存碎片化。相反,链表元素分散存储,在频繁插入与删除操作中,更容易导致内存碎片化

3、数据结构缓存效率

①对比缓存空间容量上远小于内存,但比内存快。缓存容量有限,只能存储一小部分频繁访问数据,当 CPU 尝试访问数据不在缓存中,发生缓存未命中,CPU 从速度较慢的内存中加载所需数据

缓存效率“:缓存未命中”越少,CPU 读写数据的效率就越高,程序性能也就越好

缓存采取数据加载机制
i:缓存缓存缓存行为单位。相比于单个字节的传输,缓存行传输形式更加高效
ii:预取机制:处理器会尝试预测数据访问模式(例如顺序访问、固定步长跳跃访问等),并根据特定模式将数据加载至缓存之中,从而提升命中率。
iii:空间局部性:一个数据被访问,附近数据近期也会被访问
iv:时间局部性:一个数据被访问,不久将来可能再次被访问。

Ps:
①做算法题倾向于选择基于数组实现的栈,提供更高操作效率和随机访问能力,代价仅是需要预先为数组分配一定内存空间。
②如果数据量非常大、动态性很高、栈的预期大小难以估计,基于链表实现栈更加合适。链表能够将大量数据分散存储于内存不同部分,避免数组扩容产生额外开销。


http://www.ppmy.cn/server/159274.html

相关文章

pg_sql关于时间的函数

1、时间戳和日期之间的相互转换 时间戳转日期(时间戳为数值类型,若为字符型需进行转换) # 保留到秒:2025-10-02 04:46:40 (字符型转换数值型) select to_timestamp(1759351600::bigint)# 保留到日&#x…

SpringBoot开发——使用ObjectMapper处理JSON数据

文章目录 1. 基本对象到JSON的转换2. 基本JSON到对象的转换3. 使用注解自定义JSON字段名称4. 序列化时忽略字段5. 处理未知的JSON字段6. 将对象列表转换为JSON7. 在Spring Boot控制器中使用ObjectMapper8. 将JSON文件转换为对象9. 美化打印JSON输出10. 自定义ObjectMapper配置本…

开源AI智能名片2+1链动模式S2B2C商城小程序在ABM漏斗中的应用探索

摘要:本文旨在深入探讨开源AI智能名片21链动模式S2B2C商城小程序在目标客户营销(Account Based Marketing,ABM)漏斗中的应用,旨在揭示其如何通过智能化、数据化和社交化的方式,提升ABM的效率与效果。通过对…

Pytorch基础教程:从零实现手写数字分类

文章目录 1.Pytorch简介2.理解tensor2.1 一维矩阵2.2 二维矩阵2.3 三维矩阵 3.创建tensor3.1 你可以直接从一个Python列表或NumPy数组创建一个tensor:3.2 创建特定形状的tensor3.3 创建三维tensor3.4 使用随机数填充tensor3.5 指定tensor的数据类型 4.tensor基本运算…

Shell作业二

1、编写一个Shell脚本用于判断192.168.242.0/24网络中当前在线的IP地址,并打印出这些IP地址。 脚本: #!/bin/bash# 网络前缀 NETWORK"192.168.242"echo "正在扫描网络 $NETWORK.0/24 中的活动主机..."# 遍历主机地址 for i in {1..…

光敏传感器:精准捕捉光线变化的科技之眼

在日新月异的科技世界里,传感器作为连接物理世界与数字世界的桥梁,扮演着至关重要的角色。其中,光敏传感器以其独特的感知能力,成为了众多智能设备和系统中的核心组件。它如同一只敏锐的“科技之眼”,精准捕捉周围光线…

No.33 笔记 | Docker入门:基础概念与实用指南

Docker快速入门:基础概念与实用指南 引言:为什么学习Docker? 现代软件开发中,Docker 已成为不可或缺的工具。通过容器化技术,开发者可以快速部署、运行和管理应用。相比传统环境,Docker 以其轻量级、高效率…

Python 如何操作 PDF 文件?

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…