[发明专利]一种可动态调节的内存池在审
申请号: | 201410134586.0 | 申请日: | 2014-04-04 |
公开(公告)号: | CN103902466A | 公开(公告)日: | 2014-07-02 |
发明(设计)人: | 张在理;王倩 | 申请(专利权)人: | 浪潮电子信息产业股份有限公司 |
主分类号: | G06F12/02 | 分类号: | G06F12/02 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 250014 山东*** | 国省代码: | 山东;37 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 动态 调节 内存 | ||
技术领域
本发明涉及计算机内存管理机制,具体地说是一种可动态调节的内存,使用适当的重新设计来解决频繁申请和释放内存带来的内存利用率和系统效率降低的问题。
背景技术
现今的操作系统中,对内存的使用已经成为是程序员最棘手的问题,对内存的释放与申请内存长度不同等不当使用往往会造成程序崩溃、内存泄漏,也可能会出现由于内存越界导致的数据不正确等各种诡异问题。各种语言的自动内存回收等机制也被不断开发出来。即便是能能正确的申请和释放内存,当频繁进行申请和释放也可能会造成以下两个问题。一是对效率的影响,申请和释放内存在操作系统能够内部需要做很多处理,效率往往不高。二是由于系统内存分配机制问题造成,当用户请求一个内存单元小于一个页时,系统会在内存页上分配内存,但当另一个内存请求大于上个页的剩余空间时,系统会在新的页上分配所请求的内存空间,此时第一个页的剩余空间就会形成碎片,形成大量内存碎片后会导致系统运行效率下降,甚至导致程序不能运行。像很用于频繁接收请求并发送处理结果的网络服务器更容易出现问题,系统会很快的耗尽内存使系统运行效率逐渐降低,最后不能处理请求。
频繁申请和释放内存单元会对降低效率,增加cpu开销,可以使用事先分配足够多内存单元方式降低申请和释放的开销,但事先分配内存单元的缺点是我们并不确定我们将要使用的内存单元大小,如果频繁需求的内存大小远远小于事先分配的内存单元,则会造成内存单元的巨大浪费,同时如果事先分配太多内存到内存池,当用户没有频繁的内存请求时会造成系统和应用程序也不能使用此部分内存,同样造成内存的浪费。此方法虽然可以解决内存碎片化的问题,但仍然不是有效的解决方法。
发明内容
通过以上分析,内存的事先分配和用时分配都不是最好的解决方式,所以应该通过设计一种中间方式,使用一种使用时分配内存,使用完成后不立即释放内存的方式,当程序再次申请类似大小的内存单元时,将之前申请的内存直接给新请求使用,即实现一种折中的程序自己维护的内存池方式来解决以上两种问题的不足
内存池包括一个双向链表头数组和对各链表头进行互斥访问的互斥体数组。每个链表头和互斥体配对使用。每个双向链表头是为了组织各长度相同的内存单元,不同的链表头组织不同长度的内存单元,由于链表的删除和添加新的存储单元时需要互斥访问,所以需要对应的互斥体数组。指针数组的长度和互斥体数组的长度相等,其取决于请求的内存单元范围和内存单元长度间隔。越小的内存单元间隔会使内存利用率越高,但互斥的几率就会越高,效率会越低。
一种可动态调节的内存池,实现了初始化、销毁、申请、释放和扫描例程,
初始化例程负责链表数组和互斥体数组的初始化和扫描线程的初始化;
销毁例程,负责销毁周期扫描线程,销毁双向链表头数组和对应的互斥体数组;
申请例程负责首先试图从内存池链表获取内存单元,当没有合适的内存单元时从系统内存申请;
释放例程负责将用户释放的内存重新放入存储池,插入链表中;
扫描例程负责定时扫描各链表,查找长时间没有使用的内存单元,并释放后归还给系统内存;
使用时分配内存,使用完成后不立即释放内存的方式,当程序再次申请类似大小的内存单元时,将之前申请的内存直接给新请求使用。
本发明所产生的有益效果是:
以链表为基础以延迟释放来提高系统效率,降低内存使用过程产生的内存碎片,实现以双向链表头数组组织不同长度的内存单元,以互斥体数组的元素实现对各链表的互斥访问的内存池,改进了程序频繁申请和释放造成效率降低和内存碎片的问题。
附图说明
附图1是本发明的内存管理例程图。
具体实施方式
一种可动态调节的内存池,实现了初始化、销毁、申请、释放和扫描例程,
内存管理例程:
初始化例程,在内存池使用之前需要先进行初始化的操作,构造双向链表头数组并构造对应的互斥体数组,初始化注册一个扫描线程,设定扫描线程周期时间。
销毁例程,负责销毁周期扫描线程,销毁双向链表头数组和对应的互斥体数组。
内存单元申请,根据需要的内存长度len,2^(n-1)<len<=2^n,计算n的值,将n作为链表头数组索引,查看链表头索引的链表上是否有内存单元,如果有空闲内存单元,则从系统申请长度为2^n的内存单元,如果有空闲单元,则对链表加锁,从链表获取此内存单元使用。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于浪潮电子信息产业股份有限公司,未经浪潮电子信息产业股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201410134586.0/2.html,转载请声明来源钻瓜专利网。
- 上一篇:监狱高压电网高压输出检测电路
- 下一篇:一种单体电压采集电路