采用内存局部性分配有什么好处?

内存分配时的局部性分配(Locality of Allocation)是指将相关的内存对象分配在相邻或相近的内存区域中。这种分配策略在现代计算机系统中具有显著的好处,主要体现在以下几个方面:


1. 提高缓存命中率

现代计算机系统依赖于多级缓存(L1、L2、L3)来加速内存访问。局部性分配可以确保相关的对象在物理内存中相邻,从而增加这些对象被加载到同一缓存行的概率。这带来了以下好处:

  • 减少缓存未命中(Cache Miss):缓存未命中会导致处理器从主存中加载数据,显著增加访问延迟。局部性分配可以减少这种情况的发生。

  • 提高缓存利用率:相邻的对象更可能被同时使用,缓存行中的数据可以被充分利用,减少缓存空间的浪费。

  • L1 ->  L2 ->  L3 ->  内存 ->  磁盘 的访问速度由高到低,图示如下:


2. 减少内存碎片

局部性分配通过将对象集中在特定的内存区域(如内存页或段)中,可以减少内存碎片的产生:

  • 内部碎片减少:由于对象被集中分配,内存页的利用率更高,减少了因分配大小不匹配导致的内存浪费。

  • 外部碎片减少:局部性分配减少了内存中分散的小块空闲区域,降低了外部碎片的发生概率。

  • 两者区别如下

  • 区别点内部碎片外部碎片
    定义已分配给进程但未被利用,存在于分配给进程的内存块内部的空闲内存系统中存在的分散、不连续的小空闲内存块,难以满足大进程内存分配需求
    产生位置进程已分配的内存空间内部已分配内存块之间的空闲内存区域
    产生原因1. 固定分区分配中,分区大小大于进程需求
    2. 页式存储中,进程最后一页不满一页
    3. 分配算法导致分配的内存块大于实际需求
    1. 动态分区分配时,进程不断创建和撤销,产生不连续的空闲分区
    2. 内存回收不及时或不合理,未合并相邻空闲块
    可利用性在所属进程释放内存前,无法被其他进程利用理论上若能合并成大的连续空间可被利用,但实际因不连续难以利用
    对系统的影响主要降低内存利用率,可能导致系统在有总空间时仍无法满足新进程需求降低内存利用率和内存分配效率,限制进程并发执行,影响系统性能
    解决方式1. 调整内存分配单位大小(如采用更小页面尺寸)
    2. 采用更灵活的分配策略,按进程实际需求分配
    1. 内存紧缩(移动已分配内存块合并空闲区)
    2. 改进内存分配和回收算法(如伙伴系统算法、最佳适应算法)

内存部碎片如图所示

外部碎片如图所示:

3. 提升访问性能

局部性分配可以优化内存访问模式,带来以下性能提升:

  • 空间局部性(Spatial Locality):相邻的对象更可能被连续访问,减少了内存访问的随机性,提高了内存带宽的利用率。

  • 时间局部性(Temporal Locality):频繁访问的对象集中在同一区域,减少了内存访问的延迟。


4. 优化多线程性能

在多线程环境中,局部性分配可以减少线程间的竞争和缓存一致性开销:

  • 减少伪共享(False Sharing):当多个线程访问同一缓存行中的不同数据时,会导致缓存行在不同核心之间频繁无效化。局部性分配可以将不同线程的数据分配到不同的缓存行中,减少伪共享。

  • 降低锁争用:通过将线程本地的对象分配在相邻区域,可以减少线程间的锁争用,提高并发性能。


5. 支持延迟释放和垃圾回收

局部性分配可以与延迟释放和垃圾回收机制结合,带来以下好处:

  • 批量释放:将相关的对象集中分配,可以在释放时批量处理,减少释放操作的频率和开销。

  • 垃圾回收效率提升:在垃圾回收过程中,局部性分配可以减少内存扫描的范围,提高回收效率。


6. 简化内存管理

局部性分配通过将对象集中在特定的内存区域中,简化了内存管理的复杂性:

  • 减少元数据开销:局部性分配可以减少内存管理数据结构(如空闲列表、位图等)的规模,降低元数据开销。

  • 提高分配速度:由于对象集中在特定区域,分配器可以更快地找到合适的内存块,减少分配时间。


7. 支持特定应用场景

局部性分配特别适合以下应用场景:

  • 函数式编程语言:函数式语言通常会产生大量短期小对象,局部性分配可以减少内存碎片和提高缓存命中率。

  • 高性能计算:在科学计算和图形处理中,局部性分配可以优化数据访问模式,提高计算效率。

  • 实时系统:局部性分配可以减少内存访问的不可预测性,满足实时系统的低延迟需求。


总结

局部性分配通过提高缓存命中率、减少内存碎片、优化访问模式、提升多线程性能、支持延迟释放和简化内存管理,显著提升了内存分配器的性能和效率。而大名鼎鼎的 mimalloc 分片空闲列表的设计,看、就充分利用了局部性分配的优势,在多种基准测试中表现优异。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fast DDS Security--秘钥交换

Fast DDS Security模块中默认使用Diffie-Hellman算法进行秘钥交换。Diffie-Hellman 算法(简称 DH 算法)是一个非常重要的加密协议,用于在不安全的通信通道中安全地交换密钥。该算法通过利用数学中的离散对数问题来生成共享密钥,使…

3.3.5 VO-O语法- 高级语法

VO语言还提供了一些个性化的高级语法特性,这些语法特性有别于传统的编程语言。但可以更好的帮助开发者实现高效、稳定的生产级数据流程。 调度运行 在现行的编程语言中,调度运行不在语法表示范围之内。这属于具体的代码实现逻辑。但在VO语言设计中&…

NLP文本分析之依存句法分析(理论及技术实践)

引言 在自然语言处理(NLP)领域中,理解句子的语法结构是实现语义理解的基础。依存句法分析(Dependency Parsing) 作为句法分析的核心任务之一,通过揭示句子中词语之间的依存关系,为机器翻译、信…

LeetCode hot 100—爬楼梯

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例…

RoboVQA:机器人多模态长范围推理

23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案,该方案可用于长期和中期的高级推理,与传统的狭窄自上而下的逐步收集相比&#xff0c…

WWDG窗口看门狗原理

WWDG(窗口看门狗)在窗口期喂狗 作用: 原理: 框图 WWDG寄存器: WWDG_CR控制寄存器 WWDG_CFR配置寄存器 状态寄存器WWDG_SR 超时时间计算公式 最小最大超时值 HAL配置函数: 1. IWDG 和 WWDG 的区别 IWDG&…

基于Flink SQL的实时指标多维分析模型

数据流程介绍 1.创建源表kafka接入消息队列数据,定义字段映射规则; 2.创建目标表es_sink配置Elasticsearch输出; 3.通过多级视图(tmp→tmp_dedup→tmp1/tmp2→tmp3→tmp_groupby)实现数据清洗、去重、状态计算&#x…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA:检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景: GAN-SR模型虽然…

UIToolkit(一)

1 前言 UI Toolkit 是一种基于 Web 技术的 GUI 框架,是为了解决 UGUI 效率问题而设计的新一代 UI 系统(UGUI 的介绍详见→UGUI概述)。与 UGUI 不同,UI Toolkit 没有采用 GameObject 的方式,而是参考了 Web 技术的 XML …

Unsloth - 微调 Phi-4 + 修复 Bug

文章目录 Phi-4 错误修复1、分词器错误修复2、微调错误修复3、聊天模板问题 💡 我们的问题修复有效吗?🦙 Llama-fication🦥 动态 4 位量化🛠️ Finetuning Phi-4性能基准测试 本文翻译自:Phi-4 Finetuning …

多视图几何--对极几何--从0-1理解对极几何

1对极几何 1.1本质矩阵 1.1.1几何约束与推导 如图所示,物体点 P P P,图像点 p 1 , p 2 p_1,p_2 p1​,p2​,相机中心 o 1 , o 2 o_1,o_2 o1​,o2​五点共面的关系称为对极几何。 o 1 , o 2 o_1,o_2 o1​,o2​连线称为基线,其与图像的交点称为…

SpringBoot3.3.0集成Knife4j4.5.0实战

原SpringBoot2.7.18升级至3.3.0之后,Knife4j进行同步升级(Spring Boot 3 只支持OpenAPI3规范),从原3.0.3(knife4j-spring-boot-starter)版本升级至4.5.0(knife4j-openapi3-jakarta-spring-boot-starter),以下是升级过程与注意事项等 版本信息…

一招解决Pytorch GPU版本安装慢的问题

Pytorch是一个流行的深度学习框架,广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力,加速模型的训练和推理过程。接下来,我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…

Linux——system V共享内存

共享内存区是最快的IPC(进程内通信)形式,不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源,然后再进行通信,所以想要通过共享内存进行通信,那么第一步一定是让两个…

初识数组

数组的大概内容(自学)上篇 数组的创建和赋值 创建: int [] name new int [5]; int name [] new int [5]; int [] name {1,2.3,4,5}; 赋值: int [] score {1,2,3}; int [] score new int [] {1,2,3}; int [] score;//声明 score new int []…

OSPF-单区域的配置

一、单区域概念: 单区域OSPF中,整个网络被视为一个区域,区域ID通常为0(骨干区域)。所有的路由器都在这个区域内交换链路状态信息。 补充知识点: OSPF为何需要loopback接口: 1.Loopback接口的…

c++介绍锁二

锁主要在两个以上的线程中使用&#xff0c;当多个线程访问共享资源时&#xff0c;我们需要使用锁&#xff0c;开保证共享资源的唯一性。 当两个线程访问不带锁的共享资源时&#xff0c;如下代码 #include<array> #include<thread> #include<iostream> usin…

Ubuntu系统部署.NET 8网站项目

一、使用XShell连接 Ubuntu系统初次连接时默认的用户名为&#xff1a;ubuntu&#xff0c;使用此用户名与系统登录密码进行连接。 登录成功效果如下图&#xff1a; 二、root用户登录 linux下有超级用户&#xff08;root&#xff09;和普通用户&#xff0c;普通用户不能直接操…

学习资料电子版 免费下载的网盘网站(非常全!)

我分享一个私人收藏的电子书免费下载的网盘网站&#xff08;学习资料为主&#xff09;&#xff1a; link3.cc/sbook123 所有资料都保存在网盘了&#xff0c;直接转存即可&#xff0c;非常的便利&#xff01; 包括了少儿&#xff0c;小学&#xff0c;初中&#xff0c;中职&am…

图形编辑器基于Paper.js教程24:图像转gcode的重构,元素翻转,旋转

前段时间在雕刻图片时&#xff0c;旋转图片&#xff0c;翻转图片后&#xff0c;发现生成准确的gcode&#xff0c;虽然尺寸对&#xff0c;但是都是以没有旋转&#xff0c;没有翻转的图片进行生成的。后来思考了一下&#xff0c;发现这真是一个大bug&#xff0c;无论图片如何选择…