03_012slab块分配器,管理内核内存分配,管理高速缓存

news2024/10/6 2:28:33

物理背景

为什么会有缓存cache
在最初开发ARM架构时,处理器的时钟速度和内存的访问速度大致相同。今天的处理器内核要复杂得多,其时钟速度可以快上几个数量级。但是,外部总线和内存设备的频率并没有扩大到同样的程度。有可能实现小块的片上SRAM,它可以以与内核相同的速度运行,但是与标准的DRAM块相比,这种RAM非常昂贵,因为后者的容量可以达到数千倍。在许多基于ARM处理器的系统中,访问外部存储器需要几十甚至几百个内核周期。
缓存在哪里
缓存是位于核心和主内存之间的一个小型快速内存块。
它存储了主存储器中资料的副本。对高速缓冲存储器的访问比对主存储器的访问快得多。每当内核读取或写入一个特定的地址时,它首先在高速缓存中寻找。如果它在高速缓存中找到该地址,它就会使用高速缓存中的数据,而不是对主内存进行访问。这大大增加了系统的性能,因为它减少了缓慢的外部存储器访问时间的影响。
在这里插入图片描述
cpu集群和缓存l1 l2 l3的关系
实现ARMv8-A架构的处理器通常有两级或更多的高速缓存。这通常意味着处理器的每个内核都有小的L1指令缓存和数据缓存。Cortex-A53和Cortex-A57处理器通常采用两级或多级缓存,即一个小的L1指令和数据缓存和一个较大的、统一的L2缓存,该缓存在集群的多个内核之间共享。此外,还可以有一个外部L3高速缓存作为外部硬件块,在集群之间共享。
cache为啥能加速
向高速缓存提供数据的初始访问并不比正常速度快。对缓存值的任何后续访问才会更快,而性能的提高正是来自于此。核心硬件会检查缓存中所有的指令获取和数据读取或写入,尽管你必须将内存的某些部分,例如包含外围设备的部分,标记为不可缓存的。因为高速缓存只容纳了主内存的一个子集,所以你需要一种方法来快速确定你要找的地址是否在高速缓存中。

slab kem_cache cache 等名词扫盲

struct slab 结构体

为每种对象类型创建一个内存缓存,每个内存缓存由多个大块组成,一个大块是一个或者多个连续的物理页,每个大块包含多个对象。slab采用面向对象的思想,基于对象类型管理内存,每种对象被划分成一个类。比如进程描述符(task_struct)是一个类,每个进程描述符的实现是一个对象。
在这里插入图片描述

struct kmem_cache

从上面的图能看出
kmem_ cache是用于管理slab的高速缓存结构体。在一个kmem_ cache中,slab对象大小是相同的,也就是说,每个对象占用的空间大小都是固定的。 kmem cache 用来分配和管理或销毁 slab

struct kmem_cache_node

上面的结构体用来维护相同的slab 这个结构体用来存储所有的slab 给L1缓存使用
每个物理ram节点 都用一个kmem_cache_node进行描述
kmem_ cache_ node结构体中存储了三个列表: full partial 和empty列表。
这三个列表分别表了该节点上的满的slab、部分满的slab和空的slab。

Slab分配器

SLAB分配器的实现基于三个列表: full list、partial list和empty list。
当应用程序请求分配内存时,SLAB分配器首先在partial list中查找是否存在适合大小的内存块。
如果找到,则该内存块被分配并从partial list中移除。如果partial list中没有适合的内存块,
则SLAB分配器会从empty list中获取一块内存,并将其划分为多个大小相同的块。
其中一块被分配给请求方,并剩余的块被放入partial list中。
当释放内存时,被释放的内存块将被放回partial list中。
如果partial list已满,则会将其中的一-些块移动到full list中,以供下次分配使用。
在full list中的块只能被释放到empty list中,以便它们可以被重新划分为多个小块以供下次使用。
SLAB分配器的优点在于它可以提高内存分配和释放的速度,
因为它维护了partial list和emptylist,可以避免在每次分配和释放内存时进行重复的内存管理操作。
此外,SLAB分配器还可以避免内存碎片的产生,因为它只分配特定大小的内存块,不需要在内存池中寻找适合大小的碎片。

kmem_ cache

kmem cache是用于管理slab的高速缓存结构体。
slab是一 种内存分配机制,用于管理相同大小的对象。
在一个kmem_ cache中,slab对象大小是相同的,也就是说,每个对象占用的空间大小都是固定的。
kmem_ cache结构体包含了slab的相关参数,如每个slab中包含的对象数量、slab的页数、
每个对象的大小等。kmem_ cache还负责分配和管理slab内存,以及初始化和销毁slab。
每个kmem_ cache实例都维护着一组slab, 它们具有相同的大小和缓存属性。
因此,kmem. cache和slab是相互关联的,kmem_ cache用于管理和操作slab,而slab是由
kmem_cache创建和维护的。
在内核中,kmem_ cache和slab是 紧密结合的,它们一起实现了内核的内存管理功能。
在内核中,kmem_ cache并不是与zone一一对应的, 而是可以被多个zone共享。
当一个zone需要管理一种大小相同的对象时,它可以通过访问已经存在的kmem_ cache, 或者创建一个新的
kmem_ cache来管理这些对象。这样可以避免在不同的zone中重复创建相同的kmem_ cache, 节省内存开销。

kmem cache node

kmem_ cache_ node是一个用于节点的结构体,它的作用是维护不同节点的缓存空间的信息。
一个节点表示的是在NUMA系统中的一个节点,通常对应着一组处理器和一 些内存。
由于每个节点都可能有不同的内存资源,因此为每个节点单独维护缓存空间的信息可以提高内存分配的效率。
kmem_ cache_ node结构体中存储了三个列表: full、 partial 和empty列表。
这三个列表分别表了该节点上的满的slab、部分满的slab和空的slab。
每个节点都有一个kmem cache_ node结构体,
其中kmem_ cache以及每个slab中都包含一个指向所属节点的kmem_ cache_node的指针。
这样,通过遍历kmem_ cache_ node中的三个链表,可以高效地找到一个可以使用的slab进行内存分配。
该结构保存了Slab的三个链表,并基于结构对Slab对象进行管理。

kmlloc

kmalloc实际上调用的是slab_ alloc申请内存,所以kmalloc实际上分配小内存。下面是kmallic实
际上调用分配内存的 do kmalloc函数完成的工作:
1.检查要分配的内存大小是否超过了kmalloc所管理的内存池的最大值,如果超过了则返回
NULL。
2.调用kmalloc_slab函数获取对应大小的kmem_ cache结构体,如果获取失败则返回错误。
3.调用slab_ alloc函数从获取到的kmem cache对象中分配一块大小为size的内存, 如果分配失败
则返回错误。
4.调用kasan kmalloc函数给刚刚分配的内存打上KASAN标记,用于检测内存访问越界等问题。
5.调用trace
kmalloc函数记录分配内存的相关信息,用于跟踪和分析内存分配情况。
6.返回分配的内存指针。

总结

伙伴系统的实现是为了减少物理内存碎片化,每个zone通过自己的伙伴系统减少内存碎片。slab
分配器使得内存重复利用,减少物理内存的分配和释放。即通过slab分配器减少了物理内存的碎片
化。在Linux中除了slab分配还有slub、slob分配器。 他们都是通过缓存对象,来减少实际内存的
分配和释放。在linux中通过伙伴系统管理大内存,slab管理小内存。Linux通过这套体系减少了物
理内存的碎片化。

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

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

相关文章

Object Map 的相互转换

学生业务对象定义&#xff1a;Student Student student new Student(); student.setId(1L); student.setName("令狐冲") student.setAge(10) 第一种&#xff1a;通过Alibaba Fastjson实现 pom.xml 文件依赖 <dependency><groupId>com.alibaba</g…

js-7:javascript原型、原型链及其特点

1、原型 JavaScript常被描述为一种基于原型的语言-每个对象拥有一个原型对象。 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个名字…

【使用内网穿透从公网对本地内网Web服务器访问】

公网访问本地内网web服务器【内网穿透】 文章目录 公网访问本地内网web服务器【内网穿透】前言1. 首先安装PHPStudy2.下载一个开源的网页文件3. 选择“创建网站”并将网页内容指向下载好的开源网页文件4. 打开本地网页5. 打开本地cpolar客户端6. 保存隧道设置 生成数据隧道 前言…

小模型赋能大电网,手机拍照来建档

电能计量箱&#xff0c;一个听上去陌生&#xff0c;看到却一定觉得熟悉的东西。 作为电力系统中的关键组成部分&#xff0c;电能计量箱被广泛安装在各类生产生活区域&#xff0c;保护其内部的电能表、互感器等计量装置的安全&#xff0c;是保障电力系统稳定运行的重要设施。随…

MATLAB(R2023a)添加工具箱TooLbox的方法-以GPOPS为例

一、找到工具箱存放位置 首先我们需要找到工具箱的存放位置&#xff0c;点击这个设置路径可以看到 我们的matlab工具箱的存放位置 C:\Program Files\MATLAB\R2023a\toolbox\matlab 从资源管理器中打开这个位置&#xff0c;可以看到里面各种工具箱 二、放入工具箱 解压我们…

ZABBIX 6.4配置企业微信告警

配置企业微信告警 1、将这2个微信配置文件复制到 /usr/local/share/zabbix/alertscripts zabbix6.4企业微信告警脚本文件&#xff1a;wechat.py zabbix6.4企业微信告警脚本文件&#xff1a;zabbix_wechat_config.json 2、修改文件权限 cd /usr/local/share/zabbix/alertscr…

C语言 — 动态内存管理(动态内存函数)

前言 本期分为三篇介绍动态内存管理相关内容&#xff0c;关注博主了解更多 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 本期介绍动态内存函数&#xff0c;函数如何使用、函数格式、在使用在所需要的注意点及C/C程序的内存开辟区域 系列文章 第一篇&#xff…

node.js安装

下载 https://nodejs.org/en 安装 D:\Program Files\nodejs 配置 D:\Program Files\nodejs 目录下新建 node_cache 和 node_global 在cmd管理员身份运行&#xff1a; npm config set prefix "D:\Program Files\nodejs\node_global" npm config set cache &qu…

Qt中ffmpeg API存储和显示摄像头视频

Qt中ffmpeg API存储和显示摄像头视频的功能需要之前写的视频ffmpegAPI的视频播放的流程。 代码源码位置&#xff1a;https://download.csdn.net/download/qq_43812868/88157743?spm1001.2014.3001.5503 一、存储和显示摄像头的视频的流程 这是读取打开视频文件的流程&#x…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(36)-掌握Fiddler中FiddlerScript用法你会有多牛逼-上

1.简介 Fiddler是一款强大的HTTP抓包工具&#xff0c;它能记录所有客户端和服务器的http和https请求&#xff0c;允许你监视&#xff0c;设置断点&#xff0c;甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说&#xff0c;都有很大的帮助。Fiddler提供的功能基本上能…

windows环境下如何更改pip安装的默认位置

1.查看配置信息 python -m site2.查看配置文件位置 python -m site -help3.修改配置文件 USER_SITE "D:\\soft\\Anaconda\\Lib\\site-packages" USER_BASE "D:\\soft\\Anaconda\\Scripts"如果遇到文件无法保存情况&#xff0c;请给用户增加权限。 4.…

STM32F103ZET6最小系统原理图及pcb文件

资料下载地址&#xff1a;STM32F103ZET6最小系统原理图及pcb文件 一、原理图 二、PCB

401 · 排序矩阵中的从小到大第k个数

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a; 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param matrix: a matrix of intege…

Ctfshow web入门 XXE 模板注入篇 web373-web378 详细题解 全

CTFshow XXE web373 学习资料&#xff1a; &#xff08;梭哈~&#xff09; https://www.cnblogs.com/20175211lyz/p/11413335.html https://www.cnblogs.com/zhaijiahui/p/9147595.html https://www.cnblogs.com/r00tuser/p/7255939.html https://mp.weixin.qq.com/s?__bizMz…

51单片机程序烧录教程

STC烧录步骤 &#xff08;1&#xff09;STC单片机烧录方式采用串口进行烧录程序&#xff0c;连接的方式如下图&#xff1a; &#xff08;2&#xff09;所以需要先确保USB转串口驱动是识别到&#xff0c;且驱动运行正常&#xff1b;是否可通过电脑的设备管理器查看驱动是否正常…

linux安装redis带图详细

如何在Linux系统中卸载Redis 一、使用apt-get卸载Redis sudo apt-get purge redis-server如果使用apt-get安装Redis&#xff0c;可以使用apt-get purge命令完全卸载Redis。其中&#xff0c;purge命令会不仅仅删除Redis二进制文件&#xff0c;还会删除配置文件、数据文件和日志…

数据结构刷题训练——链表篇(二)

目录 前言 1.题目一&#xff1a;链表分割 1.1 思路 1.2 分析 1.3 题解 2. 题目二&#xff1a;相交链表 2.1 思路 2.2 分析 2.3 题解 3. 题目三&#xff1a;环形链表 3.1 思路 3.2 分析 3.3 题解 总结 前言 本期继续分享链表相关的OJ题目&#xff0c;在这个专栏博客…

EtherCAT转EtherCAT网关FX5U有EtherCAT功能吗两个ETHERCAT设备互联

1.1 产品功能 捷米JM-ECT-ECT是自主研发的一款ETHERCAT从站功能的通讯网关。该产品主要功能是将2个ETHERCAT网络连接起来。 本网关连接到ETHERCAT总线中做为从站使用。 1.2 技术参数 1.2.1 捷米JM-ECT-ECT技术参数 ● 网关做为ETHERCAT网络的从站&#xff0c;可以连接倍福、…

小研究 - Mysql快速全同步复制技术的设计和应用(一)

Mysql半同步复制技术在高性能的数据管理中被广泛采用&#xff0c;但它在可靠性方面却存在不足.本文对半同步复制技术进行优化&#xff0c;提出了一种快速全同步复制技术&#xff0c;通过对半同步数据复制过程中的事务流程设置、线程资源合理应用、批量日志应用等技术手段&#…

span标签添加什么属性可以在鼠标移入后有一个提示文字类似于图片的alt

span标签添加什么属性可以在鼠标移入后有一个提示文字 类似于图片的alt 我们给span标签设置了不换行&#xff0c;超出后显示省略号&#xff0c;但是默认鼠标移入是不会有完整的文字的提示的&#xff0c;可以给span标签添加一个title属性就搞定了&#xff01; 效果图 html代码&a…