备注: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;

自己写bitmap的更多相关文章

  1. Raid1源代码分析--写流程

    正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio.假设盘阵中有N块盘.然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆 ...

  2. MD中bitmap源代码分析--设置流程

    1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1) 同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志.而在下发写请求给磁 ...

  3. 截图原理(一)——Android自动化测试学习历程

    把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的 ...

  4. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

  5. Replication的犄角旮旯(三)--聊聊@bitmap

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  6. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  7. DIB位图(Bitmap)的读取和保存

    设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...

  8. 问题解决——MFC error RC2170: bitmap file res\XXXXXXX.png is not in 3.00 format

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  9. android BitMap回收

    第一种方法--及时回收bitmap内存: 一般而言,回收bitmap内存可以用到以下代码 if(bitmap != null && !bitmap.isRecycled()){ bit ...

随机推荐

  1. Sublime Text3自定义全部字体大小、字体类型和背景颜色

    一.定义侧栏的背景颜色.字体大小和间距 Sublime Text3的Afterglow主题链接为:https://github.com/YabataDesign/afterglow-theme 1.按 ...

  2. The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar报错

    缺少jstl依赖解析xml文件,报错jaspException 添加依赖如下: <dependency>              <groupId>jstl</grou ...

  3. 测试工具之RobotFramework关键字和快捷键

    RF中关键字很多,即使经常使用也有些关键字没有使用过,所以我们就需要记住一些常用的关键字,在使用中本人整理了部分关键字.快捷键和部分RF的常识 1.F5 如果只记得关键字部分,可以通过F5呼出关键字查 ...

  4. Docker hv-sock proxy (vsudd) is not reachable

    Docker hv-sock proxy (vsudd) is not reachable Docker hv-sock proxy (vsudd) is not reachable at Docke ...

  5. BF算法(模式匹配)

    BF算法 (Brute-Force算法) 一种简单的模式匹配算法,目的是寻找模式串p是否在目标串s中有出现. 思想:先从第一个字符开始匹配,如果p[j]==s[i],那么继续向下比较,一旦不相等,即回 ...

  6. python 多环境共存 基础

    正在学习python 使用的是3.3 但是由于种种原因吧 还得使用python2.7 所以记录一下 如何安装2个版本 假设 在windows 下面安装的python 版本 和路径 如下 python ...

  7. 喜大普奔,SITE4J网站上线啦

    喜大普奔,SITE4J网站上线啦: 你懂的:https://peterchenhdu.club/

  8. Java中的静态变量、静态方法问题

    由关键字static所定义的变量与方法,分别称为静态变量和静态方法,它们又都被称为静态成员 1.静态方法 无需本类的对象也可以调用此方法,调用形式为“类名.方法名”,静态方法常常为其他类提供一些方法而 ...

  9. 三对角线性方程组(tridiagonal systems of equations)的求解

    三对角线性方程组(tridiagonal systems of equations)   三对角线性方程组,对于熟悉数值分析的同学来说,并不陌生,它经常出现在微分方程的数值求解和三次样条函数的插值问题 ...

  10. 初始mvc4(一) 新建项目

    mvc4和mvc4.5基本大同小异,vs2012中已经集成了mvc,不需要手动安装了,现在就来看看如何新建mvc项目 一.首先打开vs2012,新建项目,选中web中mvc4 二.选择项目模板 这里面 ...