2013年(22)
分类: LINUX
2013-08-04 17:55:20
Q:块预留解决的核心问题?
A:ext2块预留解决的核心问题是同一个目录下多个文件同时增长时交错的分配磁盘块,导致文件的磁盘块在磁盘上是不连续的(同一个目录下的两个文件会使用相同的块组),虽然在ext2_find_goal()中
ext2_find_goal()
ext2_find_near()
colour = (current->pid % 16) * (EXT2_BLOCKS_PER_GROUP(inode->i_sb) / 16)
return bg_start + colour;
对多进程扩展文件时做了平均化处理,但是如果两个进程同时扩展文件时,仍然可能分配到相同的目标块,在没有块预留时,磁盘块将被交错的分配给两个文件,最糟糕情况下,同一文件中文件块号连续的两个块在磁盘上都是不连续的.ext2使用内存预留窗口的方法完美的解决了多文件同时写入时的交错问题.
Q:ext2块预留机制的实现方式?
A:当需要为文件分配数据块时,根据计算到的目标磁盘块号,为每个文件创建一个包含目标块的预留窗口(包含空闲磁盘块的区间),所有文件的预留窗口都不重叠,后续数据块的分配都在预留窗口中进行,以此保证后续分配给文件的磁盘块的块号是连续的,当预留窗口中的空闲块被用尽后,通过扩展原有的窗口或删除原窗口创建新窗口的方式,更新预留窗口,每个文件都只能有一个预留窗口.所有的这些预留窗口通过一颗在内存中的红黑树(每个文件系统一棵)来管理,文件关闭,删除,截断时预留窗口也同时从红黑树中删除.
Q:ext2当前使用的块预留机制与以前使用的预分配机制的区别?
A:使用块预分配方法为文件预分配数据块时会修改块组的空闲块位图,后续分配的目标磁盘块如果在预先分配的7个磁盘块中,无需修改空闲块位图,直接返回,如果不在预分配的7个块中,则需要修改空闲块位图,将预分配的数据块归还,在文件关闭,删除时也会将预分配的数据块归还.预分配最大的问题是与日志不兼容,如果为文件预分配了磁盘块,实际上已经将磁盘块占用,空闲块位图被记录到日志空间,在文件还打开的情况下,系统崩溃,重新挂载文件系统后,日志被恢复,会导致预留的磁盘块会永远占据磁盘空间,无法被使用.而预留机制使用纯内存的方法完美的解决了分配连续磁盘块的问题.