自己写bitmap

备注:1.原创文章,转载请标明出处;

         2.欢迎建议和意见

         3.我的实现是C语言,为了保护公司隐私,下述数据类型被我改了。实际上int应改是无符号4个字节的类型,byte是有符号1个字节,才能保证移植性

         4.不贴源码,喜欢的话自己实现~~

在实现一个资源管理模块的时候,需要用到bitmap,但看了下系统的bitmap太复杂,太啰嗦,所以没有参照系统的,自己实现了,内存性能都还不错,

先说思想:把数字根号后变成加法

先说约束:目前由于只供自己模块使用,所以没有做成通用的,当前一个bitmap最大只允许8000个数据,当然很容易扩展成灵活的。

再说成果:1.内存,以8000为例,总共消耗内存(4*8 + 8000/8)/1024 = 1M

              2.性能。这两天做了测试,7600多申请或者释放,时间只有2ms,当然这也取决于cpu,我用的是pc机上的VM linux虚拟机,算比较普通

最后说实现:1.源信息是start和end

                 2.统计信息是count和set_count

                 3.状态信息是unit_count、last_unit_bytes、byte_count、last_byte_bits

                 4.位信息在bit_bytes

                 5.(1)“unit”是逻辑概念,我这里写死为30个byte,可以改为根据源信息个数调整

                    (2)上述“3.”中提到的各属性出现的原因是,源信息个数不一定是块(下面会有说明)的整数倍,所以要记录最后一个逻辑块有多少、最后一个byte有多少位信息

                    (3)具体实现查找空闲bit的方式是,1)查看bm是否没有空闲地址了;2)比较块是否全被占位(用),找到可用的块;3)在块中找到可用的byte;4)在byte中找到可用的bit,占位并修改统计信息

                    (4)如上所述,8000个地址查找最差循环数为8000/(30*8)+30+8=71,也就是说平均为36

概括下:上述中byte表示位的方式使得原本8000的数字变成1000+8,然后“块”(也就是unit)的出现使得1000变成30+34,最终本是30*34*8的8000变成了30+34+8

#define BM_MAX_RANGE_NUM         8000

#define BM_BYTES_BITS 8
#define BM_UNIT_BYTES_NUM 30 /* (BM_UNIT_BITS / BM_BYTES_BITS + 1) */
#define BM_UNIT_BITS (BM_UNIT_BYTES_NUM * BM_BYTES_BITS)
#define BM_FLAGS_FULL_SET_LEN (48)

static struct
{
byte byte_set_flags[8];
byte byte_full_set_flag;
byte unit_full_set_flags[BM_FLAGS_FULL_SET_LEN];
} g_bitmap_vars = { {0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1},
0xff,
{0Xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0Xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0Xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0Xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff,
0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff }};

typedef struct _bm_s_
{
    int  start;
    int  end;

    int  count;
    int  set_count;

    int  unit_count;
    int  last_unit_bytes;
    int  byte_count;
    int  last_byte_bits;
    byte    bit_bytes[0];
} BITMAP_T;

原文地址:https://www.cnblogs.com/muban/p/5056462.html