linux 伙伴系统

linux 伙伴系统

什么叫做伙伴,需要满足三个条件

1 page sieze 相等

2 地址是连续的

3 必须是同一个大块里面分配出来的

伙伴系统的分割

在这里插入图片描述

伙伴系统的合并

在这里插入图片描述

迁移类型

迁移类型描述例子
UNMOVEBLE
不可移动页面
在内存中规定的位置不能移动到其他的地方内核自身使用的内存,比如说GFP_KERNEL分配的
MOVEBLE
可移动页面
可以随意移动malloc分配的匿名页面
RECLAIMABLE
可回收的页面
不能直接移动,但是可以删除映射自文件的page cache

行为修饰符

标志描述
GFP_WAIT分配器可以睡眠
GFP_HIGH分配器可以访问紧急的内存池
GFP_IO不能直接移动,但可以删除
GFP_FS分配器可以启动文件系统IO
GFP_REPEAT在分配失败的时候重复尝试
GFP_REPEAT分配失败的时候重复进行分配,直到分配成功为止
GFP_NOFAIL分配失败时不允许再尝试

zone修饰符

标志描述
GFP_DMA从ZONE_DMA中分配内存
GFP_HIGHMEM可以从ZONE_HIGHMEM或者ZONE_NORMAL中分配

常用的分配标志

标志描述
GFP_ATOMIC分配过程不允许睡眠,通常用在中断处理程序、下半部、持有自旋锁等不能睡眠的地方
GFP_KERNEL常规的内存分配方式,可以睡眠。
GFP_USER常用于用户进程分配内存
GFP_HIGHUSER需要从ZONE_HIGHMEM开始进行分配,也是常用于用户进程分配内存
GFP_NOIO分配可以阻塞,但不会启动磁盘IO
GFP_NOFS可以阻塞,可以启动磁盘,但不会启动文件系统操作

gfp_mask zone 迁移类型的关系

系统会优先使用ZONE_HIGHMEM,然后才是ZONE_NORMAL

怎么通过GFP知道需要从那个迁移类型中分配?

static inline int gfpflags_to_migratetype(const gfp_t gfp_flags)
{
	VM_WARN_ON((gfp_flags & GFP_MOVABLE_MASK) == GFP_MOVABLE_MASK);
	BUILD_BUG_ON((1UL << GFP_MOVABLE_SHIFT) != ___GFP_MOVABLE);
	BUILD_BUG_ON((___GFP_MOVABLE >> GFP_MOVABLE_SHIFT) != MIGRATE_MOVABLE);

	if (unlikely(page_group_by_mobility_disabled))
		return MIGRATE_UNMOVABLE;

	/* Group based on mobility */
	return (gfp_flags & GFP_MOVABLE_MASK) >> GFP_MOVABLE_SHIFT;
}

per-cpu页面分配

内核经常请求和释放单个页框,网卡驱动

在分配和释放页面的使用需要申请 zone->lock

​ 为了提高单个页框效率,内核建立了per-cpu页面高速缓存池,高速缓存池里面存的是若干个预先就已经分配好的页框.

如果需要请求单个页框,就可以直接去高速缓存池获取,不需要申请锁,也不需要进行页框分配操作.极大的提高了单个页面分配的效率

struct per_cpu_pages {
	int count;		/* number of pages in the list */
	int high;		/* high watermark, emptying needed */
	int batch;		/* chunk size for buddy add/remove */

	/* Lists of pages, one per migrate type stored on the pcp-lists */
	struct list_head lists[MIGRATE_PCPTYPES];
};
struct zone {
	/* Read-mostly fields */
/*读敏感域*/
	/* zone watermarks, access with *_wmark_pages(zone) macros */
	unsigned long _watermark[NR_WMARK];//水位管理  high low mini
	unsigned long watermark_boost;

	unsigned long nr_reserved_highatomic;

	/*
	 * We don't know if the memory that we're going to allocate will be
	 * freeable or/and it will be released eventually, so to avoid totally
	 * wasting several GB of ram we must reserve some of the lower zone
	 * memory (otherwise we risk to run OOM on the lower zones despite
	 * there being tons of freeable ram on the higher zones).  This array is
	 * recalculated at runtime if the sysctl_lowmem_reserve_ratio sysctl
	 * changes.
	 */
	long lowmem_reserve[MAX_NR_ZONES];
/*管理zone 常用信息*/
	struct pglist_data	*zone_pgdat;
	struct per_cpu_pageset __percpu *pageset;

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux中的伙伴系统是用于管理内核空间的物理页框分配和空闲页框管理的重要组件。其设计原理主要有以下几个方面: 首先,伙伴系统将内存以固定大小的页框为单位进行管理。这些页框按照2的幂次的大小进行划分,形成不同大小的伙伴可用页块链表。通过这种分配方式,伙伴系统可以通过合并和分割来满足不同大小的内存需求,提高内存的利用率。 其次,伙伴系统采用了分配与释放的对称原则。当需要分配页框时,伙伴系统根据所需内存大小从对应大小的伙伴可用页块链表中选择合适的页框进行分配。而当释放页框时,伙伴系统会检查其相邻页框是否也是空闲的,如果是,则将其合并成更大的伙伴可用页块,加入到对应大小的链表中,以便后续分配时能够直接满足大内存需求。 此外,伙伴系统还引入了页框的分级机制。通过将内存页框划分为不同的级别,使伙伴系统能够根据页框的大小进行高效管理和分配。这种分级机制也方便了内存的回收和重新分配,提高了内存管理的效率。 最后,伙伴系统还采用了位图数据结构来管理每个页框的分配和释放状态。通过设置位图的对应位标记来表示页框的使用情况,方便快速查找空闲的页框并进行分配。 综上所述,Linux中的伙伴系统通过划分页框、对称分配与释放、分级管理和位图数据结构等设计原理,实现了高效的内存管理和分配策略,提高了系统的性能和资源利用率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DipsyHu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值