自己写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 ...
随机推荐
- JavaScript中原型链的那些事
引言 在面向对象的语言中继承是非常重要的概念,许多面向对象语言都支持两种继承方式:接口继承和实现继承.接口继承制只继承方法签名,而实现继承继承实际的方法.在ECMAScript中函数没有签名,所以EC ...
- 【WebAPI No.2】如何WebAPI发布
介绍: Asp.Net Core在Windows上可以采用两种运行方式.一种是自托管运行,另一种是发布到IIS托管运行. 自托管 首先有一个完好的.Net Core WebAPI测试项目,然后进入根目 ...
- Docker总结(脑图图片)
- Modifying namespace in XML document programmatically
Modifying namespace in XML document programmatically static XElement stripNS(XElement root) { return ...
- Django 学习笔记(二) --- HTML 模版
人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...
- Linux进程间通信(System V) --- 共享内存
共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...
- centos每天自动备份mysql数据库
#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH #数据库用户名 db ...
- [转]ionic工作原理
本文转自:https://segmentfault.com/a/1190000011495654 1.Ionic的工作原理 Ionic通过cordova把一个Web应用嵌入原生应用 用户打开一个ion ...
- forfiles
关键命令就这一条了:forfiles.exe /p "D:\Kugou" /m *.tar /d -14 /c "cmd /c del @path" 这条命令的 ...
- Java静态成员与实例成员
Java静态成员与实例成员 类是一种类型,类中定义的所有成员都归此的对象所有,这些成员成为实例成员:而某些成员想要被所有类的所有对象共享,此时的成员不属于某个对象,而是属于整个类,这些成员成为静态成员 ...