伙伴系统(代码片段)

tianzeng tianzeng     2023-04-14     722

关键词:

  伙伴系统经典的内存管理方法,有效的解决了内存外部碎片问题,分配一组连续的页而建立的高效分配策略,结合2的幂次方个分配器和空闲缓冲区合并的技术。内存被分成含有若干个(2^0,2^1,2^2...2^11)页面的块。

  伙伴系统的分配器维护空闲页面所组成的块, 这里每一块都是2的方幂个页面, 方幂的指数称为阶.

概述

  1. 在分配时,如果找不到合适的块,一个大块将会被分为两部分,这两部分称为伙伴,一部分用来分配一部分是空闲,空闲的会根据页框大小插入到合适的空闲块链表中。
  2. 释放单页时,内核将CPU置于高速缓存中,会可能出现cache的页,放到“快表”的列表中。在此过程中内核判断CPU高速缓存页数是否超过一定的阈值,如果是,将一批页还给操作系统,然后将该页添加到CPU高速缓存中。
  3. 释放多页时,内核先计算该块的伙伴地址。满足一下三个条件称为伙伴:1.两块具有相同的大小,记做b;2.它们的物理地址是连续的;3.第一块的第一个页的物理地址是2*(2^b)倍数。如果找到了该内存的伙伴,并且该伙伴是空闲的,可以合并,继续检查合并后的块的伙伴是否可以继续合并。

技术图片

伙伴系统数据结构

  系统内存中的每个物理内存页(页帧),都对应于一个struct page实例, 每个内存域都关联了一个struct zone的实例,其中保存了用于管理伙伴数据的主要数数组

struct zone

     /* free areas of different sizes */
    struct free_area        free_area[MAX_ORDER];
;
//伙伴系统的辅助数据结构
struct free_area 
    struct list_head free_list[MIGRATE_TYPES];//是用于连接空闲页的链表. 页链表包含大小相同的连续内存区
    unsigned long nr_free;//指定了当前内存区中空闲页块的数目(对0阶内存区逐页计算,对1阶内存区计算页对的数目,对2阶内存区计算4页集合的数目,依次类推
;

  阶是伙伴系统中一个非常重要的术语. 它描述了内存分配的数量单位. 内存块的长度是2^0,order , 其中order的范围从0到MAX_ORDER

  zone->free_area[MAX_ORDER]数组中阶作为各个元素的索引, 用于指定对应链表中的连续内存区包含多少个页帧.

  • 数组中第0个元素的阶为0, 它的free_list链表域指向具有包含区为单页(2^0 = 1)的内存页面链表
  • 数组中第1个元素的free_list域管理的内存区为两页(2^1 = 2)
  • 第3个管理的内存区为4页, 依次类推,直到 2^MAXORDER-1个页面大小的块,MAXORDER默认值为11

技术图片

 

内存区的链接

  内存区中第1页内的链表元素, 可用于将内存区维持在链表中

技术图片

伙伴系统反碎片机制

内核将已分配页分为以下三种不同的类型:

  1. 不可移动页:这些页在内存中有固定的位置,不能够移动。核心内核分配的大多数内存属于该类别
  2. 可回收页:这些页不能移动,但可以删除。内核在回收页占据了太多的内存时或者内存短缺时进行页面回收。映射自文件的数据属于该类别
    kswapd守护进程会根据可回收页访问的频繁程度,周期性释放此类内存. , 页面回收本身就是一个复杂的过程. 内核会在可回收页占据了太多内存时进行回收, 在内存短缺(即分配失败)时也可以发起页面回收
  3. 可移动页:这些页可以任意移动,用户空间应用程序使用的页都属于该类别。它们是通过页表映射的。当它们移动到新的位置,页表项也会相应的更新。在内存子系统初始化期间,所有的页都被标记为可移动的

  此时内核的策略是分配一个尽可能大的连续内存块,将其从可移动列表转换到不可移动列表

  由于页无法移动, 导致在原本几乎全空的内存区中无法进行连续分配. 根据页的可移动性, 将其分配到不同的列表中, 即可防止这种情形。

内核解读之内存管理页分配器伙伴系统介绍(代码片段)

文章目录1分配器的需求2伙伴系统的内存组织2.1zonelist列表结构2.2zone的空闲内存结构2.3内存迁移类型2.4pcp页框1分配器的需求伙伴系统是linux的页框分配器,负责系统物理内存的分配工作。由于几乎所有模... 查看详情

buddy(伙伴)系统分配器之分配page(代码片段)

Buddy分配器是按照页为单位分配和释放物理内存的,在Zone那一节文章中freearea就是通过buddy分配器来管理的。buddy分配器将空闲页面按照order的大小分配挂到不同的order链表中。比如order为0的链表下就挂载着大小为1个page的空闲... 查看详情

linux内核源码分析之伙伴系统(代码片段)

      目录伙伴关系基础避免碎片1,依据可移动性组织页2、虚拟可移动内存域内核中不连续页的分配用vmalloc分配内存释放内存伙伴关系基础        free_area[]数组中各个元素的索引也解释为阶,用于指定对应链表... 查看详情

三天开发一个系统,奖金3k源码开源(代码片段)

最近帮小伙伴,开发一个系统。由于要的比较着急。就连夜赶了。赶出来后,小伙伴觉得不错,又给了一些额外的费用。给的还很高!征得小伙伴同意后,源码开源给大家。文章目录一,运行环境:二&... 查看详情

三天开发一个系统,奖金3k源码开源(代码片段)

最近帮小伙伴,开发一个系统。由于要的比较着急。就连夜赶了。赶出来后,小伙伴觉得不错,又给了一些额外的费用。给的还很高!征得小伙伴同意后,源码开源给大家。文章目录一,运行环境:二&... 查看详情

json伙伴(代码片段)

查看详情

内核解读之内存管理页分配器伙伴系统介绍(代码片段)

文章目录1分配器的需求2伙伴系统的内存组织2.1zonelist列表结构2.2zone的空闲内存结构2.3内存迁移类型2.4pcp页框1分配器的需求伙伴系统是linux的页框分配器,负责系统物理内存的分配工作。由于几乎所有模... 查看详情

汽车车牌识别系统--项目中的各个文件解析(代码片段)

汽车车牌识别系统上传至CSDN之后,好多小伙伴都对项目中的各个文件存在疑问,该篇文章主要是为了解析项目中的各个文件。如果对项目中的各个文件已经很熟悉的小伙伴,请自觉略过。-LPR:项目名称 -char_recogni... 查看详情

第一次结对作业(代码片段)

结对编程简介对伙伴的代码进行审查合作伙伴:王军宏伙伴Coding.net的代码地址:参考文章:C++代码审查二、对伙伴的评价我的队友是我团队的伙伴,虽然我知道老师说尽量不去选择一个团队的同学,但是当我准备去找结队伙伴的... 查看详情

html合作伙伴的login.html(代码片段)

查看详情

php在没有合作伙伴的整数列表中查找数字(代码片段)

查看详情

如何在mac电脑上切换双系统(代码片段)

使用Mac电脑的小伙伴都遇到过,某些特定的软件需要Windows才能用,鉴于长时间使用这些软件,双系统便轻松解决这一难题,那么Mac苹果电脑如何双系统切换吗?下面是小macw带来如何切换双系统教程,需要的朋友快来看!WINDOWS系... 查看详情

《计算机网络pdf》炸了!!!(代码片段)

...序员cxuan,欢迎你收看我最新一期文章。熟悉我的小伙伴应该都知道,我之前已经撸了六本PDF,这六本PDF涉及Java基础、Java进阶、HTTP、计算机基础、操作系统和面试题总结。这六本PDF已经有非常多的小伙伴下载、阅读... 查看详情

80行代码实现简易登录管理系统(代码片段)

...的地方,也请大家指正,相互交流学习,需要原代码的小伙伴可以告诉我...... #------------------------------------------------------------------------------------------------------------------------------------设计实现的功能:    1.实现用户登录 ... 查看详情

个人博客系统(附源码)(代码片段)

...小项目,来检验一下前面的学习成果吧!有需要源代码的小伙伴可以来看看:个人博客系统;这个小项目主要是模仿CSDN做的,但是功能还是比较少的,只是写出了一些主要的功能,下面就一起来看看吧!🎨🎨🎨目录🍌一.... 查看详情

ubuntu如何在线升级系统(代码片段)

  Ubuntu如何升级更新系统  有也常用KaliLinux的小伙伴会很熟悉,在Kali中我们只需要使用apt/apt-get包管理器执行如下命令即可: sudoaptupdate&&aptupgrade-y 一般执行结束就已完成Kali系统的更新 或者再加上:sudoaptdist-upgr... 查看详情

ubuntu如何在线升级系统(代码片段)

  Ubuntu如何升级更新系统  有也常用KaliLinux的小伙伴会很熟悉,在Kali中我们只需要使用apt/apt-get包管理器执行如下命令即可: sudoaptupdate&&aptupgrade-y 一般执行结束就已完成Kali系统的更新 或者再加上:sudoaptdist-upgr... 查看详情

美团一面:inndodb单表最多2000w,为什么?小伙伴竟然面挂(代码片段)

在疯狂创客圈的社群面试交流中,有很多小伙伴在面大厂,经常遇到下面的问题:问题1:在实际生产环境中,InnoDB中一棵B+树索引一般有多少层?问题2:在实际生产环境中,InnoDB一棵B+树可以存放多少行数据?问题3:MySQL对于千... 查看详情