首页
学习
活动
专区
圈层
工具
发布

linux内存管理slab算法之slab初始化

业余时间写的玩具操作系统,准备把内存管理部分加强一下,伙伴系统分配页面算法已经完成,下面就要开始写更加细粒度的内存分配,毕竟伙伴系统是按照页为基本单位分配的,参考内核版本linux2.6.30,没分析高版本的源码...kmalloc函数就是从slab分配的。整体结构就是如下图,其中一个slab包含1到多个页面,slab管理结构可能在页面上,也可能从其它kmem_cache上动态分配的。    ...data, touched during every alloc/free */ /*表示本cpu的缓存数组,如果是单核NR_CPUS就是1*/ struct array_cache *array...Without this, further allocations will * bug. */ //创建对象为32字节的缓存 sizes[INDEX_AC].cs_cachep =..., NULL); } //slab早期初始化结束 slab_early_init = 0; while (sizes->cs_size !

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux内存管理 - slab分配器

    Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续个内存页的问题。...为了解决小内存分配问题,Linux使用了slab分配算法。 相关数据结构 slab算法有两个重要的数据结构,一个是kmem_cache_t,另外一个是slab_t。...着色区的作用是为了错开不同的slab,让CPU更有效的缓存slab。当然这属于优化部分,对slab分配算法没有多大的影响。就是说就算不对slab进行着色操作,slab分配算法还是可以工作起来的。...2) 如果slab_partial列表中没有可用的slab,那么就从slab_free列表中查找可用的slab,如果有可用slab,就从slab分配一个对象,并且把此slab放置到slab_partial

    3K51

    Linux内核内存管理算法Buddy和Slab

    为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。...为了进一步解释,这里举个例子来说明,用struct kmem_cache结构描述的一段内存就称作一个slab缓存池。...一个slab缓存池就像是一箱牛奶,一箱牛奶中有很多瓶牛奶,每瓶牛奶就是一个object。分配内存的时候,就相当于从牛奶箱中拿一瓶。总有拿完的一天。当箱子空的时候,你就需要去超市再买一箱回来。...可以通过下面命令查看slab缓存的信息: ?

    4.5K73

    Linux内核内存管理算法Buddy和Slab

    为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。...为了进一步解释,这里举个例子来说明,用struct kmem_cache结构描述的一段内存就称作一个slab缓存池。...一个slab缓存池就像是一箱牛奶,一箱牛奶中有很多瓶牛奶,每瓶牛奶就是一个object。分配内存的时候,就相当于从牛奶箱中拿一瓶。总有拿完的一天。当箱子空的时候,你就需要去超市再买一箱回来。...可以通过下面命令查看slab缓存的信息: ?

    2.3K30

    linux内存源码分析 - SLAB分配器概述

    kmem_cache结构   虽然叫SLAB分配器,但是在SLAB分配器中,最顶层的数据结构却不是SLAB,而是kmem_cache,我们暂且叫它SLAB缓存吧,每个SLAB缓存都有它自己的名字,就是上图中的...我们先看看kmem_cache结构: /* slab分配器中的SLAB高速缓存 */ struct kmem_cache { /* 指向包含空闲对象的本地高速缓存,每个CPU有一个该结构,当有对象释放时...,在NUMA架构中每个node对应数组中的一个元素,因为每个SLAB高速缓存都有可能在不同结点维护有自己的SLAB用于这个结点的分配。...如果看了我linux内存源码分析 - 页框分配器的朋友,或许可以联系起来了。SLAB就是一组连续的页框,它的描述符结合在页描述符中,也就是页描述符描述SLAB的时候,就是SLAB描述符。...关于SLAB着色   看名字很难理解,其实又很好理解,我们知道内存需要处理时要先放入CPU硬件高速缓存中,而CPU硬件高速缓存与内存的映射方式有多种。

    2.4K40

    伙伴系统和slab机制

    slab机制 slab是Linux操作系统的一种内存分配机制。...Linux 的slab 可有三种状态: 满的:slab 中的所有对象被标记为使用。 空的:slab 中的所有对象被标记为空闲。 部分:slab 中的对象有的被标记为使用,有的被标记为空闲。...与传统的内存管理模式相比, slab 缓存分配器提供了很多优点。 1、内核通常依赖于对小对象的分配,它们会在系统生命周期内进行无数次分配。...2、slab 缓存分配器通过对类似大小的对象进行缓存而提供这种功能,从而避免了常见的碎片问题。 3、slab 分配器还支持通用对象的初始化,从而避免了为同一目的而对一个对象重复进行初始化。...4、slab 分配器还可以支持硬件缓存对齐和着色,这允许不同缓存中的对象占用相同的缓存行,从而提高缓存的利用率并获得更好的性能。

    2.7K11

    Linux缓存机制bufferscached

    缓存机制:Linux引入了buffers和 cached机制,buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件元数据,这样当操作系统需要读取某些文件时,首先在buffers...根据Linux虚拟内存管理机制,这种行为是正常的。要理解为什么缓存会变得如此之高,以及为什么这不是一个问题,就必须了解I/O在Linux上是如何工作的。...将内存中数据强制先刷新到磁盘中: sync; sleep 3; sync 清理缓存: echo 3 > /proc/sys/vm/drop_caches 表示清除pagecache和slab分配器中的缓存对象...echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。...slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。 如果buffers/cached过高,如何排查哪些进程引起的?

    5.7K10

    记一次内存占用问题的调查过程

    Slab简介和进一步调查 Slab Allocation是Linux 2.2之后引入的一个内存管理机制,专门用于缓存内核的数据对象,可以理解为一个内核专用的对象池,可以提高系统性能并减少内存碎片。...: 66232 kB SReclaimable(Linux 2.6.19+)都是clean的缓存,随时可以释放。...回到之前的内存问题,我查了下那台服务器上Slab占用的内存: $ cat /proc/meminfo | grep Slab Slab: 12777668 kB 12G的Slab缓存,有意思的是...free把Slab缓存统计到了used memory中,这就是之前那个问题的症结所在了。...因为问题不在Slab,而在于我们那个会引起Slab缓存飙涨的进程(我这里应该是 rsync)。实际操作的时候发现,清除缓存一段时间后,Slab缓存很快又会“反弹”回去。

    3.1K40

    slab为什么要进行着色处理

    cpu会到一级缓存读取所需要的数据,而一级缓存则会去内存里面读取数据,读取的方式是通过缓存行(cache line)的形式来进行读取。...当一级缓存内的数据需要置换时,则会将缓存内的数据置换到二级缓存内,然后依次类推到内存中。 假设我们的缓存行为64字节,512行(一共32K)。...高速缓存读物理内存的位置不是任意的,而是固定的。那么就根据高速缓存的大小进行映射,这里是32K一组大小进行映射: ?...再假设: 我们读取数据的内存物理地址是0x1000000, 则第0缓存行就会固定的读取0x10000000x1000040这64个字节大小(即缓存行大小),并且第0缓存行并不能读取0x10000400x1000080...那么现在已经可以解释slab为啥要进行着色了: 比如cpu正在对0x10000008地址进行读写操作,突然有一个地址指针指向了0x10008008,并且需要读取0x10008008内存处的地址,cpu检测到冲突

    1.3K30

    浅谈Linux内核中页缓存和块缓存

    中块缓存关联,每个块缓存和磁盘的盘块进行关联。...块缓存中缓存的单个块大小是以磁盘扇区大小,默认是512个字节。无论应用程序读取多少个字节,在最终访问磁盘的时候,都必须以扇区大小(512个字节)读取;对应的块缓存中缓存块大小页是扇区的大小。...Page Cache(页缓存) Linux页高速缓存任何基于页的数据,所缓存的Page包括普通文件内容、块设备文件、内存映射文件的读写。页缓存中一个页帧的文件数据锁对应的磁盘块不必是连续的。...针对块设备文件的页缓存则是磁盘盘块在物理磁盘上是连续的。 页缓存中采用了struct address_space数据结构来管理。它特指一个文件内容所形成的的页缓存空间。...) 块缓存和页缓存是相对独立的两种缓存机制,通常也可以结合在一起共同描述页缓存中保存文件的数据,向上以页为单位于页缓存交互,向下以块缓存为单位和通用设备层进行交互。

    4K30

    图解 | Linux内存性能优化核心思想

    hi,大家好,今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种性能问题...Linux内核的slab来自一种很简单的思想,即事先准备好一些会频繁分配,释放的数据结构。...如果一个CPU的slab缓存满了,直接去抢同级别的别的CPU的slab缓存被认为是一种鲁莽且不道义的做法。...这个设计思想同样作用于slab,就是Linux内核的slub实现,现在可以给出概念和解释了。 Linux kernel slab cache:一个分为3层的对象cache模型。...Linux内核对伙伴系统针对单一页面的分配需求采取的批量分配“每CPU单一页面缓存”的方式!每一个CPU拥有一个单一页面缓存池,需要单一页面的时候,可以无需加锁从当前CPU对应的页面池中获取页面。

    1.2K40

    多核心Linux内核路径优化的不二法门之-slab与伙伴系统

    Linux内核的slab来自一种很简单的思想,即事先准备好一些会频繁分配,释放的数据结构。...如果一个CPU的slab缓存满了,直接去抢同级别的别的CPU的slab缓存被认为是一种鲁莽且不道义的做法。...这个设计思想同样作用于slab,就是Linux内核的slub实现。 现在可以给出概念和解释了。 Linux kernel slab cache:一个分为3层的对象cache模型。...伙伴系统 前面我们简短的体会了Linux内核的slab设计,不宜过长,太长了不易理解.但是最后,如果Level 3也没有获取page(s),那么最终会落到终极的伙伴系统。...Linux内核对伙伴系统针对单一页面的分配需求采取的批量分配“每CPU单一页面缓存”的方式!

    1.3K30

    Linux 内核内存管理:虚拟地址空间、伙伴系统和块分配器

    5.2、slab块分配器原理slab分配器的作用不仅仅是分配小块内存,更重要的作用是针对经常分配和释放的对象充当缓存。...如下图所示为内存缓存的组成结构:slab分配器在某些情况下表现不太优先,所以Linux内核提供两个改进的块分配器。...不同slab中相同偏移的位置在处理器一级缓存中的索引相同。...如果slab的剩余部分的长度超过一级缓存行的长度,剩余部分对应的一级缓存行没有被利用;如果对象的填充字节的长度超过一级缓存行的长度,填充字节对应的一级缓存行没有被利用。...Linux内核提供了多种块分配器,包括slab分配器、slub分配器和slob分配器。这些分配器针对不同的使用场景进行了优化,例如高速缓存、文件系统和内核对象。

    91900
    领券