文件系统中bitmap组织方式的一些思考

前言:

之所以想到写这个问题是因为这个寒假要做的基于fuse框架的用户空间文件系统的操作系统课程设计,实现一个文件系统需要用bitmap来管理磁盘块,记录磁盘块的使用情况。所以bitmap的设计组织,维护是文件系统磁盘空间管理的重要部分。

除此之外,我这个寒假还有在做数据挖掘,然后我发现在大数据量的情况下可以利用bitmap思想来储存数据,压缩大量数据在内存中的占用空间,这就是bitmap算法的思想。

于是,如何组织bitmap成了一个关键问题,我这里只先说一下文件系统中的bitmap:

操作系统课本上说的bitmap是这样的:


图1.bitmap

每一bit代表磁盘中的一个block,标记该位需要使用到位运算;但我们知道在C/C++中一个char类型的变量一般占8bit也就是1Byte,一个int类型的变量一般是4Bytes=32bits;于是当我们想赋值某一位时出现两种情况;


图2.正排1
图3.正排2

一.如图所示我们可以从左到右去修改bitmap,这与我们教科书上所说的查找方式是一样的,从bitmap开头查到结尾;思想上很直观,但实现起来难度如何?

这里我们假设用一个unsigned int类型的变量去操作由图2变为图3我们可以用a=10000000 00000000 00000000 00000000

作b=a;a>>=1;a=a|b;得到,这就赋值了第二位,以此类推;但这个实现方式的问题是我们需要提前给a赋值一个最高位为1的数值,这个数字我们虽然可以计算出来,但是比较麻烦,这么看虽然不会带来什么问题;接下来我们讨论一下int类型去做操作。

图4.设置单独bitmap

同样我们给int a赋值同样是最高位为1的32位二进制数所代表的数值,我们需要知道int类型是有符号数,第一位是符号位,那么有符号数的右移位运算在C语言中执行的是算术右移;这意味着我们每移动一位前面填充的是符号位,在这种情况下由于最高位是1,所以右移填充1,这在我们单独设置bitmap中离散的1bit时会碰到大麻烦;而且对于不同的编译器有符号数实现的右移可能是不一样的。ps:无符号数实现的都是逻辑右移

第二种思路:

我们操作bitmap既然需要借助变量对字节进行移位操作,那我们可以设计一个新的组织方式,即bitmap中以byte为单位按照正常的从左到右的顺序排列,但是每个byte内部按照从右到左(低位到高位)的方式操作。


图5.倒排1
图6.倒排2

这会给我们产生一些方便,主要就是我们用左移即可完成操作,如图5、6;我们这么做:

int a=1;b=a;a<<=1;a=a|b;这样我们避免了数据类型差异导致右移方式差异的麻烦,也不需要计算最高位为1的数值是多少;在这种操作模式下我们可以先对offset(偏移值);除8取出byte_index;然后%8取余数即是byte内的bit号(也就是左移的位数);直接左移即可。

结语:

在实现文件系统的过程中,我其实两种bitmap组织方式都写过,一开始写的是正常的课本上那种方法,写的时候就碰到了麻烦,然后变成了研究C语言的移位操作, 算是复习了C加深了一些印象,后来我查资料问了同学,发现还有第二种组织办法,又写了一遍,事实证明第二种方法写起来没有那么多麻烦。

你可能感兴趣的:(文件系统中bitmap组织方式的一些思考)