位图实现
位图就是用每个字节中的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
浙公网安备 33010602011771号