日期:2014-05-16  浏览次数:20636 次

用bitmap实现磁盘的读写监控
需要用C创建一个bitmap来实现对整个磁盘的读写监控。如果对一个磁盘块进行的操作是“写”操作,就在相应位置1,如果是“读”操作,则忽略。请问具体的数据结构怎样实现,如何在记录下“写”操作的同时,记录下相应磁盘块的位置。谢谢了。期待中……

------解决方案--------------------
2G需要500000个4k的块。一个int可以表示32个块。
可以
#defien MAX_BIT 500000/32
unsigned int bitmap[MAX_BIT]

就下来自己用就是了啊,还不是知道你想问的是什么。
------解决方案--------------------
Ext2 文件系统的硬盘布局:http://www.ibm.com/developerworks/cn/linux/filesystem/ext2/
从文件 I/O 看 Linux 的虚拟文件系统:http://www.ibm.com/developerworks/cn/linux/l-cn-vfs/
解析 Linux 中的 VFS 文件系统机制:http://www.ibm.com/developerworks/cn/linux/l-vfs/
Ext3 和 ext4 文件系统在线调整大小内幕:http://www.ibm.com/developerworks/cn/linux/l-cn-ext4resize/

你可以看看上面这些分析,主要针对核心的文件系统 ext2/ext3。
至于bit掩码和位置记录都比较简单,其中最简单的方式就是采用静态数组来实现
struct blk_log {
unsigned int bits[BLK_MAX / sizeof(unsigned int)]; // 记录读写掩码,为1时表明该数据块需要同步
unsigned int blks[BLK_MAX]; // 记录位置,可以是逻辑磁盘块到物理磁盘块的映射
};

如果磁盘块完全连续,那么貌似位置记录可以省略。只要知道起始磁盘块位置,就可以计算出当前位置吧...
------解决方案--------------------
#define SEC_MAX 
#define BIT_MAX 

struct sec_bitmap
{
unsigned int bit[BIT_MAX/32];
unsigned int sec[SEC_MAX];
};

index=
mysec_bitmap[s]->bit[index]=1;
mysec_bitmap[s]->sec[sector_number%SEC_MAX]=sector_number;