本节内容依旧是对上节课伙伴系统的补充,主要介绍了新版伙伴系统的页面迁移相关的内容
为什么要引入页面迁移类型?新版本伙伴系统针对老版本的伙伴系统的升级改进。主要优化memory compaction内存碎片整理的过程。
页面迁移实际上就是伙伴系统中free_area[MAX_ORDER]结构体保存的链表指针将链表分类,如上图所示。并且页面在申请的时候也去考虑它的类型。将不可移动的放一块,可移动的放一块等等;
struct free_area {struct list_head free_list[MIGRATE_TYPES];//可以指向不同的页类型unsigned long nr_free;
};
1.查看页面迁移类型:
cat /proc/pagetypeinfo
- 可移动的:用户进程申请的内存
- 可回收的:文件系统的page cache
- 不可移动的:例如内核镜像区域的物理内存
2.为什么要引入迁移类型?
(1)对伙伴系统的改进,主要就是为了解决内存碎片。不仅仅是合并用户申请和释放后的地址空间,还需要考虑自身的内存布局去优化它。相当于对free_area[order]指向的区域,在次进行区域划分,可移动的从一个地方申请,不可移动的从另外一个地方申请等等。分类后,就可以随时对可移动区域进行优化,并且去修改页表。
3.内存碎片处理:memory compaction
- 碎片清理:可移动页面迁移
- memory compact的几种方式:
- 以同步方式压缩和迁移
- 压缩同步,迁移异步
- 以异步方式压缩和迁移
- 什么时候触发memory compaction?
- kcompacted守护进程
- memory compaction开销
- 手动触发:echo 1 > /proc/sys/vm/compact_memory
问题:注意,这些迁移工作由于需要重新更新页表,因此开销是很大的。