精华内容
下载资源
问答
  • OS-Memory-Allocation-Algorithms-Simulation:此存储库中包含的两程序模拟了Buddy系统,First Fit,Next Fit,Best Fit和Worst Fit内存分配算法,这些算法许多操作系统中使用。 树数据结构用于伙伴系统的实现,...
  • 3.5物理内存的管理--伙伴系统在内核...3.5.1伙伴系统的数据结构系统内存的每个物理内存页(页帧),都对应一个structpage实例。每个内存域都关联了一个structzone的实例,其中保存了用于管理伙伴数据的主要数组。str...

    3.5 物理内存的管理--伙伴系统

    在内核初始化完成以后,内存管理的责任交给伙伴系统承担。伙伴系统基于一种相对简单而令人吃惊的强大算法,已经出现40年。它结合了优秀内存分配器的两个关键特征:速度和效率。

    3.5.1 伙伴系统的数据结构

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

    struct zone {

    ...

    /* free areas of different sizes */

    struct free_area        free_area[MAX_ORDER];

    ...

    } ____cacheline_internodealigned_in_smp;

    free_area是一个辅助数据结构,其定义如下:

    struct free_area {

    struct list_head        free_list[MIGRATE_TYPES];

    unsigned long           nr_free;

    };

    nr_free指定了当前内存区中空闲页块的数目(对0阶内存区主页计算,对1阶内存计算页对的数目,对2阶内存区计算4页集合的数目,依次类推)。

    free_list是用于连接空闲页的链表。页链表包含大小相同的连续内存区。

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

    /* Free memory management - zoned buddy allocator.  */

    #ifndef CONFIG_FORCE_MAX_ZONEORDER

    #define MAX_ORDER 11

    #else

    #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER

    #endif

    #define MAX_ORDER_NR_PAGES (1 <

    该常数通常设置为11,这意味着一次分配可以请求的页数最大是2^11=2048 pages(2K*4K=8MBytes)。如果特定于体系结构的代码设置了FORCE_MAX_ZONEORDER配置选项,该值也可以手工改变。例如,IA-64系统上巨大的地址空间可以处理MAX_ORDER=18的情形,而ARM或v850系统则使用更小的值,如8或9,但这不一定是由计算机支持的内存数量比较小引起的,也可能是内存对齐方式的要求所导致。

    free_area[]数组中各个元素的索引页解释为阶,用于指定对应链表中的连续内存区包含多少个页帧。第0个链表包含的内存区为单页(2^0=1),第一个链表管理的内存区为两页(2^1=2),第3个管理的内存区为4页,依次类推。

    内存区是如何连接的?内存区中第1页的链表元素,可用于将内存区维持在链表中。因此,也不必引入新的数据来管理物理内存上的连续的页,否则这些页不可能在同一内存区中。图3-22给出了图示。

    5fd19e82187d0058142b4cd5990daaf4.png

    伙伴不必是连接的。如果一个内存区在分配期间分解为两半,内核会自动将未用的一半加入到对应的链表中。如果在未来的某个时刻,由于内存释放的缘故,两个内存区都处于空闲状态,可通过判断其是否为伙伴。管理工作较少,是伙伴系统的一个优点。

    基于伙伴系统的内存管理专注于某个结点的某个内存域,例如,DMA或高端内存域。但所有内存域和结点的伙伴系统都通过备用分配列表连接起来,如图3-23所示。

    34e1ad0a1966e7d45881defe7915d826.png

    在首选的内存域结点无法满足内存分配请求时,首先尝试同一节点的另一个内存域,接下来尝试另一个结点,直至满足请求。

    最后要注意,有关伙伴系统当前状态的信息可以通过/proc/buddyinfo获取,也可以通过echo m >/proc/sysrq-trigger获取:

    root@linux:/study/linux-git/linux-3.18.3# echo m >/proc/sysrq-trigger

    [32594.375485] SysRq : Show Memory

    ..........

    [32594.625700] DMA: 2*4kB (U) 1*8kB (E) 1*16kB (M) 2*32kB (EM) 2*64kB (EM) 1*128kB (E) 3*256kB (UEM) 3*512kB (EM) 1*1024kB (U) 1*2048kB (R) 0*4096kB = 5728kB

    [32594.640749] Normal: 36*4kB (UEM) 11*8kB (UM) 12*16kB (UEM) 4*32kB (UEM) 0*64kB 2*128kB (EM) 7*256kB (UEM) 4*512kB (UM) 3*1024kB (UM) 8*2048kB (UER) 26*4096kB (UMR) = 130600kB

    [32594.657634] HighMem: 2*4kB (UM) 18*8kB (UE) 53*16kB (UM) 57*32kB (UEM) 32*64kB (UEM) 15*128kB (UE) 9*256kB (UE) 8*512kB (UE) 7*1024kB (UE) 7*2048kB (UEM) 65*4096kB (UMR) = 300936kB

    root@linux:/study/linux-git/linux-3.18.3#

    root@linux:/study/linux-git/linux-3.18.3# cat /proc/buddyinfo

    Node 0, zone      DMA      2      1      1      2      2      1      3      3      1      1      0

    Node 0, zone   Normal     36     10     12      4      0      2      7      4      3      8     26

    Node 0, zone  HighMem     13     28     53     57     32     15      9      8      7      7     65

    root@linux:/study/linux-git/linux-3.18.3#

    展开全文
  • 伙伴系统

    2016-09-20 13:36:31
    管理区分配器接受动态内存分配与释放的请求,该部分会搜索一个满足所请求的一组连续页框内存的管理区,每个管理区都被伙伴系统所处理。伙伴系统工作原理:请求了一个256个页框的块。算法现在256个页框大小的链表去...

    linux 中有个被称作分区页框分配器的内核子系统,处理对连续页框的内核分配请求。管理区分配器接受动态内存分配与释放的请求,该部分会搜索一个满足所请求的一组连续页框内存的管理区,每个管理区都被伙伴系统所处理。


    伙伴系统工作原理:请求了一个256个页框的块。算法现在256个页框大小的链表中去检查是否有一个空闲块满足要求,如果没有,算法会查找下一个更大的页块。也就是先在512的页框链表中查找,如果有,会把前一半满足请求,剩下的则插入到256的页框链表中。如果没有则继续向更大的页框大小链表中查找。如果更大的也没有,则发出错误信号。
    释放过程是一个逆过程,只不过释放完一个页框块时,会检查它的伙伴块,进行合并。
    合并的条件:两个块具有相同的大小
    物理地址是连续的。第一块的第一个页框的物理地址是每个页框大小的2倍。
    形成的更大块插入相应的链表。

    展开全文
  • 3.5.2避免碎片伙伴系统的基本原理:系统中的空闲内存块总是两两分组,每组中的两个内存块...内核对所有大小相同的伙伴(1、2、4、8、16或其他数目的页),都放置在一个链表中管理,各有8页的一对伙伴也在一个链表中。...

    3.5.2 避免碎片

    伙伴系统的基本原理:

    系统中的空闲内存块总是两两分组,每组中的两个内存块成为伙伴。伙伴的分配可以是彼此独立的。但如果两个伙伴都是空闲的,内核会将其合并为一个更大的内存块,作为下一层次上某个内存块的伙伴,如图1-8所示,内核中给出了一对伙伴,初始化大小均为8页。内核对所有大小相同的伙伴(1、2、4、8、16或其他数目的页),都放置在一个链表中管理,各有8页的一对伙伴也在一个链表中。如果系统现在需要8个页帧,则将16个页帧的块分拆为两个伙伴,其中一块用于满足程序的请求,而剩余的8个页帧则放置到对应8页大小内存块的列表中。

    43c5a4e78eaf31aa27fa8c9178562050.png

    如果下一个请求只需要2个连续的页帧,则由8页组成的块会分裂为2个伙伴,每个包含4个页。其中一块放置回伙伴链表中,而另一个再次分裂成2个伙伴,每个包含2页。其中一个回到伙伴系统,另一个则传递给应用程序。

    在应用程序释放内存时,内核可以直接检查地址,来判断是否能够创建一组伙伴,并合并为一个更大的内存块放回到伙伴系统链表中,这刚好是内存块分裂的逆过程。这提高了较大内存块可用的可能性。 >2

    4

    8

    16

    或其他数目的页),都放置在一个链表中管理,各有

    8

    页的一对伙伴也在一个链表中。如果系统现在需要

    8

    个页帧,则将

    16

    个页帧的块分拆为两个伙伴,其中一块用于满足程序的请求,而剩余的

    8

    个页帧则放置到对应

    8

    页大小内存块的列表中。

    内存碎片问题:

    在系统长期运行时,服务器运行几个星期乃至几个月是很正常的,许多桌面系统也倾向于长期开机运行,那么会发生内存碎片问题。频繁的分配和释放页帧可能导致一种情况:系统中有若干页帧是空闲的,却散布在物理地址空间的各处。换句话说,系统中缺乏连续页帧组成的较大内存块,而从性能上考虑,却又需要使用较大的连续内存块。通过伙伴系统可以在某种程度上减少这种效应,但无法完全消除。如果在大块 连续内存中间刚好有一个页帧分配出去,很显然这两块空闲的内存是无法合并的。

    1. 依据可移动性组织页

    伙伴系统是内核中比较稳定的内存管理方案。但在Linux内存管理方面,有一个长期存在的问题:在系统启动并长期运行后,物理内存会存在很多碎片。该情形如下3-34所示。

    c940aae53e6112b7bc9237b7a6735e4f.png

    假定内存由60页组成,这显然不是超级计算机,但用于示例却足够了。左侧的地址空间散布着空闲页。尽管大约20%的物理内存仍然未分配,但最大的连续空闲区却只有一页。这对用户空间应用程序没有问题:其内存时通过页表映射,无论空闲页在物理内存中的分布如何,应用程序看到的内存似乎总是连续的。右图给出的情形中,空闲页和使用页的数目与左图相同,但所有空闲页都位于一个连续区中。

    但对于内核来说。碎片是一个问题。由于大多数物理内存一致映射到地址空间的内核部分,那么在左图的场景中,无法映射比一页更大的内存区。尽管许多时候内核分配都是比较小的内存,但也有时候需要分配多于一页的内存。显而易见,在分配较大内存的情况下,右图中所有已分配页和空闲分配页都处在连续内存区的情形,是更为可取的。

    在大部分内存仍未分配时,也有可能发生碎片问题。如图3-25所示 伙伴系统是内核中比较稳定的内存管理方案。但在

    Linux

    内存管理方面,有一个长期存在的问题:在系统启动并长期运行后,物理内存会存在很多碎片。该情形如下

    3-34

    所示。

    只分配了8页,但可分配的最大连续区却只有4页,因为伙伴系统给所能工作的范围只能是2的幂次。

    内存管理实际上不止是关系到内核。大多数现代CPU都提供了使用巨型页的可能性。比普通页大得多。这对内存使用密集的应用程序有好处。在使用更大的页时,地址转换后备缓冲器只需处理较少的项,降低了TLB缓存失效的可能性。但分配巨型页需要连续的空闲物理内存。

    很长时间依赖,物理内存的碎片是linux的弱点之一。尽管已经提出了很多方法,但没有哪个方法能够既满足linux需要处理的各种类型工作负荷提出的苛刻要求,同时又对其他事务影响不太大。在内核2.6.24开发期间,防止碎片的方法最终加入内核。文件系统也有碎片,该领域的碎片主要通过碎片合并工具解决,他们分析文件系统,重新排序已分配存储块,从而建立较大的连续存储区。理论上,该方法对物理内存也是可能的,但是由于许多物理内存页不能移动到任意位置,阻碍了该方法的实施。因此,内核的方法是反碎片,即试图从最开始尽可能放置碎片。

    反碎片的工作原理如何?为理解该方法,我们必须知道内核将已分配页划分为下面三种不同类型:

    不可移动页:在内存中有固定位置,不能移动到其他地方。核心内核分配的大多数内存属于该类别

    可回收页:不能直接移动,但可以删除,其内容可以从某些资源重新生成。例如映射自文件系统的数据属于该类别。Kswapd守护进程会根据可回收页访问的频繁程度,周期性释放此类类存。这是一个复杂的过程,本身就需要详述,后面会有该内容详述。目前,了解到内核会在可回收页占据了太多内存时进行回收即可。另外,在内存短缺时也可发起页面回收。

    可移动页:可以随意移动。属于用户空间应用程序的页属于该类别。他们是通过页表映射的。如果它们复制到新位置,页表项可以相应的更新,应用程序不会注意到任何事。

    页的可移动性,依赖该页属于3种类别的哪一种。内核使用的反碎片技术,即基于将具有相同可移动性的页分组的思想。为什么这种方法有利于减少碎片?比如在上图中,由于页无法移动,导致在原本几乎全空的内存区中无法进行连续分配。根据页的可移动性,将其分配到不同的链表中,即可防止这种情况,例如,不可移动的页不能位于可移动内存区的中间。否则将无法从该内存区分配较大的连续内存。

    如果上图中大多数空闲页都属于可回收页,而分配的页则是不可移动的,如果这些页聚集到两个不同的链表中,那么在不可移动的页中仍然难以找到较大的连续空闲内存,但对于可回收页就容易多了。

    但要注意,从最初开始,内存并未划分为可移动性的不同区域。这些是在运行时形成的。内核的另一种方法确实将内存分区,分别用于可移动页和不可移动页的分配。

    未完待续:

    (1) 数据结构

    (2)全局变量和辅助函数

    (3)初始化基于可移动性的分组

    2. 虚拟可移动内存域

    (1)数据结构

    (2)实现

    展开全文
  • 简介:在伙伴系统内存的动态回收部分,得知当前释放块的伙伴块相当重要。因为要根据伙伴块的空闲情况,来确定是否同合并该伙伴块。(具体参考《数据结构》——清华大学出版社) 公式: buddy(p,k)=p+2^k ,若p%2^...

    简介:在伙伴系统内存的动态回收部分,得知当前释放块的伙伴块相当重要。因为要根据伙伴块的空闲情况,来确定是否一同合并该伙伴块。(具体参考《数据结构》——清华大学出版社)
    公式:

    buddy(p,k)=p+2^k ,若p%2^(k+1)=0;// 下一个伙伴
    buddy(p,k)=p-2^k,若p%2^(k+1)=2^k;// 上一个伙伴
    

    证明:
    有关回收算法中伙伴块的起始地址求解的证明

    展开全文
  • buddy伙伴系统

    2020-05-10 20:29:15
    Linux内存管理简述 Linux的内存管理不仅与处理器的架构相关,还要综合考虑性能需求。...对于UMA架构,比如SMP,只有一个物理内存节点,但是对于服务器的NUMA架构,会有多个物理内存节点。Linux为了管理所有内存节点的物
  • 2021-02-13 11:40:33来源:亿速云阅读:51作者:Leah这篇文章给大家介绍如何php项目使用mysql和jquery实现一个日历签到功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.日历签到...
  • 伙伴系统算法

    2013-12-13 16:52:00
    要理清这思路,我们首先必须学习种算法 —— 伙伴系统算法。 内核要分配组连续的页框,必须建立种健壮、高效的分配策略。为此,必须解决著名的外部碎片(external fragmentation)问题。频繁地请求...
  • 为了便于页面维护,将多个页面组成内存块,每个内存块都有2的方幂个页,方幂的指数被称为阶order,order相同的内存块被组织到一个空闲链表伙伴系统基于2的方幂来申请释放内存页。当申请内存页时,伙
  • linux物理内存管理-伙伴系统

    千次阅读 2018-05-16 20:07:29
    操作系统分配内存的过程一个内存块常常被分成两个大小相等的内存块,这两个大小相等的内存块就处于伙伴关系。它满足 3 个条件 : 两个块具有相同大小记为 2^K 它们的物理地址是连续的 从同一个大块拆分...
  • 内存管理-伙伴系统

    2018-11-12 21:41:33
    问题重述: 固定和可变分区内存管理方法都存在缺陷。固定分区由于分区数目是固定的,因此限 制了活动进程的个数,而且当...在伙伴系统中,内存块数和大小是不固定的,但是大小只能限定为 2K 字节,其中 L ≤...
  • 怎么利用php与MySql实现一个登录系统发布时间:2020-12-19 16:17:07来源:亿速云阅读:83...一、基本目标首先mysql存在着如下的用户信息表:页面一个登录表单,上面需要用户填写用户名与密码等信息如果用户...
  • 使用win10系统的过程中,有的小伙伴遇到了这样一个问题:开机后,某个磁盘图标上出现了一个黄色三角警示状态的感叹号标志,那么这是怎么一回事呢?其实这是由于系统中开启了磁盘加密功能“BitLocker 驱动器加密...
  • UnaBoot |尤娜一个基于Spring Boot 2.0构建的Java博客系统 简介 波亚德特基于着一个Spring Bo ...因此,UnaBoot系统在设计之初就只保留了一个博客网站最核心的几个功能模块,它们分别是栏目,文章,主题,友链,标签
  • 伙伴系统(代码+文档)

    热门讨论 2012-06-29 11:01:26
    在系统运行过程,由于不断的划分,可能会形成若干个不连续的空闲分区,将这些空闲分区根据分区的大小进行分类,对于每一类具有相同大小的所有空闲分区,单独设立一个空闲分区双向链表。这样,不同大小的空闲分区...
  • 4伙伴系统算法

    2012-08-01 15:10:08
    要理清这思路,我们首先必须学习种算法 —— 伙伴系统算法。   内核要分配组连续的页框,必须建立种健壮、高效的分配策略。为此,必须解决著名的外部碎片(external fragmentation)问题。频繁地请求和...
  • 内核内存管理的项重要工作就是如何频繁申请释放内存的情况下,避免碎片的产生。...伙伴系统:把所有的空闲页框分为11块链表,每块链表的结点分别是大小为1,2,4,8,16,32,64,128,256,5...
  • 库壳上读了篇关于Linux内存管理伙伴系统算法实现的文章,coolshell.cn/articles/10427.html,里面有结构体很让我好奇, struct buddy2 { unsigned size; unsigned longest[1]; };(注:GCC环境下你可以写...
  • 前面介绍了系统分配与回收存储空间时采取的边界标识法。本节再介绍种管理存储...例如,系统中整个存储空间为 2m字。那么进行若干次分配与回收后,可利用空间表中只可能包含空间大小为:20、21、22、…、2m...
  • 之前的文章已经介绍了伙伴系统,这篇我们主要看看源码中是如何初始化伙伴系统、从伙伴系统中分配页框,返回页框于伙伴系统中的。  我们知道,每管理区都有自己的伙伴系统管理属于这管理区的页框,这也说明了...
  • 主要分析Linux伙伴系统算法,内存的分配和释放 1.伙伴系统简介 ...伙伴算法(Buddy system)把所有的空闲页框分为11块链表,每块链表分布包含特定的连续页框地址空间,比如第0块链表包含大小为2^0...
  • weblogic服务器作为付费服务器,各个行业的使用还是相当广泛的,尤其金融行业,使用的很多都是weblogic服务器,毕竟。。。有钱任性。那么工作的时候肯定会有小伙伴遇到过要自己搭建weblogic服务器的情况,...
  • 古老的单道程序设计系统中,内存被划分为两个部分,其中一个部分供操作系统(也称驻留监控程序,内核),而另一部分供当前运行的用户程序使用,这种情况下,内存中最多只存在一个用户程序,也就谈不上什么内存...
  • 这是一个进程标记位,除了内存管理子系统中使用外,还其他的内核子系统中使用。之所以在伙伴系统分配器中讨论,是因为这个标记和内存管理密不可分。 当一个进程被设置PF_MEMALLOC后,那么对进程会有如下影响: ...
  • 内存管理笔记十、buddy伙伴系统

    千次阅读 2018-03-11 19:57:42
    内存管理笔记十、buddy伙伴系统 引言:上篇笔记,我们介绍了段页式的内存管理方式其不仅获得分段...因此linux段页式内存管理基础上,增加伙伴系统分配机制,可以理解为以空间换取时间和性能的机制。 ...
  • 内核分配内存,最后要通过伙伴系统接口进行实际物理页面的分配,一个重要的接口便是alloc_page.本文介绍下alloc_page的主要流程,各个部分的执行。主要包含正常分配流程,当页面不足的时候的处理方式。先定位到...
  • 伙伴系统-Buddy System

    2012-11-08 12:06:00
    Webus空间管理组件(WSM), 我也提供了Buddy System的实现, 关于这种算法的详细描述, 建议大家看经典教材 " 数据结构" 书第8章第4节. 我此仅谈谈如下三问题: 1. Buddy System的基本原理?...
  • 从2.6.32.25开始,linux伙伴管理系统中引入迁移类型(migrate type)这么一个概念,用于避免系统长期运行过程中产生碎片。关于迁移类型的一些概念介绍伙伴系统的数据结构的时候有提到过(见<<Linux伙伴系统...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,403
精华内容 1,361
关键字:

在一个伙伴系统中