Chinaunix首页 | 论坛 | 博客
  • 博客访问: 127109
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 251
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-29 14:18
个人简介

不以物喜,勿以己悲;乐观向上,持之以恒。

文章分类

全部博文(25)

文章存档

2015年(25)

我的朋友

分类: LINUX

2015-07-23 00:27:11


Bitmap
中共有以下两个位图结构:
1. 磁盘位图,一级位图,保存在bitmap->filemap数组中,而bitmap->filemap_attr描述每个bitmap->filemap数组元素的状态;
    
说明:在md设备创建时,整个bitmap磁盘文件会被映射到内存,保存在filemap中,描述底层磁盘大小的位图,在这里1bit对应底层磁盘一个chunk;
            
其中filemap_attr数组每4bit对应filemap的一页(最小为sizeof(unsigned long))Bitmap->filemap[0]被保存在bitmap->sb_page中,描述超级块信息。
2. 
内存位图,二级位图,保存在bitmap->bp数组中,每一项数组元素中的map指针指向一个页,该页保存bitmap的一个内存位图结构(1page描述2048chunk)
   
说明:每个bp数组所描述的一个页(4096B)代表的2048chunk,即2B代表1个chunk,2B 16位用来描述下面的信息
            
NEEDED_MASK1<<(COUNTER_BITS-1)
           
RESYNC_MASK1<<(COUNTER_BITS-2)
            
COUNTER_MAXRESYNC_MASK-1

   注:COUNTER_BITS 16, 说明2B中高二位分别代表状态NEEDED_MASK和RESYNC_MASK, 剩下的14位做用来做统计计数的。


内存位图



这里以创建raid设备时指定bitmap_chunksize=512K,chunksize=64k=128sector(mddev->chunk)
每个成员盘大小为10485760-2048-128=10483584=blocks(mddev->dev_sector)为例,内存位图计算公式为:
1. bitmap->chunkshift=fzz(~bitmap_chunksize)=19
2. 整个磁盘大小用bitmap chunk表达,可以算出chunk个数和需要的page个数:
   a) chunks=(blocks+(bitmap_chunksize*1024>>9)-1)>>(bitmap->chunkshift-9)=(10483584+1024-1)/1024=10238;
      
说明:将chunksize换算成sector单位,使用此公式就可以算出需要的bitmap chunk个数chunks
   b) pages=(chunks + (PAGE_SIZE << 3)/ COUNTER_BITS - 1)/((PAGE_SIZE << 3)/ COUNTER_BITS)=(10238+2048-1)/2048=5
      
说明:用一个page(4096B)代表2048chunk,每个chunk占用2B2B 16bit长度用于描述每个chunk的状态

      
一个chunk对应md中的一个条带,在位图中一个chunk占用2B=16bit
1. 最高一位为是否需要同步标志,标志md对应条带是否需要同步;
2. 
后面一位标志指针对应条带是否正在进行同步操作;
3. 
低14位是一个计数器,表示对应条带内正在进行写操作的个数,其中0、1、2为特殊中,当为3时表示有1个写操作,4时有2个写操作,以此类推。

如下图所示:
* +----------------+---------------+------------------+
* | resync  needed | resync active |     counter      |
* |       (0-1)    |     (0-1)     |  (0-16383)       |
* +----------------+---------------+------------------+


磁盘位图



其计算公式如下:
1. 
Bitmap->filemap page个数计算公式:
   
Num_pages=((chunks + sizeof(bitmap_super_t)<<3 + 7) / 8) + PAGE_SIZE - 1) / PAGE_SIZE;
   
这个公式表示一个page的每一个size(0-4095B)代表8chunks相当于一个bit代表一个chunk
   
page指向bitmap->filemap[page_index]chunk的计算方法见内存位图部分。
2. 
bitmap->filemap_attr:可以用来描述bitmap->filemap[page]的状态,这里为每个page申请了4bit的内存空间,
   不过此部分计算时,最少申请的长度为
unsigned longfilemap的状态有:
   
BITMAP_PAGE_DIRTY=0;        //表示该bit位对应的数据已经写完,可以下刷到磁盘了
   
BITMAP_PAGE_CLEAN=1;        //表示该bit位需要清除
   
BITMAP_PAGE_NEEDWRITE=2;    //表示该bit刚刚被清除,数据需要向下刷


未完 -- 待续。


 
阅读(2153) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~