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。

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

被折叠的 条评论
为什么被折叠?



