linux伙伴系统原理,linux伙伴系统(二):避免碎片(上)

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)实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值