首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

业余时间写的玩具操作系统,准备把内存管理部分加强一下,伙伴系统分配页面算法已经完成,下面就要开始写更加细粒度的内存分配,毕竟伙伴系统是按照页为基本单位分配的,参考内核版本linux2.6.30,没分析高版本的源码...slab算法是一个高效的内存分配算法,它通过把经常使用的内存块比如32字节,64字节大小或者某个常用结构体大小的类型组织成一个kmem_cache结构,经常分配和释放的内存会保存在一个array_cache...kmalloc函数就是从slab分配的。整体结构就是如下图,其中一个slab包含1到多个页面,slab管理结构可能在页面上,也可能从其它kmem_cache上动态分配的。    ...; //slab管理结构的大小 unsigned int dflags; /* dynamic flags */ /* constructor...管理的空闲内存替换全局内存区 { struct array_cache *ptr; ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL

92410

Linux内存管理 - slab分配器

Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续个内存页的问题。...但有时候我们只需要申请一个很小的内存区(如32字节),这时候使用伙伴分配算法就显得浪费了。为了解决小内存分配问题,Linux使用了slab分配算法。...所以cache_cache静态变量就是用来管理slab分配器的。...灰色部分是着色区,绿色部分是slab管理结构,黄色部分是空闲对象链表的索引,红色部分是对象的实体。我们可以看到slab结构的s_mem字段指向了对象实体列表的起始地址。

2.3K51
您找到你想要的搜索结果了吗?
是的
没有找到

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

有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...这也是Buddy算法管理空闲页表的本质。 空闲内存的信息我们可以通过以下命令获取: ?...而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来,供驱动使用。 SlabLinux中,伙伴系统(buddy system)是以页为单位管理和分配内存。...总结 从内存DDR分为不同的ZONE,到CPU访问的Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理,我们应该可以从感官的角度理解了下图: ?

3.4K73

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

有了前两节的学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...这也是Buddy算法管理空闲页表的本质。 空闲内存的信息我们可以通过以下命令获取: ?...而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来,供驱动使用。 SlabLinux中,伙伴系统(buddy system)是以页为单位管理和分配内存。...总结 从内存DDR分为不同的ZONE,到CPU访问的Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理,我们应该可以从感官的角度理解了下图: ?

2K30

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

之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB...就会从这些普通SLAB中获取内存。...总的来说,kmem_cache结构用于描述一种SLAB,并且管理着这种SLAB中所有的对象。所有的kmem_cache结构会保存在以slab_caches作为头的链表中。...在内核模块中可以通过kmem_cache_create自行创建一个kmem_cache用于管理属于自己模块的SLAB。   ...如果看了我linux内存源码分析 - 页框分配器的朋友,或许可以联系起来了。SLAB就是一组连续的页框,它的描述符结合在页描述符中,也就是页描述符描述SLAB的时候,就是SLAB描述符。

1.9K40

Linux - Linux内存管理

移除交换空间 ---- 概念 内存管理Linux系统重要的组成部分。...为了解决内存紧缺的问题,Linux引入了虚拟内存的概念。为了解决快速存取,引入了缓存机制、交换机制等。...当需要用到原始内容时,这些信息会被重新从交换空间读入物理内存Linux内存管理采取的是分页存取机制。...要深入了解Linux内存运行机制,需要知道下面提到的几个方面。 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。...其次,Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。

52.1K41

Linux内存管理

本篇介绍 本篇介绍下Linux内存管理,用系统角度看内存的寻址和分配机制。 内容介绍 内存管理应该是系统中最难的模块之一了,而且历史也悠久,就先来简单回顾下。...分段和分页 谈到内存管理,最先想到的就是分段和分页机制。...分页 分段机制的确很优秀,不过还可以再优秀一点,那就是分页机制,分段有个不足就是按段来管理,毕竟段相对于内存来说还是太大了,比如代码段,数据段之类的有可能很大,按这么大粒度管理可能还是会存在内存碎片问题...分页把地址空间按照页框来管理,一般是4k,也有其他款式的,总之要和物理内存的页框大小匹配上。这样内存就按照页框的粒度来管理就好了。...mmap流程如下: image.png 缺页异常 linux 是在不得不使用物理内存的时候才会分配物理内存。这句话该怎么理解呢?

13.6K51

Linux 内存管理

操作系统内存管理包括物理内存管理和虚拟内存管理:       我们这篇主要介绍Linux的虚拟内存管理。...物理内存管理在另外一篇:《操作系统内存管理(思维导图详解)》       1、程序的进程在内存的数据结构  一.Linux 进程在内存数据结构 ---- 1、存储(没有调入内存)阶段:       可以看到一个可执行程序在存储...并且提供段 内分页管理机制 .   为 Linux虚拟内存管理机制提供了支持 。        ...六.分页机制管理 ----          Linux使用分页管理机制来更加有效地利用物理内存.当创建一个进程时.仅仅把当前进程的一小部分真正装入内 存.其余部分需要访问时.处理器产生一个页故障.由缺页中断服务程序根据缺页虚拟地址和出错码调用写拷贝函数...例如:32位Linux的每个用户进程都可以访问4GB的线性地址空间, 而实际的物理内存可能远远少于4GB. 采用分页机制 ,Linux仅把可执行映像的一小部分装入物理内存

7.5K10

深度解析 slab 内存池回收内存以及销毁全流程

x 表示我们要释放的内存块(对象)的虚拟内存地址,参数 s 指向内存块所属的 slab cache。...slab cache 针对内存的回收流程其实和我们在上一小节 《11. slab cache 如何分配内存》介绍的 slab cache 内存分配流程是相似的。...slub 回伙伴系统,底层调用 __free_pages 将 slub 所管理的所有 page 释放回伙伴系统 discard_slab(s, page); } 3.1 直接释放对象回 slab...cache 架构中一般是由 kmem_cache_cpu->partial 链表和 kmem_cache_node->partial 链表来组织管理。...在内核源码章节的开始,笔者首先为大家介绍了 slab 内存池的创建流程,流程图如下: image.png 在 slab 内存池创建出来之后,随后笔者又深入介绍了 slab 内存池如何分配内存块的相关源码实现

27320

Linux内存描述之高端内存--Linux内存管理(五)

但是,当Linux物理内存超过1G时,线性访问机制就不够用了,因为只能有1G的内存可以被映射,剩余的物理内存无法被内核管理,所以,为了解决这一问题,Linux把内核地址分为线性区和非线性区两部分,线性区规定最大为...4 页框管理 4.1 页框管理 Linux采用4KB页框大小作为标准的内存分配单元。...每个管理区又有自己的描述符,描述了该管理区空闲的页框,保留页数目等。每个页描述符都有到内存节点和到节点管理区的连接(被放在flag的高位字段)。...内核调用一个内存分配函数时,必须指明请求页框所在的管理区,内核通常指明它愿意使用哪个管理区。 4.2 保留的页框池 如果有足够的空闲内存可用、请求就会被立刻满足。...内核通过内核页全局目录来管理所有的物理内存,由于线性地址前3G空间为用户使用,内核页全局目录前768项(刚好3G)除0、1两项外全部为0,后256项(1G)用来管理所有的物理内存

12.2K22

Linux内存管理:memblock

内存管理是操作系统内核中最复杂的部分之一, start_kernel函数在内核启动第一个init进程前初始化了所有的内核特性(包括那些依赖于不同架构的特性),你也许还记得引导时创立的临时页表,但复杂的内存管理部分还没有开始...,当start_kernel函数被调用时,我们会看到初期内存管理到更复杂的内存管理数据结构和技术的转变,为了更好的理解内核的初始化过程,我们需要对这些技术有更清晰的理解,今天我们会着重讨论这个过程,主要针对初期的内存管理...,也不参与内存的分配,称之为静态内存; GPU/camera/多核共享的内存都需要预留大量连续内存,这部分内存平时不使用,但是必须为各个应用场景预留,这样的内存称之为预留内存内存其余的部分,是需要内核管理内存...memblock是什么 memblock介绍 memblock即linux启动后kernel管理内存空间抽象出来的结构,此时buddy系统和slab分配器等并没有初始化,当需要执行一些内存管理内存分配的任务...在mm_init中会建立内核的内存分配器,停用memblock,释放内存给伙伴系统和slab分配器。

1.8K20

Linux 内存管理初探

本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。...从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。 一、走进 linux 内存 1、内存是什么?...二、 linux 内存地址空间 1、linux 内存地址空间 Linux 内存管理全貌 ?...三、 Linux 内存分配算法 内存管理算法——对讨厌自己管理内存的人来说是天赐的礼物 1、内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配的这些小的内存生存周期又较长,反复申请后将产生内存碎片的出现...尽量一次性申请较大的内存,而不要反复申请小内存 尽可能申请大块的 2 的指数幂大小的内存空间 外部碎片避免——伙伴系统算法 内部碎片避免——slab 算法 自己进行内存管理工作,设计内存池 2、伙伴系统算法

5K51

linux 内存管理初探

本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。...从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。 一、走进 linux 内存 1、内存是什么?...内存地址空间 1、linux 内存地址空间 Linux 内存管理全貌 [1502333613282_2762_1502333613646.jpg] 2、内存地址——用户态&内核态 用户态:Ring3...[1502334025496_4791_1502334025688.jpg] 三、 Linux 内存分配算法 内存管理算法——对讨厌自己管理内存的人来说是天赐的礼物 1、内存碎片 1)   ...它们是通过页表映射的 当它们移动到新的位置,页表项也会相应的更新 6、slab 算法——基本原理 1)    基本概念 Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为

9.7K134

Linux内存描述之概述--Linux内存管理(一)

2 (N)UMA模型中linux内存的机构 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大. 因此linux内核需要用一种体系结构无关的方式来表示内存....而内存管理的其他地方则认为他们就是在处理一个(伪)NUMA系统. 2.2 Linux物理内存的组织形式 Linux把物理内存划分为三个层次来管理 层次 描述 存储节点(Node) CPU被划分为多个节点...(node), 内存则被分簇, 每个CPU对应一个本地物理内存, 即一个CPU-node对应一个内存簇bank,即每个内存簇被认为是一个节点 管理区(Zone) 每个物理内存节点node被划分为多个内存管理区域...,作为系统唯一的node管理所有的内存区域。..., 我们会在后面典型架构(x86)上内存区域划分详细讲解x86_32上的内存区域划分 因此Linux内核对不同区域的内存需要采用不同的管理方式和映射方式, 为了解决这些制约条件,Linux使用了三种区:

6.8K30

宋宝华:slab在内核内存管理和用户态Memcached的双重存在

比如slab,对于内核人员,我们都知道slab是buddy之上的一层。 ?...因为buddy作为Linux内核最底层的内存管理器,它分配1页,2页,4页,2n页,但是作为内核的堆用户本身,经常只是调用kmalloc()申请一个小内存,或者调用kmem_cache_alloc()申请一个数据结构...比如同样的slab算法,也被著名的用户态软件Memcached需要着。 Memcached是一种分布式内存对象缓存系统,用于动态Web等应用以减轻数据库的负载。...比如你查询一个数据库,可以先看看Memcached里面有没有命中,命中就直接从Memcached的内存里面拿到值了,没有的时候才需要去查数据库。...Memcached也同样采用slab分配算法来组织数据的存放,里面可以组织不同大小的chunks: ? 正如Linux内核的每一种不同slab里面的object的大小不一样。

50630

Android内存管理(四)Linux内存管理机制

linux内存管理卷帙浩繁,本文只能层层递进地带你领略冰山轮廓,通过本文你将了解到以下内容: 为什么需要管理内存 linux段页管理机制 内存碎片的产生机理 为什么需要管理内存 老子的著名观点是无为而治...在linux系统中如果以一种原始简单的方式管理内存是存在一些问题的,我们来看几个场景。...物理内存内存碎片 ---- 前面说的段页管理机制算是虚拟空间的部分,然而linux内存管理的另外一个重要部分就是物理内存管理了,也就是如何分配和回收物理内存,这就涉及到一些内存分配算法和分配器。...Linux内存管理的哲学 Free memory is wasted memory. Linux的哲学是尽可能多的使用内存,减少磁盘IO,因为内存的速度比磁盘快得多。...这是Linux内存管理的优秀特性,无论物理内存有多大,Linux都将其充分利用,将一些程序调用过的硬盘数据缓存到内存,利用内存读写的高速性提高系统的数据访问性能。

2.6K10

Linux内存描述之内存节点node--Linux内存管理(二)

CPU访问本地内存的速度比访问远程内存的速度要快 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大....因此linux内核需要用一种体系结构无关的方式来表示内存....因此linux内核把物理内存按照CPU节点划分为不同的node, 每个node作为某个cpu结点的本地内存, 而作为其他CPU节点的远程内存, 而UMA结构下, 则任务系统中只存在一个内存node, 这样对于..., 内核页需要使用内存(另外,还需要保留部分内存用于初始化内存管理子系统) 为解决这个问题,内核使用了自举内存分配器 此结构用于这个阶段的内存管理 */...对内存管理有必要的标志是N_HIGH_MEMORY和N_NORMAL_MEMORY, 如果结点有普通或高端内存则使用N_HIGH_MEMORY, 仅当结点没有高端内存时才设置N_NORMAL_MEMORY

7.6K20
领券