自己写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;
自己写bitmap的更多相关文章
- Raid1源代码分析--写流程
正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio.假设盘阵中有N块盘.然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆 ...
- MD中bitmap源代码分析--设置流程
1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1) 同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志.而在下发写请求给磁 ...
- 截图原理(一)——Android自动化测试学习历程
把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的 ...
- 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap
一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...
- Replication的犄角旮旯(三)--聊聊@bitmap
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Android图片缓存之Bitmap详解
前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...
- DIB位图(Bitmap)的读取和保存
设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...
- 问题解决——MFC error RC2170: bitmap file res\XXXXXXX.png is not in 3.00 format
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- android BitMap回收
第一种方法--及时回收bitmap内存: 一般而言,回收bitmap内存可以用到以下代码 if(bitmap != null && !bitmap.isRecycled()){ bit ...
随机推荐
- (转)mtr命令详解诊断网络路由
原文:https://blog.51cto.com/6226001001/1941355 http://www.zzbiji.com/2212.html----Linux下使用mtr做路由图进行网络分 ...
- Linux编程 7 (实时监测进程 top, 结束进程kill,killall)
一. 实时监测进程 top 在一篇里讲到ps命令在收集进程信息时非常有用,但它只能显示某个特定时间点的信息.想要观察那些频繁换进换出的内存进程趋势,用top命令是合适的.使用top命令如下图所示: 在 ...
- zabbix 监控基础
一.监控系统基础概念 1.监控系统的工作内容 数据采集 --> 数据存储 --> 数据展示 --> 报警 传感器 时间序列数据 趋势图 采集到的数据超出阈(yu)值 2 ...
- 面试:C++实现访问者模式
参考:深入应用C++11,访问者模式 #include <iostream> class ConcreteElement1; class ConcreteElement2; class V ...
- 红黑树深入剖析及Java实现
红黑树是平衡二叉查找树的一种.为了深入理解红黑树,我们需要从二叉查找树开始讲起. BST 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小, ...
- 浅谈Java泛型中的? extends E和?super E
https://blog.csdn.net/zymx14/article/details/78073757
- Linux进程间通信(System V) --- 消息队列
消息队列 IPC 原理 消息队列是消息的链式队列,如下图为消息队列的模型.整个消息队列有两种类型的数据结构. 1.msqid_ds 消息队列数据结构:描述整个消息队列的属性,主要包括整个消息队列的权限 ...
- c# 虚拟路径转换为绝对路径
/// <summary> /// 解析相对Url /// </summary> /// <param name="relativeUrl">相 ...
- VB.NET datagridview的操作
'空值判斷 If IsDBNull(DataGridView1.Item(1, 1).Value) = True Then DataGridView1.Item(1, 1).Value = " ...
- (2)Jquery1.8.3快速入门_checkbox全选取消部分选中
1. jquery示例功能: checkbox多选框 全选 .全不选. 选择部分. 源码 : <!DOCTYPE html> <html> <head> <m ...