美文网首页
内存页面的管理

内存页面的管理

作者: 迷死她张 | 来源:发表于2019-04-21 20:43 被阅读0次

我们上篇文章也是讲到了内存管理,从内存DDR分为不同的ZONE,到CPU访问的Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理。

CPU所有的操作都是建立在虚拟地址上处理(这里的虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到的内存管理都是对page的管理,接下来我们看一下用来管理page的经典算法--Buddy。

Linux内核中引入了伙伴系统算法(Buddy system)。把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。

假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块。

所以其实Buddy算法一直在对页框做拆开合并拆开合并的动作。Buddy算法牛逼就牛逼在运用了世界上任何正整数都可以由2^n的和组成。这也是Buddy算法管理空闲页表的本质。

在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。那么该如何分配呢?slab分配器就应运而生了,专为小内存分配而生。slab分配器分配内存以Byte为单位。但是slab分配器并没有脱离伙伴系统,而是基于伙伴系统分配的大内存进一步细分成小内存分配。

slab是slab分配器的最小单位,在实现上一个slab有一个货多个连续的物理页组成(通常只有一页)。单个slab可以在slab链表之间移动,例如如果一个半满slab被分配了对象后变满了,就要从slabs_partial中被删除,同时插入到slabs_full中去。

相关文章

  • 第12章 内存管理

    内核不支持简单快捷的内存分配方式。 一、页 内核把无力页作为内存管理的基本单位。内存管理单元(MMU,管理内存并把...

  • The X Developing - XDL For Platf

    内存管理。 XDL实现了四种内存管理方式的函数集,即:堆内存、页内存、全局内存和缓存。堆内存(xmem)为程序在运...

  • iOS 内存布局

    现代操作系统的内存分配以页为单位进行管理,而页通过段进行管理,组成了段页式内存管理。对于一个典型的进程来说,它的内...

  • 什么是虚拟内存,分页、分段又是什么?

    操作系统——内存管理之内存分配(分页,分段,段页)多级页表与快表 共享内存可以用虚拟内存来实现。 共享内存的方式原...

  • Linux 内存管理

    Linux 内存管理 1 页的概念 linux 内核中把物理页作为内存分配的最小单位,32位CPU 页的大小通常为...

  • 内存页面的管理

    我们上篇文章也是讲到了内存管理,从内存DDR分为不同的ZONE,到CPU访问的Page通过页表来映射ZONE,再到...

  • 操作系统简明-5.1页表 干货整理

    页表结构 在现实中,页表存在物理内存里,因此这里就衍生了一系列问题,页表占多大内存?怎么管理这些内存? 问题:开始...

  • 冷月手撕408之操作系统(15)-内存分配之基本分段式、段页式管

    操作系统的内存分配之基本分段式、段页式管理主要是介绍了内存的分配的非连续分配管理中的基本分段式、段页式管理。 主要...

  • linux内存映射

    关于页表,页表其实仅仅就是保存虚拟内存和物理内存的映射关系的,跟物理内存有没有被使用没关系的。 关于内存管理,物理...

  • 第四章 程序崩溃处理

    内存管理 都是一些内存管理方面的知识,具体参考内存管理书籍即可,特别注意点如下 内存权限读、写、执行权限无权限可能...

网友评论

      本文标题:内存页面的管理

      本文链接:https://www.haomeiwen.com/subject/cdfsgqtx.html