ext4 mballoc之buddy算法

EXT4文件系统采用buddy算法管理磁盘块,通过datablockbitmap和buddybitmap进行空闲块的跟踪。内存中维护的buddybitmap加速了访问,并在初始化时通过ext4_mb_generate_buddy生成,记录连续空闲区域信息。该过程涉及磁盘读取、页缓存和位图操作,避免碎片并优化分配效率。
buddy bitmap 

根据《Ext4文件系统介绍 - 理论篇_nginux的博客-优快云博客》我们知道磁盘上有1block 大小(默认4K)data block bitmap,每bit位代表一个block的使用情况,1代表占用,0代表空闲。data block bitmap 可以表示4 * 1024 * 8 = 32768个block,32768 * 4K = 128M正好是1个block group大小。为了加速data block bitmap访问内存中同样会有一份缓存

磁盘block管理为了尽量避免碎片化问题,跟内存管理模块一样同样采用了buddy算法,同时内存构建一个buddy的bitmap,即bitmap buddy。

cat /proc/fs/ext4/xxx/mb_groups 

代码在:fs/ext4/mballoc. :
static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)

#group: free  frags first [ 2^0   2^1   2^2   2^3   2^4   2^5   2^6   2^7   2^8   2^9   2^10  2^11  2^12  2^13  ]
#0    : 18017 2     4262  [ 1     2     1     1     1     2     0     0     0     1     1     0     0     2     ]
#1    : 26581 5     2125  [ 3     3     1     1     2     1     0     1     1     1     1     0     0     3     ]
#2    : 32713 2     27    [ 3     1     3     1     1     1     0     1     1     1     1     1     1     3     ]
#3    : 32639 1     129   [ 1     1     1     1     1     1     1     0     1     1     1     1     1     3     ]
#4    : 24576 1     8192  [ 0     0     0     0     0     0     0     0     0     0     0     0     0     3     ]
#5    : 32634 3     130   [ 2     4     2     3     1     2     2     1     2     0     1     1     1     3     ]
#6    : 32749 1     19    [ 1     0     1     1     0     1     1     1     1     1     1     1     1     3     ]
#7    : 32639 1     129   [ 1     1     1     1     1     1     1     0     1     1     1     1     1     3     ]

free:代表group所有空闲block总数,该值来自于ext4_group_info.bb_free

frags :代表group连续的空闲空间段数目,该值来自于ext4_group_info.bb_fragments

first : 第一个空闲的physical block number该值来自于ext4_group_info.bb_first_free

ext4_mb_seq_groups_show:

 结合代码和上面分析我们知道打印数值来自于ext4_group_info,即通过ext4_get_group_info来获取的:

 最终ext4_group_info来自于EXT4_SB(sb) ext4_sb_info中的成员s_group_info[group],所以s_group_info成员初始化来自哪里?ext4_mb_init_cache,而是ext4_mb_load_buddy就会调用ext4_mb_init_cache,这里init cache就是指保存磁盘data block bitmap的pagecache和buddy bitmap。

ext4_mb_load_buddy->ext4_mb_init_cache->ext4_mb_generate_buddy。

根据ext4_mb_init_cache的代码注释我们知道磁盘data block bitmap和只是内存中构建的(磁盘上无对应数据,unmount时会删除)的buddy bitmap,他们各占用1个block。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值