一种高效的先进先出数据池读写方法技术

技术编号:3872520 阅读:193 留言:0更新日期:2012-04-11 18:40
一种高效的先进先出数据池读写方法,其具体如下:写入数据时包括如下步骤:步骤一:建立一个数据内存池,该内存池是从内存中划分若干内存块,内存块由头部开始写入数据,并由尾部建立管理数据,由内存块组成一个循环链表;步骤二:当用户申请大小为buffer.len的内存时,依链表顺序判断当前内存块是否满足条件,是则执行步骤三,否则执行步骤四;步骤三:向该满足条件的当前内存块写入数据buffer.len,并在该内存块尾部建立相应的管理数据,所述管理数据占用固定大小的字节数;步骤四:继续判断下一个内存块是否满足条件,是则执行步骤三,否则继续判断下一个内存块是否满足条件,直到所有内存块均不满足条件时,结束。

【技术实现步骤摘要】

本专利技术涉及计算机领域,尤其是一种高效的先进先出数据池算法。
技术介绍
在手机上开发流媒体应用程序时,我们经常会遇到一个问题,那就是内存 的申请和释放的问题,频繁的申请和释放内存会导致系统出现内存碎片,进而 增加系统不稳定因素。手机、PDA等移动终端的应用非常广泛,由于这些终端的资源的限制, 并且内存使用频率很高,如何解决频繁申请和释放内存块的问题,从而提高手 机等内存受限机器上应用的稳定性,是人们一直关心的待解决问题。目前,对于手机、PDA等移动终端的内存分配方法主要有两种, 一种是 固定长度的内存分配策略,另一种是可变长度的内存分配策略。对于固定长度的内存分配策略,该方法是先把内存划分为几个区,每个区 又划分为大小相等的内存块,例如第一个区的内存块为32K,第二个区的内存 块为64K等,当用户申请一定大小的内存时,扫描各个内存区,找到不小于 一定大小的内存块所在的区,从该区中提取一个内存块分配给用户,用户释放 内存时,再将该内存块归还其所在的区。这种方法的缺点是,如果满足条件内 存区的内存块已经用完,则内存申请失败。即使其它区还有更大的内存块,也 不会分配给用户。这样,使得内存得不到充分利用而造成浪费。对于可变长的内存分配策略,该方法将空闲的内存 以链表的形式排列, 当用户申请一定大小的内存时,就从链表的头部开始搜索空闲内存块,若空闲内存块小于一定大小,则继续搜索,直到找到足够大小的空闲内存块,分配给 用户,用户释放内存时,就将释放的内存块放在链表的尾部。这种方法有明显的缺点。由于在手机、PDA等终端中,内存的分配与释放非常频繁,而且存在大量小内存的分配。使用这种方法,经过一段时间的运行后,小块内存将散布在整个内存,必然产生大量的内存碎片,这时,虽然系统还有很多剩余内存,用户却申请不到,造成内存浪费,甚至导致系统崩溃。鉴于此,实有必要提出一种改进的方法以克服现有技术的缺陷。
技术实现思路
本专利技术所要解决的技术问题在于克服现有技术中频繁的申请和释放内存 会导致系统出现内存碎片的问题。本专利技术提供,其特征在于写入数据 时包括如下步骤步骤一建立一个数据内存池,该内存池是从内存中划分若干内存块,内 存块由头部开始写入数据,并由尾部建立管理数据,由内存块组成一个循环链 表;步骤二当用户申请大小为buffer.len的内存B寸,依链表顺序判断当前内存 块是否满足条件,是则执行步骤三,否则执行步骤四;步骤三向该满足条件的当前内存块写入数据buffer.len,并在该内存块尾 部建立相应的管理数据,所述管理数据占用固定大小的字节数;步骤四继续判断下一个内存块是否满足条件,是则执行步骤三,否则继 续判断下一个内存块是否满足条件,直到所有内存块均不满足条件时,结束。通过该算法我们能够彻底的解决频繁申请和释放内存块的问题,从而提高 手机等内存受限机器上应用的稳定性附图说明图l为本专利技术内存数据池的示意图; 图2为本内存块A未写入数据时的结构示意图;图3为专利技术实施例中第一次往第一个内存块A写入1000字节数据20后的示意图4为内存块A第二次写入长度为1600字节的数据40后的示意图;图5为本专利技术方法流程框图。具体实施例方式下面结合附图1至图5来说明本专利技术具体实施。如图1所示,首先建立一个内存数据池100,该内存数据池由4个内存块(buf—block)A、 B、 C、 D构成,其中每个内存块容量均为64K,然后将这4个64k的内存块(buf—block)组成一个循环的链表,其中每个各个内存块内部是连续的64K内存,而数据A、 B、 C、 D之间可以连续也可以不连续。如下为先建立一些数据结构的C语言指令struct buf—block /*内存块结构*/struct buf—block* next; /*指向下一个内存块*/intw_pos; /*写操作管理数据地址变量*/intr_pos; /*读操作管理数据地址变量*/};struct buf—jpool /*内存池结构*/struct buf_block* start;/*内存块初始化*/struct buf_block* r_block; /*内存块读出块*/struct buf—block* w—block; /*内存块写入块*/};如图1中内存块A所示,建立的内存块A容量为64Kb,每次从内存块的起始位置(或者说是头部位置)开始存储数据,而在每次存储数据的同时,在内存块A的尾部分配4字节的空间用于管理数据,该管理数据指示出所述每次存储数据的存储的偏移量和存储数据的长度,直到内存块A内存容量不能满足需求,例如,第一次存储数据时,在内存块A的头部位置根据数据长度分配存储空间用于存储第一数据,而在内存块A的尾部分配4字节空间用于存储第一数据管理数据;在第二次存储数据时,从第一次存储数据空间的末尾作为第二次存储数据的起始位置,并在内存块A的尾部仍然分配4字节空间用于存储第一管理数据和第二管理数据。同样地,内存块B、 C、 D每一次存储数据时,同时也分别在内存块的尾部分配4字节的空间用于管理数据。寻找内存块的顺序依照链表顺序,即A~~>B~>C——>D——>A,当A满足内存需求时,选择A,如果A不满足则看B是否满足,如果是,则选择B,依次类推。因为每次向buf—block写入储存数据的大小都不一致,所以我们要记录每个存储数据的大小,在这里我们利用每个buf—block的尾部作为动态反向数组,即从内存块的尾部开始保存管理数据,用这个管理数据来保存每个内存块的大小和保存的位置,我们将这个动态反向数组称为管理数据,动态反向数组的长度称为管理数据的长度,每个管理数据的长度即上述所占用的4K字节。以下先说明往数据池写入数据的过程请继续参照图1, 一开始的时候,数据池100包含的内存块A、 B、 C、 D的空间全部为空闲状态,<formula>formula see original document page 7</formula>即开始内存块A内的写入块和读取块都初始化。此时每个内存块buf一block的w_pos和r_pos都为0。在写入数据前,我们先要判断要写入的当前内存块A的数据大小buffer.len:判断方法如下If (buffer.len<64k — (w_pos ( pos) +w_pos (len))-4) (1)可以写入Else不可以写入其中w_p0S指进行数据写操作时的管理数据,总共占4字节,包括占2字节用于记录偏移量wjos( pos)和2字节用于记录数据长度wjos (len),w_pos ( pos) +w_pos (len)指的是将偏移量和数据长度相加。为了更好地说明写入数据的过程,如图2所示,第一次往数据池buf_p00l中写数据时,我们找到第一个buf一block即内存块A,该内存块的w_pos = r_pos-O所指位置均是内存块A尾部的起始位置,图中101是i:jx)S所指位置,102是wjos所指位置,证明该buf—block是新的,先通过公式(1)先判断内存块A的空闲状态,此时w_pos的w_pos ( pos)和wjos (len)都为0,因此第一次存入数据本文档来自技高网
...

【技术保护点】
一种高效的先进先出数据池读写方法,其特征在于:写入数据时包括如下步骤:  步骤一:建立一个数据内存池,该内存池是从内存中划分若干内存块,内存块由头部开始写入数据,并由尾部建立管理数据,由内存块组成一个循环链表;  步骤二:当用户申请大小为buffer.len的内存时,依链表顺序判断当前内存块是否满足条件,是则执行步骤三,否则执行步骤四;  步骤三:向该满足条件的当前内存块写入数据buffer.len,并在该内存块尾部建立相应的管理数据,所述管理数据占用固定大小的字节数;  步骤四:继续判断下一个内存块是否满足条件,是则执行步骤三,否则继续判断下一个内存块是否满足条件,直到所有内存块均不满足条件时,结束。

【技术特征摘要】

【专利技术属性】
技术研发人员:汤敏
申请(专利权)人:深圳市融创天下科技发展有限公司
类型:发明
国别省市:94[中国|深圳]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1