首页 > 其他分享 >slab分配器

slab分配器

时间:2024-09-28 13:33:39浏览次数:1  
标签:object cache 64 分配器 line slab 分配

主要参考这本书:《Understanding the Linux virtual memory manager》,链接:https://www.eecg.utoronto.ca/~yuan/teaching/archive/ece344_2017w/linux-vmm.pdf,书上的Chapter 9就是讲slab分配器的。

注意这本书是2004的,很多参数可能已经过时了,这个博客会结合我自己的电脑硬件配置来讲。

层次结构

每个cache负责一种数据类型的分配。系统中所有的cache首尾相连构成一个cache chain

每个cache中拥有一些slab。每个slab由连续的一或多页构成。在这些slab里的某个位置开始划分槽,然后object就在这些槽里分配。

每个cache里维护slabs_fullslabs_partialslabs_free,分别代表槽已经全部被分配、槽部分被分配、槽没有被分配的slab。

着色

书上的第112页,9.1.5节就是将cache coloring的。

假如slab要分配的object比较大,那么slab里就有一些空间是没法分配的,那么就可以把每个slab里的object的起始分配点偏移不同数量的cache line长度,每种偏移称为一个color,这样不同color的object在映射到cache里时就会错开。假如object之间有padding,或者object内部有padding,那么这些padding可能跟其他color的object的非padding部分映射到组相联CPU cache里的同一组cache line里,这样这组cache line就能非padding部分被用上了。而且如果object里有hot data,那么这些hot data也会错开,从而映射到不同组的cache line。

比方说假如一个slab是4096字节,一个object是5*64=320字节,那么slab里就有4096 % 320 = 256字节是无法被分配的。假如一个cache line是64字节,然后要创建多个slab,那么就可以将第一个slab的object起始分配位置设置为0,第二个slab的设置成64,第三个slab的设置成128,第四个slab的设置成192,第五个slab的又设置成0,第六个slab的又设置成64,以此类推。假如object的结构如下:

struct A {
    char hot_data[64];
    char padding[64];
    char cold_data[64*3];
};

那么偏移量分别为0、64、128、192的object的hot_data会分别映射到四组cache line里,这样就能充分利用cache了。

此外,slab内部首尾的一小段可以错开来,从而减少冲突。详见:https://stackoverflow.com/a/57345687

还有一种着色叫页着色(page coloring),大意是将物理页根据映射到的cache line着色,然后尽量让邻近的虚拟页映射到不同颜色的物理页:https://en.wikipedia.org/wiki/Cache_coloring

free list

slab里的free list是一个链表实现的栈,这样可以使得更晚被释放的object被更早分配,因为最近被释放的object很可能还在CPU cache里。具体实现看书里的9.2.4到9.2.6节。

kmalloc, kfree

详见书上的9.4节。

kmalloc的函数定义在include/linux/slab.h里。

操作系统在全局维护了8B、16B、32B、……32MiB的slab allocator。当调用kmalloc的时候,其实就是选一个object size最小但是够用的slab allocator来分配。比如分配1到8字节都是用kmalloc-8这个slab allocator来分配,9到16字节用kmalloc-16来分配,17到32字节用kmalloc-32分配,以此类推。

kfree的函数定义在mm/slab.c里。首先调用virt_to_cache来找到对应的slab allocator,然后再在里面free掉这个object就好了。virt_to_cache的具体实现好像跟folio有关,没具体看。如果slab的尺寸确定,而且是对齐的话,那应该可以找到slab的起始位置。

参考

https://www.linuxquestions.org/questions/linux-kernel-70/how-does-slab-coloring-maximizes-the-use-of-cache-lines-or-cache-rows-907564/

标签:object,cache,64,分配器,line,slab,分配
From: https://www.cnblogs.com/searchstar/p/18437467

相关文章

  • 学懂C++(四十四):C++ 自定义内存管理的深入解析:内存池与自定义分配器
    目录1.内存池(MemoryPool)概念模型特点核心点实现适用场景经典示例实现代码解析2.自定义分配器(CustomAllocators)概念模型特点核心点实现适用场景经典示例实现代码解析高级自定义分配器示例代码解析总结        C++作为一种高性能编程语言,在......
  • SLAB:华为开源,通过线性注意力和PRepBN提升Transformer效率 | ICML 2024
    论文提出了包括渐进重参数化批归一化和简化线性注意力在内的新策略,以获取高效的Transformer架构。在训练过程中逐步将LayerNorm替换为重参数化批归一化,以实现无损准确率,同时在推理阶段利用BatchNorm的高效优势。此外,论文设计了一种简化的线性注意力机制,其在计算成本较低的情况下......
  • 【C++ STL分配器】详细介绍
    C++中的分配器(Allocator)是用于抽象和管理内存分配与释放的机制,主要用于标准模板库(STL)容器。分配器的设计允许开发者自定义内存管理策略,从而优化性能、满足特殊需求或实现特定功能(如内存池、共享内存等)。本文将详细介绍C++分配器的概念、作用、自定义分配器的实现以及......
  • 内存管理-15-slab、slob和slub分配器-初探
    一、slab简介1.简介首先,“slab”已成为一个通用名称,指的是使用对象缓存的内存分配策略,可实现内核对象的高效分配和释放。它最初由Sun工程师JeffBonwick记录下来,并在Solaris2.4内核中实现。Linux目前为其“slab”分配器提供了三种选择:Slab是最初的分配器,基于Bonwic......
  • K8S集群问题:案例一:Java调用Glibc2.28-69内存分配器无法限制虚拟内存VIRT问题
    一、问题描述1、背景:租户反馈,Apr711:22容器出现夯死现象,容器部署的单个java进程;宿主机上,top显示的容器进程virt内存持续增长32G,目前messages日志没有看到oom的记录,基本是。租户其他bc7、8系统上有添加参数MALLOC_ARENA_MAX进行限制,基本维持在16G左右,目前bcoe21.10系统配置......
  • Notes-02年Fan-2002-Analysis of guided resonances in photonic crystal slabs-BIC的
    Notes-02年Fan-2002-Analysisofguidedresonancesinphotoniccrystalslabs目录Notes-02年Fan-2002-Analysisofguidedresonancesinphotoniccrystalslabs共振的含义就是:在光锥内,发光、辐射。引言guidedmodeguidedmoderesonance--Similartotheguidedmode,a......
  • SnippetsLab:程序员的秘密武器
    欢迎来到我的博客,代码的世界里,每一行都是一个故事SnippetsLab:程序员的秘密武器前言介绍SnippetsLab功能深挖智能标签与分类:高级搜索与过滤:效果展示新增代码片段快速查找代码前言在代码的世界里,有时候一小段巧妙的代码可以解决许多问题。然而,如何高效地管......
  • nand2tetris_选择器和分配器
    布尔函数基础布尔运算符AndOrNot布尔函数布尔函数类比数学里的方程,可以认为自变量的取值只有0和1两种,也就是说,布尔函数是可以枚举的,即真值表。布尔函数(可能需要化简)可以认为是等价于真值表。更多时候,往往需要从真值表(结果,或者说需求)推导出布尔函数,再化简设计出最优电......
  • xsslabs靶场
    level1payload:<scirpt>alert(123);</script>从php代码可以看出level1没有对输入的数据进行防御!level2输入level1的payload可以看到输入到input标签中的value值中,所以用'"用来闭合value,用>来闭合input标签payload:'"><script>alert(123)</script>从php代码可以看到l......
  • 【转载】内存基本概念-slab算法
    Linux内存管理之slab2:slabAPIhttps://blog.csdn.net/lqy971966/article/details/1198019121.为什么有了Buddy(伙伴系统)还需要slab?1.1什么是伙伴系统?Linux内核中使用伙伴系统(buddysystem)算法以页为单位管理内存,进行内存分配。1.1.1伙伴系统思想它把所有的空闲页放到1......