一个高效的固定大小内存池管理算法
这两天,在改一个既有程序的内存池管理算法,原有的管理算法基于固定内存最大块管理,块的尺寸固定为最大可利用内存大小,在大部分的情况下内存利用率非常低。
为此打算找一个高速的内存利用率高的算法。先是看了看FastMM,代码太复杂,使用了太多的汇编语言,过于庞大,接近8000行代码。于是放弃,找来找去,发现sqlite的内存池管理算法还是挺牛叉的。它是基于二分策略的,每一个内存块的大小是2的指数。
内存池初始化:
内存Block1Block2 .... Block N
大小 2 2^2 .... 2^n
内存分配·:
例: 分配34Byte、34=2^5+2 ,搜索Block大小是2的6次方的Block,如果没有使用就使用。
内存Block5 Block6 .... Block N
大小 2^5 2^6 .... 2^n
↑(若未使用,就是用)
如果2的6次方Block已使用,则找到2的7次方块,将其等分后使用分割后的2的6次方。
内存Block6 Block7 .... Block N
大小 2^6 2^7 .... 2^n
↑(使用) ↑(分割成2块)
如果2的7次方块也已使用,则依次类推,寻找下一个大的未使用的块,并分割使用。
这个方法的好处是
1.内存利用率高,理论最小内存利用率是2^(n-1)+1/2^n,总是大于50%。
2.内存分配时,内存块不需要移动,速度非常快,同时不会产生内存碎块,稳定性很好,适合做游戏开发,呵呵。