博客
关于我
避免物理内存碎片化
阅读量:79 次
发布时间:2019-02-26

本文共 1084 字,大约阅读时间需要 3 分钟。

Linux内核的物理内存管理系统在运行过程中一直面临着物理内存碎片化问题。尽管系统总可用物理内存量可能较大,但在长时间运行后,空闲的连续物理内存块可能变得非常小,导致申请大块连续物理内存时失败,尤其是在带有ATOMIC标记的分配操作中。

避免碎片

物理内存碎片化问题一直是Linux操作系统的主要缺陷之一。尽管已有多种解决方案,但没有哪种方法能彻底解决这一问题。memory buddy分配方案提供了一种解决思路。用户空间的物理内存页属于movable类型,可以通过更新页表项和数据复制实现分配,而不可移动的页面则固定在内存中,无法迁移。

页面分类

内核引入了页面迁移类型分类机制,将页面分为三类:

  • unmovable:位置固定,无法迁移,主要用于核心内核分配。
  • reclaimable:不能直接移动,但可以通过kswapd回收。
  • movable:可以随意迁移,用户空间应用程序的页属于此类。
  • 将页面分类后,内核将它们组织到不同的链表中,以减少不同类型页面之间的干扰。movable zone的概念被引入,其中movable zone是虚拟的,内核在运行时动态建立。这种分类方式能有效减少碎片化,优先分配unmovable页面,降低buddy分配失败的几率。

    数据结构与分类

    内核通过宏定义表示迁移类型:

    • MIGRATE_UNMOVABLE
    • MIGRATE_RECLAIMABLE
    • MIGRATE_MOVABLE

    fallbacks数组规定了不同类型页面链表的优先级顺序。当无法在指定类型中找到可用页面时,内核会依次尝试其他链表。这种方法能有效避免unmovable页面的碎片化问题。

    ZONE_MOVABLE

    ZONE_MOVABLE是一种虚拟内存区,主要用于可移动分配。其核心思想是将物理内存划分为两部分:

    • 一部分用于可移动分配。
    • 一部分用于不可移动分配。

    ZONE_MOVABLE内存可以从高端内存或普通内存中提取。其优点在于可移动分配不会影响不可移动区的碎片化。对于用户空间的页面映射和内核vmalloc分配等高需求场景,ZONE_MOVABLE提供了高效的内存分配策略。

    结论

    尽管ZONE_MOVABLE和页面分类方法显著缓解了物理内存碎片化问题,但仍存在不足之处。频繁的reclaimable分配会导致unmovable区的碎片化问题。因此,针对特定场景,可以采取以下优化措施:

  • 减少分配的连续页面数目。
  • 使用预分配策略,确保关键操作不会因分配失败而影响系统稳定性。
  • 这种方法虽然不完全解决物理内存碎片化问题,但能显著减少分配失败的可能性,提升系统性能。

    转载地址:http://tmjz.baihongyu.com/

    你可能感兴趣的文章
    MySQL 精选 60 道面试题(含答案)
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>