Linux 物理内存外碎片化浅析( 三 )


以下数组明确了各种页面类型可偷的页面类型,例如第一行表示UNMOVABLE页面可以偷RECLAIMABLE和MOVABLE类型的页面,其他类似 。

Linux 物理内存外碎片化浅析

文章插图
 
如果不可移动页面频繁的偷页会导致不可移动页面很快污染了内存环境,特别污染了可移动页面的内存,对内存规整成功率的影响比较大 。基于以上情况,可以在偷页的机制上加上分配大小限制的判断,不可移动页面只有大块内存分配才允许偷页,以此减少不可移动页面对内存环境的污染 。
  • 不可移动类型页面偷页后主动偿还
该方法主要是不可移动页面偷页后的一种补偿方法 。如果发生不可移动页面偷页后,我们将该页面记录到一个列表,等后续不可移动页面类型存在空闲页面时,将所偷的页面迁移回不可移动页面中,从而降低不可移动页面的污染 。
(2)降低分配页帧号的随机性
假设有一块小内存域如下,以下两种内存分配方式哪种会导致严重的内存碎片化?
  • 页面从头部开始分配,直到尾部;
  • 页面随机从任何位置分配 。

Linux 物理内存外碎片化浅析

文章插图
 
明显是第二种内存分配方式的对内存外碎片化更不友好,而这点也是伙伴系统目前没有解决的问题 。伙伴系统虽然将内存规划成各种大小的内存块,以让小内存分配在小块链表分配,尽量不污染大块内存链表,但是却没办法保证小块内存具体是在物理内存的哪个页帧范围分配 。随着系统的运行越久,小块内存的分配的物理页帧号越发随机,那么其导致碎片化的概率就会越高 。
  • 预留法
根据这种情况,可以通过预留的方式进行相应的优化 。
预留一定的内存专门用于小块内存分配,经过这个优化措施后,可以有效降低小块内存分配的物理页帧号的随机性,从而降低小块内存污染内存环境的概率 。
预留一定的内存专门用于大块内存分配,经过该优化措施后,预留的内存被小块内存污染的概率就会降低,可以提升预留内存分配大块内存的成功率 。
另外关于降低伙伴系统分配页帧号随机性,还是存在很多优化的措施,后续根据需要会专门开展一篇阐述该部分优化的文章,如果读者有兴趣,到时可以查阅 。
参考文献
1、内核源代码
2、http://tinylab.org/lwn-368869/
3、https://patchwork.kernel.org/patch/

【Linux 物理内存外碎片化浅析】


推荐阅读