memory management

来源:互联网 发布:龙虎看盘软件下载 编辑:程序博客网 时间:2024/06/09 21:38

系统的malloc() 以及free() 其实速度不快 毕竟关系到kernel mode的切换 以及系统内存管理

在某些极端情况下,可以自己做内存管理(例如写个myMalloc() 以及myFree() 取代原本系统)

一次跟系统要一大块memory 自己管理

  *在手机上运行JVM

   *search engine 内核

   *大数据运算

实际测试中 自己做的myMalloc() /myFree() 可能比原系统malloc()/free()快20倍~400倍

*看使用的方法 系统 cimpiler 硬件

---------------------------------------------------------------------------------------------------------------------------------------

1.建立tree/hash table

*小块内存 大量次数

*也许每次只要几十个bytes  但是也许是千万次

2.需要大块内存

*读入一段数据/一file

*也许一次需要Mb 但是次数不懂


至于提升速度的情况是1

至于情况2 直接调用系统原本的malloc/free() 就好啦

-----------------------------------------------------------------------------------------------------------------------------------

方法一myMalloc

一次要一块大内存(10Mb)

有一个available的linked-list

*记录目前没有被使用的内存区块

有一个used的linked-list

*记录目前正在被使用的内存区块

加一个pool,里面放空的node(s)

myMalloc(size_t t)的时候

*available里面找出>=t的node

*修改available挖出一块t

*新增一个node放到used,返回这个地址

*如果找不到,直接调用malloc

---------------------------

myFree(void *addr)

如果addr不再N~N+10Mb

*使用系统的free()

在used里面找addr

*找不到的话就算了

找到的话,将node移出used 加入available

比较available前后,是否要做合并的动作

-----------------------------

合并动作merge

1.必须放在avaible第一个

*检查是否与后面那个相连(是)

  ->与后面合并->node放回pool

*不相连 node放在available第一个 重设available

2.与前后皆相连

*与前面的合并(前+node+后)

*把node+后 放回pool 

3.与后面相连

*与后面合并,然后node放回pool

4.与前面相连

*与前面合并,然后node放回pool

5.都不是,node插入正确的位置

-----------------------------------------------------------------------------------------------------------

方法一优点

1.内存空间充分运用

2.很适合小块内存但是大量次数

3.10Mb不够的时候,可以考虑加一块10Mb

缺点

1.每次myAlloc/m yFree都要修改至少两个list  available used两个list

2.写起来复杂

3.速度不快

--------------------------------------------------------------------------------------------------------------

原创粉丝点击