位图实现

位图就是用每个字节中的bit位代表一组资源的映射。

例如:一个字节有8位,在操作系统中可以用一个bit位代表一个4K的页,那一个字节就可以代表8页32K内存。

可以利用位图进行资源管理或分配。

 

位图结构如下:

struct bitmap {
    unsigned int btmp_bytes_len;
    unsigned char * bits;
} ;

 

/* 判断bit_idx位是否为1,若为1则返回true,否则返回false */
 bool  bitmap_scan_test(struct bitmap* btmp, unsigned int bit_idx){
    unsigned char byteIndex =  bit_idx / 8;
    unsigned char bitIndex = bit_idx % 8;

    return btmp->bits[byteIndex] & (1 << bitIndex);
}

先找到要判断的bit位在哪个字节byteIndex

再计算属于本字节的第几位用%运算 bitIndex

 

int intbitmap_R_varr(struct bitmap * btmp,char n) {
    //先大范围匹配,暴力匹配筛选掉所有已经满额使用的bit
    unsigned int startInde = 0 ;
    while ((btmp->bits[startInde] ^ 0xFF) != 1) {
        startInde ++;
    }

    unsigned int bitCount = startInde * 8;  
    unsigned int endPosition = btmp->btmp_bytes_len * 8;

    char count = 0;
    while (bitCount < endPosition) {
        if (bitmap_scan_test(btmp, bitCount) == flase) {
            count++;
        } else {
            count = 0;
        }
        if (count == n) {
            break;
        }
        bitCount ++ ;
    }
    return bitCount - n + 1 ;
}

 

自己写的

 

下面是操作系统真像还原书中写的

户在位图中申请连续 cnt 个位,成功,因Jj 返回其起始位下标,失败,返回- */ 
21 int bitmap scan(struct bitmap* btmp, uint32_t cnt) { 
22 uint32_t idx_byte = 0; //用于记录空闲位所在的字节
23 舍先逐字节比较,蛮力法*/
24 while ( ( Oxff == btmp->bits [idx_byte]) 晶晶 (idx_byte < btmp->btmp_bytes_len)) { 
25 表示该位已分配,若为 Oxf ,则表示该字节内已无空闲位,向下一字节继续找*/
26 idx_byte++; 
27 
28 
29 ASSERT(idx_byte < btmp->btmp_bytes_len); 
30 if (idx_byte == btmp• btmp_bytes_len) { //若该内存池找不到可用空间
31 return -1; 
32 
33 
34 户若在位图数组范围内的某字节内找到了空闲位
35 *在该字节内逐位比对,返回空闲位的索引。*/
36 int idx_bit = 0; 
37 户和 btmp bi ts [ idx_byte ]这个字节逐位对比*/
38 while ( (uintB_t) (BITMAP_MASK < idx_bit) & btmp->bits [idx_byte]) { 
39 idx bit++; 
40 
41 
42 int bit_idx start = idx byte * 8 + idx bit; //空闲位在位图内的下标
43 if (cnt == 1) { 
44 return bit_idx_start; 
45 
46 
47 uint32_t bit_left = (btmp->btmp_bytes_len * 8 - bit_idx_start); 
//记录还有多少位可以判断
4 8 uint32_t next_bi t = bit_idx_start + 1; 
49 uint32_t count = 1; //用于记录找到的空闲位的个数
50 
51 bit_idx_start = -1; //先将其置为一 ,若找不到连续的位就直接返回
52 while (bit_left-- > 0) { 
53 if (!(bitmap scan test(btmp, next_bit))) { //若 next bit
54 count++; 
55 } else { 
56 count = 0; 
57 ) 
58 if (count == c nt) { //若找到连续的 cnt 个空位
59 bit_idx_start = next_bit - cnt + 1; 
60 break; 
61 } 
62 next_bit++; 
63 } 
64 return bit_idx_start; 
65 } 
66

 

posted on 2022-06-04 11:36  thotf  阅读(71)  评论(0)    收藏  举报

导航