一种内存池版图解析方法和内存池装置的制造方法_2

文档序号:9929437阅读:来源:国知局
效率和提尚内存的利用率。
[0045]在设计文件中GDSII文件中数据主要是以模块结构(STRUCTURE,对应于版图中的CELL,也称之为单元)的形式组合而成的。每个模块除包含若干称之为图素(ELEMENT)的几何图形外,还可以在该模块中插入多层次的模块参数。具体地说一个GDSII文件的所有数据都是由一连串的数据块链接组成的(为方便以16进制形式显示)。模块结构内容如图1所示,包括:模块结构名、图素信息、插入模块结构名、插入模块变换模式、层号名、数据类型、图素参数以及图素坐标等数据块,这些数据块分别定义了文件头、库文件头、文件库名、数据单位、模块结构头、模块结构名、图素头、层名、数据类型、图素参数、图素坐标、图素尾、模块结构尾、第二个模块结构头、第二模块结构名、插入模块结构名(也是图素的一种)、插入模块变换模式、图素尾、第二个模块结构尾等,最后以文件末尾结束整个文件。
[0046]现有技术中版图解析流程中,在解析模块结构中图素的信息时,需要频繁的向系统申请内存空间,随着晶体管的特征尺寸进入到纳米尺寸以后,电路的复杂度越来越高,规模也越来越大,GDSII的容量规模呈直线上升趋势。其中模块结构中的图素信息也将大大增加,应用程序为存储图素信息,他需要创建一个图素对象,并初始化操作。例如一个大小为IG的版图,其顶层cell的图素数量能够达到上亿级别,如此庞大数量的图素对象的动态创建与初始化,带来了很大的系统开销。
[0047]因此本发明实施例公开了一种内存池版图解析方法,应用于具有多个大小结构相等的内存块的内存池装置中,参见图2,其流程包括:
[0048]步骤SlOl:获取应用程序向系统发送的操作指令;
[0049]步骤S102:判断所述操作指令的指令类型;
[0050]步骤S103:当所述操作指令为内存分配需求指令时,判断当前使用的内存块中是否存在空闲的内存单元,如果否,执行步骤S104;
[0051 ]步骤S104:向系统发送添加内存块指令;
[0052]步骤S105:在获取到系统依据添加内存块指令添加的内存块后,采用指针添加的内存块与内存池中原有的内存块进行链接;
[0053]其中,所述系统依据添加内存块指令添加的内存块与内存池中原有的内存块的结构相同。
[0054]通过本申请上述实施例公开的方法可见,在本申请上述实施例公开的方法中,其无论存储何种大小的图素信息时,其采用的内存块的大小以及所述内存块中内存单元的大小均是一定的,只是当图素信息较大时,其所占用的内存单元或内存块的数量较多,因此避免了现有技术中在针对任意图素信息的操作使用new、delete(删除)、mal1c、free等API申请分配和释放内存过程中由于所申请内存块的大小由所述图素信息本身决定,导致在处理超大版图时,程序长时间运行时,频繁使用而产生大量的内存碎片从而降低程序和操作系统的性能的问题。
[0055]当应用本申请上述实施例公开的方法时,当有新的图素对象创建的请求到来时,系统会判断当前使用的内存块中是否存在空闲的内存单元,其具体判断过程可以为:内存池会通过blockList指针遍历内存块链表的方法,直到找到还有自由分配单元(空闲的内存单元)的内存块,其中检测是否还有空闲的内存单元的方法主要是通过检测各个内存块结构体的bFree的值是否大于O的方式判断内存块是否具有空闲的内存单元的,如果被检测的内存块的bFree的值大于0,则证明该内存块中具有空闲的内存单元,否则,该内存块中不存在空闲的内存单元。如果程序找到具有空闲的内存单元的内存块后,提取该内存块的bFirst值(所述bFirst值为该内存块中第I个可供分配的空闲的内存单元的编号),然后根据这个编号定位到该空闲的内存单元的起始位置,这个起始位置就是用来满足此次内存申请请求的内存的起始地址,此时该内存单元的bFree的值减I。当然,为了保证在获取到下一个内存申请请求时,能够准确定位下一个空闲的内存单元的位置信息,在返回该空闲的内存单元的起始位置之前,还需要首先将下一个空闲的内存单元的内存地址(编号)重新赋值给所述bFirst,这样当下一次的内存申请请求到来时,就采用这个bFirst的值对应的内存单元来满足本次请求,同时还需要将此内存块的bFree值递减I,然后再将已经分配到的内存单元的起始位置作为此次内存单元请求的返回地址返回给调用者。
[0056]若果应用程序进行内存请求时,如果从现有的内存块中找不到一个可分配的空闲的内存单元时(即当进行第一次请求内存时,以及现有的所有内存块中的所有内存分配单元都已经被分配时),对象内存池就会从进程堆中申请一个内存块,但是在本申请上述实施例公开的方法中,当新的内存块申请完成后,并不会立刻将刚申请的内存块的一个空闲内存单元分配出去,而是首先初始化这个内存块。所述初始化内存块的操作主要包括设置内存块的bSize为所有内存分配单元的大小、其bFree的值设置为η-1 (因为即将会分配一块内存单元出去,要么从设为n-1,在分配一个出空闲内存单元后无须再将η递减l)、bFirst的值为1(为I的原因与bFree为η-1大致相同,即马上会将编号为O的自由分配单元分配出去。现在设为I,其后不用修改nFirst的值),内存块的构造需要做初始化操作,即将所有空闲的内存单元链接起来。每一个空闲的单元的头两个字节用来存储下一个空闲的单元的编号。
[0057]当然用户在操作过程中难免会出现删除信息的操作,当一个被分配出去的内存单元因为删除操作需要回收时,即此时获取到的操作指令为删除指令,在本申请上述实施例公开的方法中,与所述删除指令相匹配的内存单元并不会直接返回给程序的进程堆,而是先返回给内存池。在返回内存池时,内存池依据该内存单元的起始地址遍历所维护的内存块链表,判断该内存单元的起始地址是否落在某个内存块的地址范围内,如果在内存池中没有找到相应的内存块,则表明这个被回收的内存单元就不属于这个内存池,继续遍历其他内存池;如果在内存池中找到了符合要求的内存块,则将这个刚刚回收的内存单元添加到这个内存块所维护的空闲的内存单元链表的头部,同时该内存块头信息中bFree值递增
I。当与所述删除指令相匹配的内存单元回收后,在考虑到存在该内存块中的内存单元可能全部为空闲的内存单元的情况、以及资源的有效利用及后续操作的性能的基础上,本申请上述实施例公开的方法中还可以继续对回收该内存单元的内存块进行判断,如果此内存块的所有内存单元都是空闲的,即该内存块的bFree的值为n,那么本申请上述实施例中公开的方法还需要将这个内存块由内存池中移出并作为一个整体返还释放给进程堆;如果该内存块中还存在非自由分配单元,则无需将此内存块返还给进程堆。但是因为刚刚有一个内存单元返回给了这个内存块,也就是该内存块有空闲的内存单元可供下次分配,因此该内存块会被移到内存池维护的内存块的头部。这样下次新的内存请求到来时,内存池在遍历内存块链表以寻找空闲的单元时,在第I次寻找就会找到该内存块,从而减少内存池的遍历次数。
[0058]综上所述,本申请上述实施例公开的方法中,每个对象内存池负责维护一个内存块链表,每个内存块由一个维护该内存块信息的块头数据结构和多个分配单元组成,所述块头数据结构则进一步维护该内存块中所有的由空闲的内存单元组成的链表。相较于现有技术中各个空闲的内存单元之间通过“指向下一个可分配的空闲的内存单元指针”的方式链接,本申请上述实施例公开的方法中通过“下一个可分配的空闲的内存单元编号”将各个空闲的内存单元链接起来,这个编号值存储在该空闲的内存单元单元的头两个字节中。
[0059]可以理解的是,对应于上述方法,本申请还公开了一种内存池装置,所述内存池装置中的技术特征与上述方法可相互借鉴。
[0060]本申请上述公开的所述内存池装置可以包括对象内存池和多个固定大小的内存块;
[0061]与上述方法相匹配,所述对象内存池,用于获取并判断应用程序向系统发送的操作指令的指令类型,当所述操作指令为内存分配需求指令时,判断当前使用的内存块中是否存在空闲的内存单元,如果否,向系统发送添加内存块指令,并采用指针将所述系统依据添加内存块指令添加的内存块与内存池中已使用的内存块进行链接。
[0062]例如图3所示,该对象内存池装置中一
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1