CN103942155A - 一种内存块控制方法及装置 - Google Patents
一种内存块控制方法及装置 Download PDFInfo
- Publication number
- CN103942155A CN103942155A CN201410177696.5A CN201410177696A CN103942155A CN 103942155 A CN103942155 A CN 103942155A CN 201410177696 A CN201410177696 A CN 201410177696A CN 103942155 A CN103942155 A CN 103942155A
- Authority
- CN
- China
- Prior art keywords
- memory block
- chained list
- free memory
- free
- rank
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 71
- 238000009826 distribution Methods 0.000 claims description 229
- 230000008569 process Effects 0.000 description 24
- 238000010586 diagram Methods 0.000 description 21
- 230000006870 function Effects 0.000 description 19
- 238000007726 management method Methods 0.000 description 6
- 238000007599 discharging Methods 0.000 description 5
- 238000000151 deposition Methods 0.000 description 3
- 238000013500 data storage Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000005194 fractionation Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 238000009795 derivation Methods 0.000 description 1
- 238000005192 partition Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000009827 uniform distribution Methods 0.000 description 1
Landscapes
- Memory System (AREA)
Abstract
本申请公开了一种内存块控制方法及装置,应用于预先设置的链表集合,所述链表集合包括第一链表、第二链表和第三链表,所述第一链表链接有当前可分配的空闲内存块,所述第二链表链接有最近释放的空闲内存块,所述第三链表链接有写入次数达到预设写入阈值的空闲内存块,所述方法包括:接收内存块分配指令,依据所述第一链表,获取与所述内存块分配指令对应的第一空闲内存块;接收内存块释放指令,将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表;接收内存块挂起指令,将与所述内存块挂起指令相对应的写入次数达到预设写入阈值的第三空闲内存块链接于所述第三链表中。
Description
技术领域
本申请涉及操作系统技术领域,特别涉及一种内存块控制方法及装置。
背景技术
随着内存技术的不断发展,非易失性存储器PRAM由于其存储密度稿、读功率低和无需刷新的优点称为取代DRAM地位的存储器件。
在目前普遍应用的安卓操作系统中,是以Linux内核为底层基础的半开源操作系统。而传统的Linux内核是基于DRAM主内存架构开发,对于以PRAM为存储器件的主内存架构该Linux内核的空闲内存块管理的结构中只有一个伙伴链表,当需要分配空闲内存块时,会从伙伴链表中对应分配阶链表的最前端分配空闲内存,当释放内存块时,会将释放的内存块添加到对应分配阶的链表前端,使得链表前端的空闲内存块由于频繁分配和读写使得其PRAM存储器件寿命降低的问题,从而导致安卓操作系统的内存架构稳定性下降。
发明内容
本申请所要解决的技术问题是提供一种内存块控制方法及装置,用以解决现有技术中以Linux内核为底层基础以PRAM为存储器件的操作系统中,由于其Linux内核是基于DRAM主内存架构开发,使得空闲内存块由于频繁分配和读写使得其PRAM存储器件寿命降低的技术问题。
本申请提供了一种内存块控制方法,应用于预先设置的链表集合,所述链表集合包括第一链表、第二链表和第三链表,所述第一链表链接有当前可分配的空闲内存块,所述第二链表链接有最近释放的空闲内存块,所述第三链表链接有写入次数达到预设写入阈值的空闲内存块,所述方法包括:
接收内存块分配指令,依据所述第一链表,在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块;
接收内存块释放指令,将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表;
接收内存块挂起指令,将与所述内存块挂起指令相对应的写入次数达到预设写入阈值的第三空闲内存块链接于所述第三链表中。
上述方法,优选的,在接收内存块分配指令之后,在所述依据所述第一链表,获取与所述内存块分配指令对应的第一空闲内存块之前,所述方法还包括:
判断所述第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小;
若是,将所述第二链表链接的空闲内存块链接于所述第一链表,依据更新链接的第一链表,获取与所述内存块分配指令对应的第一空闲内存块;
若否,执行所述依据所述第一链表,获取与所述内存块分配指令对应的第一空闲内存块。
上述方法,优选的,在所述将所述第二链表链接的空闲内存块链接于所述第一链表之后,在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块之前,所述方法还包括
判断更新链接的第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小;
若是,将所述第三链表链接的空闲内存块链接于所述第一链表,在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块;
若否,在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
上述方法,优选的,在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块,包括:
在所述第一链表中,查找是否链接有与所述内存分配指令相对应的第一分配阶具有一致分配阶的空闲内存块;
若是,获取查找到的空闲内存块作为第一空闲内存块进行分配,并在所述第一链表中移除所述查找到的空闲内存块;
若否,在所述第一链表链接的分配阶高于所述第一分配阶的空闲内存块中,获取与所述内存块分配指令对应的第一空闲内存块。
上述方法,优选的,在所述第一链表链接的分配阶高于所述第一分配阶的空闲内存块中,获取与所述内存块指令对应的第一空闲内存块,包括:
确定所述第一链表链接的分配阶高于所述第一分配阶的目标空闲内存块;
将所述目标空闲内存块进行拆分,得到分配阶与所述第一分配阶一致的空闲内存块作为第一空闲内存块进行分配。
上述方法,优选的,所述将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表,包括:
查找所述第二链表是否链接有与所述内存块释放指令对应的第二空闲内存块分配阶相同且地址相邻的空闲内存块;
若是,依据所述第二空闲内存块的地址信息,将所述第二空闲内存块与查找到的空闲内存块进行合并,更新合并后的空闲内存块的分配阶,返回重新查找所述第二链表中是否链接有与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块,直到所述第二链表中无法查找到与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块为止;
若否,依据所述第二空闲内存块的第二分配阶,将所述第二空闲内存块链接于所述第二链表。
本申请还提供了一种内存块控制装置,应用于预先设置的链表集合,所述链表集合包括第一链表、第二链表和第三链表,所述第一链表链接有当前可分配的空闲内存块,所述第二链表链接有最近释放空闲的内存块,所述第三链表链接有写入次数达到预设写入阈值的空闲内存块,所述装置包括:
内存块获取控制单元,用于接收内存块分配指令,在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块;
内存块释放控制单元,用于接收内存块释放指令,将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表;
内存块挂起控制单元,用于接收内存块挂起指令,将与所述内存块挂起指令相对应的写入次数达到预设写入阈值的第三空闲内存块链接于所述第三链表中。
上述装置,优选的,还包括:
第一判断单元,用于在所述内存块获取控制单元接收内存块分配指令之后,在所述内存块获取控制单元依据所述第一链表,获取与所述内存块分配指令对应的第一空闲内存块之前,判断所述第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小,如果是,触发第一合并单元,否则,触发所述内存块获取控制单元在所述第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块;
第一合并单元,用于将所述第二类链表链接的空闲内存块链接于所述第一链表,触发所述内存块获取控制单元在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
上述装置,优选的,还包括:
第二判断单元,用于在所述第一合并单元将所述第二链表链接的空闲内存块链接于所述第一链表之后,在所述内存块获取控制单元在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块之前,判断更新链接的第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小,如果是,触发第二合并单元,否则,触发所述内存块获取控制单元在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块;
第二合并单元,用于将所述第三链表链接的空闲内存块链接于所述第一链表,触发所述内存块获取控制单元在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块。
上述装置,优选的,所述内存块获取控制单元包括:
当前阶查找子单元,用于在所述第一链表中,查找是否链接有与所述内存块分配指令相对应的第一分配阶具有一致分配阶的空闲内存块,如果是,触发第一获取子单元,否则,触发第二获取子单元;
第一获取子单元,用于获取查找到的空闲内存块作为第一空闲内存块进行分配,并在所述第一链表中移除所述查找到的空闲内存块;
第二获取子单元,用于在所述第一链表链接的分配阶高于所述第一分配阶的空闲内存块中,获取与所述内存块分配指令对应的第一空闲内存块。
上述装置,优选的,所述第二获取子单元包括:
目标获取模块,用于确定所述第一链表链接的分配阶高于所述第一分配阶的目标空闲内存块;
内存块拆分模块,用于将所述目标空闲内存块进行拆分,得到分配阶与所述第一分配阶一致的空闲内存块作为第一空闲内存块进行分配。
上述装置,优选的,所述内存块释放控制单元包括:
相邻内存块查找子单元,用于查找所述第二链表是否链接有与所述内存块释放指令对应的第二空闲内存块分配阶相同且地址相邻的空闲内存块,如果是,触发内存块合并子单元,否则,触发内存块链接子单元;
内存块合并子单元,用于依据所述第二空闲内存块的地址信息,将所述第二空闲内存块与查找到的空闲内存块进行合并,更新合并后的空闲内存块的分配阶,返回触发所述相邻内存块查找子单元重新查找所述第二链表中是否链接有与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块,直到述相邻内存块查找子单元无法查找到与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块为止;
内存块链接子单元,用于依据所述第二空闲内存块的第二分配阶,将所述第二空闲内存块链接于所述第二链表。
由上述方案可知,本申请提供的一种内存块控制方法及装置,应用于预先设置的链表集合,该链表集合中包括由第一链表、第二链表和第三链表,该第一链表中链接有当前可分配的空闲内存块,第二链表链接有最近释放的空闲内存块,而第三链表中链接有写入此时达到预设写入阈值的空闲内存块,本申请通过在需要进行内存块分配时,依据第一链表获取与内存块分配指令对应的第一空闲内存块,在内存块被释放时,将与内存块释放指令对应的第二空闲内存块链接于第二链表,而在出现写入次数达到预设写入阈值的第三空闲内存块时,将与内存块挂起指令对应的第三空闲内存块链接于第三链表中。本申请能够避免现有技术中对最近释放的空闲内存块进行最先调用分配的情况,使得同一空闲内存块由于频繁分配和读写导致操作系统中PRAM存储器件寿命降低的问题,其中,本申请通过设置三个链表,由此实现只分配最近没有被分配过的空闲内存块即第一链表链接的空闲内存块,暂时不会分配最近释放的空闲内存块,即将当前释放的内存块链接于第二链表而非第一链表,不会分配达到写入阈值的空闲内存块,而是将写入次数达到预设写入阈值的内存块链接于第三链表,由此使得同一内存块不会被频繁的分配和读写,有效延长内存块所在PRAM存储器件的使用寿命,提高基于Linux操作系统的内存架构的稳定性。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请提供的一种内存块控制方法实施例一的部分流程图;
图2为本申请实施例的应用示例图;
图3为本申请实施例一的另一部分流程图;
图4为本申请实施例一的又一部分流程图;
图5为本申请提供的一种内存块控制方法实施例二的部分流程图;
图6为本申请实施例二的另一部分流程图;
图7为本申请提供的一种内存块控制方法实施例三的部分流程图;
图8为本申请实施例三的另一部分流程图;
图9为本申请提供的一种内存块控制方法实施例四的部分流程图;
图10为本申请实施例的另一应用示例图;
图11为本申请提供的一种内存块控制装置实施例六的结构示意图;
图12为本申请提供的一种内存块控制装置实施例七的部分结构示意图;
图13为本申请实施例七的另一部分结构示意图;
图14为本申请提供的一种内存块控制装置实施例八的部分结构示意图;
图15为本申请实施例八的部分结构示意图;
图16为本申请提供的一种内存块控制装置实施例九的部分结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
参考图1,为本申请提供的一种内存块控制方法实施例一的部分流程图,所述方法可以应用于预先设置的链表集合,所述链表集合包括第一链表、第二链表和第三链表,所述第一链表链接有当前可分配的空闲内存块,所述第二链表链接有最近释放的空闲内存块,所述第三链表链接有写入次数达到预设写入阈值的空闲内存块,如图2中所示。所述第二链表中最近释放的空间内存块是指在时间上最近被释放的空间内存块。
需要说明的是,所述链表集合中的链表结构可以参考现有DRAM主内存架构中的空闲内存块管理结构中所规定的伙伴链表。其中,所述每个链表中链接的每个空闲内存块的大小可以由其分配阶表示,所述分配阶是指该空闲内存块存储大小是2的几次幂,例如,所述第一链表中链接有分配阶为2的空闲内存块,该空闲内存块的大小即为2的2次方,即为4,所述第二链表中链接有分配阶为3的空闲内存块,该空闲内存块的大小即为2的3次方,即为8。
而本申请文件中提及的空闲内存块可以理解为PRAM存储器件的空闲内存块,即PRAM空闲内存块。
其中,本申请实施例中的方法可以包括以下步骤:
步骤101:接收内存块分配指令。
其中,所述内存块分配指令中包括有所需要调动分配的空闲内存块的大小及其物理存储地址如起始地址等信息,所述空闲内存块的大小可以由其分配阶表示。
步骤102:在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
其中,所述步骤102中可以通过alloc_pages()等函数实现,该函数在所述第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块。
如图3为本申请实施例一的另一部分流程图,所述方法还可以包括以下步骤:
步骤103:接收内存块释放指令。
其中,所述内存块释放指令中包括当前被释放的第二空闲内存块的大小及其物理存储地址如起始地址等,所述空闲内存块的大小可以以分配阶表示。
步骤104:将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表。
其中,所述步骤104可以通过free_pages()等函数实现,该函数将与所述内存块释放指令对应的第二空闲内存块链接于第二链表。
如图4为本申请实施例一的另一部分流程图,所述方法还可以包括以下步骤:
步骤105:接收内存块挂起指令。
其中,所述内存块挂起指令在所述基于Linux操作系统的PRAM存储器件中出现写入次数达到预设的写入阈值的空闲内存块时生成,所述内存块挂起指令中包括需要被挂起的第三空闲内存块的大小及其存储地址如起始地址等信息,所述空闲内存块的大小可以以分配阶表示。
步骤106:将与所述内存块挂起指令相对应的写入次数达到预设写入阈值的第三空闲内存块链接于所述第三链表中。
需要说明的是,所述基于Linux操作系统的PRAM存储器件中出现写入次数达到预设的写入阈值的空闲内存块时,在基于Linux操作系统的CPU会产生硬件中断,中断处理程序会生成内存块分配指令去调用分配一个新的空闲内存块,之后将达到写入阈值的空闲内存块中数据内容迁移至新分配到的空闲内存块中,之后生成内存块挂起指令,由此在所述步骤106中将该写入次数达到预设写入阈值的第三空闲内存块链接于第三链表中,使得写入次数达到预设写入阈值的空闲内存块不再被调用分配。
由上述方案中可知,本申请提供的一种内存块控制方法实施例一,应用于预先设置的链表集合,该链表集合中包括由第一链表、第二链表和第三链表,该第一链表中链接有当前可分配的空闲内存块,第二链表链接有最近释放的空闲内存块,而第三链表中链接有写入此时达到预设写入阈值的空闲内存块,本申请实施例一通过在需要进行内存块分配时,依据第一链表获取与内存块分配指令对应的第一空闲内存块,在内存块被释放时,将与内存块释放指令对应的第二空闲内存块链接于第二链表,而在出现写入次数达到预设写入阈值的第三空闲内存块时,将与内存块挂起指令对应的第三空闲内存块链接于第三链表中。本申请实施例一能够避免现有技术中对最近释放的空闲内存块进行最先调用分配的情况,使得同一空闲内存块由于频繁分配和读写导致操作系统中PRAM存储器件寿命降低的问题,其中,本申请实施例一通过设置三个链表,由此实现只分配最近没有被分配过的空闲内存块即第一链表链接的空闲内存块,暂时不会分配最近释放的空闲内存块,即将当前释放的内存块链接于第二链表而非第一链表,不会分配达到写入阈值的空闲内存块,而是将写入次数达到预设写入阈值的内存块链接于第三链表,由此使得同一内存块不会被频繁的分配和读写,有效延长内存块所在PRAM存储器件的使用寿命,提高基于Linux操作系统的内存架构的稳定性。
参考图5,为本申请提供的一种内存块控制方法实施例二的部分流程图,其中,在所述步骤101之后,在所述步骤102之前,所述方法还可以包括以下步骤:
步骤107:判断所述第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小,如果是,执行步骤108,否则,执行步骤102。
其中,所述空闲内存块的大小可以由其分配阶表示。在所述步骤107中判断所述第一链表链接的每个空闲内存块的大小是否均小于所需要调用分配的空闲内存块的大小,可以理解为,判断所述第一链表中链接的空闲内存块的大小,由此判断出所述第一链表是否足以提供出与所述内存块分配指令对应的第一空闲内存块,在所述第一链表足以提供出与所述内存块分配指令对应的第一空闲内存块时,继续执行步骤102,即在第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块即可,而在所述第一链表无法提供出与所述内存块分配指令对应的第一空闲内存块时,执行步骤108。
步骤108:将所述第二链表链接的空闲内存块链接于所述第一链表,执行步骤102在更新链接的第一链表中,查找并获取所述内存块分配指令对应的第一空闲内存块。
其中,在所述步骤108中,将所述第二链表链接的空闲内存块链接于所述第一链表中,是指,将所述第二链表与所述第一链表合并作为新的第一链表,具体的,可以通过以下方式实现:
分别将所述第二链表中的每个空闲内存块依据其各自的分配阶和起始地址链接于所述第一链表中,而针对每个空闲内存块,执行以下实现方式:
在所述第一链表中查找是否链接有与该空闲内存块分配阶相同且地址相邻的空闲内存块,其中,地址相邻是指所述第一链表中的分配阶相同的内存块与该空闲内存块的物理地址收尾相连,此时,将该空闲内存块与查找到的空闲内存块进行合并,合并之后的空闲内存块将会链接在原分配阶加1的链表头部;
由此,实现将所述第二链表中的每个空闲内存块均链接于所述第一链表中,实现将所述第二链表合并于第一链表中。
之后,在所述步骤102中,在所述第一链表中查找并获取所述内存块分配指令对应的第一空闲内存块,是指,在将所述第二链表合并至所述第一链表之后,在更新后的第一链表中,查找并获取所述内存块分配指令对应的第一空闲内存块。
由本申请实施例中的方案可知,本申请实施例二在接收到内存块分配指令之后,首先判断该第一链表中的空闲内存块是否足以分配与所述内存块分配指令对应的第一空闲内存块,由此,在所述第一链表中的空闲内存块足以分配与所述内存块分配指令对应的第一空闲内存块时,直接在所述第一链表中查找并获取所述内存块分配指令对应的第一空闲内存块,而在所述第一链表中的空闲内存块不足以分配与所述内存块分配指令对应的第一空闲内存块时,首先将链接有之前被释放的空闲内存块的第二链表合并于第一链表中,再在所述更新链接的第一链表中查找并获取所述内存块分配指令对应的第一空闲内存块,实现本申请实施例中分配空闲内存块的目的。
需要说明的是,上述方案中,存在一种情况,即为所述步骤108中将第二链表的空闲内存块均链接于第一链表中之后,所述第一链表仍然无法足以分配与所述内存块分配指令对应的第一空闲内存块,发生此种情况可能原因之一是所述PRAM存储器件中几乎所有的空闲内存块其写入次数均达到预设写入阈值,其空闲内存块链接在第三链表中暂时不可分配。因此,参考图6,为本申请实施例二的另一部分流程图,其中,在所述步骤108之后,在所述步骤102之前,所述方法还可以包括:
步骤109:判断更新链接的第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小,如果是,执行步骤110,否则,执行步骤102。
其中,所述步骤109中被判断的所述第一链表为所述步骤108中将所述第二链表合并至所述第一链表之后的第一链表,此时,所述步骤109中判断更新链接的第一链表链接的每个空闲内存块的大小是否均小于所需要调用分配的空闲内存块的大小,可以理解为,判断更新链接的第一链表中链接的空闲内存块的大小,由此,判断出更新链接的第一链表是否足以提供出与所述内存块分配指令对应的第一空闲内存块,在更新链接的第一链表足以提供出与所述内存块分配指令对应的第一空闲内存块时,继续执行步骤102,即在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块即可,而在更新链表的第一链表无法提供出与所述内存块分配指令对应的第一空闲内存块时,执行步骤110。
步骤110:将所述第三链表链接的空闲内存块链接于所述第一链表,执行步骤102在更新链接的第一链表中,查找并获取所述内存块分配指令对应的第一空闲内存块。
其中,在所述步骤110中,将所述第三链表链接的空闲内存块链接于所述第一链表,是指,在将所述第二链表与所述第一链表进行合并之后,将所述第三链表再合并于所述第一链表中,实现将第二链表与所述第三链表均合并至所述第一链表中的目的。
需要说明的是,所述第三链表中链接的空闲内存块链接于所述第一链表的实现方式可以参考前文中所述第二链表链接的空闲内存块链接到第一链表的实现方式,在此不再详细描述。
之后,在所述步骤102中,在所述第一链表中查找并获取所述内存块分配指令对应的第一空闲内存块,是指,在将第三链表和第二链表合并至所述第一链表之后,在更新链接后的第一链表中,查找并获取所述内存块分配指令对应的第一空闲内存块。
上述各个实施例中,参考图7,为本申请提供的一种内存块控制方法实施例三中所述步骤102的流程图,其中,所述步骤102可以包括以下步骤:
步骤121:在所述第一链表中,查找是否有与所述内存块分配指令相对应的第一分配阶具有一致分配阶的空闲内存块,如果是,执行步骤122,否则,执行步骤123。
其中,所述第一分配阶是指所述内存块分配指令中表明请求分配的空闲内存块的分配阶,其标识该空闲内存块的大小。
需要说明的是,所述步骤121是指在所述第一链表链接的当前可分配内存块中,查找是否有可以提供当前分配的空闲内存块。
步骤122:获取查找到的空闲内存块作为第一空闲内存块进行分配,并在所述第一链表中移除所述查找到的空闲内存块。
其中,所述步骤122是指,在所述步骤121中查找到与所述第一分配阶具有一致分配阶的空闲内存块时,表明所述第一链表链接的空闲内存块中具有同分配阶的空闲内存块可分配,此时,执行步骤122中,将该查找到的空闲内存块作为第一空闲内存块进行获取进行分配,实现所述步骤102的目的。
需要说明的是,在所述步骤122中获取到第一空闲内存块之后,所述第一空闲内存块进行数据存储等操作,此时需要将所述第一链表中与该内存块之间的链接进行移出,也就是说,在所述第一链表中移除所述查找的空闲内存块。
步骤123:在所述第一链表链接的分配阶高于所述第一分配阶的空闲内存块中,获取与所述内存块分配指令对应的第一空闲内存块。
其中,所述步骤123是指,当所述第一链表中具有与所述第一分配阶相同分配阶的空闲内存块不存在时,需要在分配阶高于该第一分配阶的空闲内存块中去获取第一空闲内存块,具体的,参考图8,为本申请实施例三中所述步骤123的流程图,其中,所述步骤123可以包括以下步骤:
步骤801:确定所述第一链表链接的分配阶高于所述第一分配阶的目标空闲内存块。
步骤802:将所述目标空闲内存块进行拆分,得到分配阶与所述第一分配阶一致的空闲内存块作为所述第一空闲内存块进行分配。
其中,所述步骤802中可以通过expand()等函数实现,也就是说,所述步骤802中,对确定到的目标空闲内存块依据所述第一分配阶进行折半拆分,之后,直到将拆分之后的分配阶与所述第一分配阶一致为止,其中,与所述第一分配阶一致的空闲内存块作为所述第一空闲内存块进行获取进行分配,同时,对所述目标空闲内存块被拆分之后除了所述第一空闲内存块其余的空闲内存块的分配阶进行更新并链接在对应分配阶的链表头部。
上述各个实施例中,参考图9,为本申请提供的一种内存块控制方法实施例四中所述步骤104的流程图,其中,所述步骤104可以包括以下步骤:
步骤141:查找所述第二链表是否链接有与所述内存块释放指令对应的第二空闲内存块分配阶相同且地址相邻的空闲内存块,如果是,执行步骤142,否则,执行步骤143。
其中,所述步骤141中查找与第二空闲内存块分配阶相同且地址相邻的空闲内存块,是指查找与所述第二空闲内存块可以作为伙伴对的空闲内存块,所述伙伴对是指首尾地址相邻且分配阶相同,作为伙伴对的两个内存块可以进行合并。
需要说明的是,所述步骤141中可以通过调用_page_find_buddy()函数来在所述第二链表中查找与第二空闲内存块分配阶相同且地址相邻的内存块,可以通过page_is_buddy()函数来判断该查找到的内存块是否为空闲内存块并且链接在相同链表中。
步骤142:依据所述第二空闲内存块的地址信息,将所述第二空闲内存块与查找到的空闲内存块进行合并,更新合并后的空闲内存块的分配阶,返回执行所述步骤141,重新查找所述第二链表中是否链接有与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块,在查找所述第二链表中链接有与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块时,执行步骤142中依据所述第二空闲内存块的地址信息,将所述第二空闲内存块与查找到的空闲内存块进行合并,更新合并后的空闲内存块的分配阶,直到所述第二链表中无法查找到与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块为止,不再执行所述步骤142,执行步骤143。
其中,所述步骤142中将所述第二空闲内存块与查找到的空闲内存块进行合并,具体的,可以为:将所述第二空闲内存块与查找到的空闲内存块依据其相邻的物理地址进行链接,组合成一个空闲内存块,该空闲内存块的分配阶被更新为所述第二空闲内存块的分配阶加1。
步骤143:依据所述第二空闲内存块的第二分配阶,将所述第二空闲内存块链接于所述第二链表。
其中,在所述步骤143中未查找到能够与所述第二空闲内存块进行合并的空闲内存块时,在所述步骤143中,将所述第二空闲内存块依据其第二分配阶链接于所述第二链表中,实现将最近释放的空闲内存块链接至第二链表中的目的。
上述各个实施例中在具体实现中,可以参考以下本申请实施例五的描述:
本申请实施例适用于基于Linux操作系统中PRAM存储器件的空闲内存块管理结构,所述空闲内存块管理结构对所述PRAM存储器件的每个内存域设置一个链表集合,该链表集合中包括3个伙伴列表,即为上文中的第一链表、第二链表和第三链表,每个链表的通用结构可以参考图10:第一链表:free_area_0,用来存放可分配的PRAM空闲内存块,可分配;第二链表:free_area_1,用来存放最近释放的PRAM空闲内存块,暂时不可分配;第三链表:free_area_2,用来存放达到写入阈值的PRAM空闲内存块,不可分配。本申请实施例通过分配函数alloc_pages()首先会在期望分配阶的free_area_0伙伴列表中开始查找空闲内存块。如果存在,则将链表中的第一个空闲内存块从free_area_0伙伴列表中移除,并更新当前内存域的统计量;如果不存在,则在更高分配阶的free_area_0伙伴列表中进行类似的查找,此时本申请实施例需要调用expand()函数对查找到的空闲内存块进行拆分从而得到期望大小的空闲内存块。本申请实施例通过释放函数free_pages()会根据物理地址在指定内存域的free_area_1伙伴列表中反复检查是否可以找到最大分配阶的伙伴对进行合并。如果不可以,则直接将内存块插入到对应分配阶的free_area_1伙伴列表中;如果可以,则进行内存块合并并且将其转移到更高分配阶的free_area_1伙伴列表中,此时本申请实施例需要调用_page_find_buddy()函数来查找当前释放内存块的伙伴对和page_is_buddy()函数来判断伙伴对是否是空闲的并链接在当前链表中。
本申请实施例在进行内存块管理时,具体如下:
在开始阶段,所有PRAM空闲内存块都链接在对应分配阶的free_area_0伙伴列表中。用户进程会从相关的内存域的free_area_0伙伴列表中获得期望大小的空闲内存块。如果分配时需要拆分大空闲内存块来获得期望大小的空闲内存块,拆分剩余的空闲内存块会添加回free_area_0伙伴列表中。
之后,当用户进程释放内存块时,Linux内核则将其添加到相关内存域的free_area_1伙伴列表中,而不是原来的free_area_0伙伴列表。free_area_1伙伴列表实质充当一个暂存列表,暂时将最近释放的内存块保护起来不会立即响应下次的分配请求,以确保随后的用户进程始终从free_area_0伙伴列表中查找而不是刚刚被释放的空闲内存块。
最后,当PRAM内存块达到写入阈值时,CPU会产生硬件中断。中断处理程序首先会分配一个新的PRAM空闲内存块,之后将达到写入阈值的PRAM内存块迁移到新分配的PRAM空闲内存块,最后释放达到写入阈值的PRAM内存块到free_area_2伙伴列表。
如果free_area_0伙伴列表不足以分配空闲内存块,那么就将free_area_1伙伴列表中所有的空闲内存块合并到free_area_0伙伴列表中。内存块B1可以找到一个分配阶为O的伙伴对B2,其中B2的索引#B2=#B1^(1<<O)。如果其伙伴对是空闲的,分配阶为O的内存块B经过与其伙伴对合并后可以得到的分配阶为O+1的内存块P,其中P的索引#P=B&~(1<<O)。用户进程会从合并后的free_area_0伙伴列表中获得期望大小的空闲内存块。
如果free_area_0和free_area_1合并后的伙伴列表仍旧不足以分配空闲内存块空闲内存块,这表明几乎所有PRAM空闲内存块都达到一定的写入阈值链接在free_area_2伙伴列表中。这时,就将free_area_1和free_area_2伙伴列表中的空闲内存块合并到free_area_0伙伴列表中。用户进程会从合并后的free_area_0伙伴列表中获得期望大小的空闲内存块。
以一个只考虑内存访问延时内存为4G的简单系统为例,它有Np=1M个内存块,其中空闲内存块占其中的a=50%。PRAM的写延时Tw=150ns、写入次数上限Nw=109。采用传统方法在最坏情况下频繁写入同一个内存块直到失效会耗时Tw*Nw=150秒。应用本申请实施例时,预先规定写入次数的阈值为Nt=1000(Nt<<Nw),即当PRAM内存块写入次数达到Nt时,就将此内存块保护起来不允许分配。由于free_area_1和free_area_2的缘故,Linux会均匀分配内存块而不会反复写入同一个PRAM内存块。因此,向同一PRAM内存块写入次数与耗时的推导如下:
2Nt:(a*NpNt+2Nt)*Tw
3Nt:(2*a*NpNt+3Nt)*Tw
bNt:((b-1)*a*NpNt+bNt)*Tw
一个内存块直到失效会耗时((Nw/Nt-1)*a*NpNt+Nw/Nt*Nt)*Tw≈(a*NpNw+Nw)*Tw≈75000000秒=868天≈2年半
由此可见,本申请实施例五能够提升PRAM内存架构的稳定性,并且有效延长PRAM的使用寿命,使其始终可以在智能终端使用周期中发挥作用。
参考图11,为本申请提供的一种内存块控制装置实施例六的结构示意图,其中,所述装置可以应用于预先设置的链表集合,所述链表集合包括第一链表、第二链表和第三链表,所述第一链表链接有当前可分配的空闲内存块,所述第二链表链接有最近释放的空闲内存块,所述第三链表链接有写入次数达到预设写入阈值的空闲内存块,如图2中所示。
需要说明的是,所述链表集合中的链表结构可以参考现有DRAM主内存架构中的空闲内存块管理结构中所规定的伙伴链表。其中,所述每个链表中链接的每个空闲内存块的大小可以由分配阶表示,所述分配阶是指该空闲内存块存储大小的2的几次幂,例如,所述第一链表中链接有分配阶为2的空闲内存块,该空闲内存块的大小即为2的2次方,即为4,所述第二链表中链接有分配阶为3的空闲内存块,该空闲内存块的大小即为2的3次方,即为8。
而本申请文件中提及的空闲内存块可以理解为PRAM存储器件的空闲内存块,即PRAM空闲内存块。
其中,本申请实施例中的装置可以包括:
内存块获取控制单元1101,用于接收内存块分配指令,在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
其中,所述内存块分配指令中包括有所需要调动分配的空闲内存块的大小及其物理存储地址如起始地址等信息,所述空闲内存块的大小可以由分配阶表示。
其中,所述内存块获取控制单元1101在依据所述第一链表,获取与所述内存块分配指令对应的第一空闲内存块时,可以通过alloc_pages()等函数实现,该函数在所述第一链表中获取与所述内存块分配指令对应的第一空闲内存块。
内存块释放控制单元1102,用于接收内存块释放指令,将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表。
其中,所述内存块释放指令中包括当前被释放的第二空闲内存块的大小及其物理存储地址如起始地址等,所述空闲内存块的大小可以由分配阶表示。
其中,所述内存块释放控制单元1102在将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表时,可以通过free_pages()等函数实现,该函数将与所述内存块释放指令对应的第二空闲内存块链接于第二链表。
内存块挂起控制单元1103,用于接收内存块挂起指令,将与所述内存块挂起指令相对应的写入次数达到预设写入阈值的第三空闲内存块链接于所述第三链表中。
其中,所述内存块挂起指令在所述基于Linux操作系统的PRAM存储器件中出现写入次数达到预设的写入阈值的空闲内存块时生成,所述内存块挂起指令中包括需要被挂起的第三空闲内存块的大小及其存储地址如起始地址等信息,所述空闲内存块的大小可以由分配阶表示。
需要说明的是,所述基于Linux操作系统的PRAM存储器件中出现写入次数达到预设的写入阈值的空闲内存块时,在基于Linux操作系统的CPU会产生硬件中断,中断处理程序会生成内存块分配指令去调用分配一个新的空闲内存块,之后将达到写入阈值的空闲内存块中数据内容迁移至新分配到的空闲内存块中,之后生成内存块挂起指令,由此所述内存块挂起控制单元1103将该写入次数达到预设写入阈值的第三空闲内存块链接于第三链表中,使得写入次数达到预设写入阈值的空闲内存块不再被调用分配。
由上述方案中可知,本申请提供的一种内存块控制装置实施例六,应用于预先设置的链表集合,该链表集合中包括由第一链表、第二链表和第三链表,该第一链表中链接有当前可分配的空闲内存块,第二链表链接有最近释放的空闲内存块,而第三链表中链接有写入此时达到预设写入阈值的空闲内存块,本申请实施例六通过在需要进行内存块分配时,依据第一链表获取与内存块分配指令对应的第一空闲内存块,在内存块被释放时,将与内存块释放指令对应的第二空闲内存块链接于第二链表,而在出现写入次数达到预设写入阈值的第三空闲内存块时,将与内存块挂起指令对应的第三空闲内存块链接于第三链表中。本申请实施例六能够避免现有技术中对最近释放的空闲内存块进行最先调用分配的情况,使得同一空闲内存块由于频繁分配和读写导致操作系统中PRAM存储器件寿命降低的问题,其中,本申请实施例六通过设置三个链表,由此实现只分配最近没有被分配过的空闲内存块即第一链表链接的空闲内存块,暂时不会分配最近释放的空闲内存块,即将当前释放的内存块链接于第二链表而非第一链表,不会分配达到写入阈值的空闲内存块,而是将写入次数达到预设写入阈值的内存块链接于第三链表,由此使得同一内存块不会被频繁的分配和读写,有效延长内存块所在PRAM存储器件的使用寿命,提高基于Linux操作系统的内存架构的稳定性。
参考图12,为本申请提供的一种内存块控制装置实施例七的部分结构示意图,其中,所述装置还可以包括:
第一判断单元1104,用于在所述内存块获取控制单元1101接收内存块分配指令之后,在所述内存块获取控制单元1101依据所述第一链表,获取与所述内存块分配指令对应的第一空闲内存块之前,判断所述第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小,如果是,触发第一合并单元1105,否则,触发所述内存块获取控制单元1101在所述第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块。
其中,所述空闲内存块的大小可以由其分配阶表示。在所述第一判断单元1104判断所述第一链表链接的每个空闲内存块的大小是否均小于所需要调用分配的空闲内存块的大小,可以理解为,判断所述第一链表中链接的空闲内存块的大小,由此判断出所述第一链表是否足以提供出与所述内存块分配指令对应的第一空闲内存块,在所述第一链表足以提供出与所述内存块分配指令对应的第一空闲内存块时,触发所述内存块获取控制单元1101在第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块即可,而在所述第一链表无法提供出与所述内存块分配指令对应的第一空闲内存块时,触发第一合并单元1105。
第一合并单元1105,用于将所述第二类链表链接的空闲内存块链接于所述第一链表,触发所述内存块获取控制单元1101在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
其中,所述第一合并单元1105将所述第二链表链接的空闲内存块链接于所述第一链表中,是指,将所述第二链表与所述第一链表合并作为新的第一链表,具体的,可以通过以下方式实现:
分别将所述第二链表中的每个空闲内存块依据其各自的分配阶和起始地址链接于所述第一链表中,而针对每个空闲内存块,执行以下实现方式:
在所述第一链表中查找是否链接有与该空闲内存块分配阶相同且地址相邻的空闲内存块,其中,地址相邻是指所述第一链表中的分配阶相同的内存块与该空闲内存块的物理地址收尾相连,此时,将该空闲内存块与查找到的空闲内存块进行合并,合并之后的空闲内存块将会链接在原分配阶加1的链表头部;
由此,实现将所述第二链表中的每个空闲内存块均链接于所述第一链表中,实现将所述第二链表合并于第一链表中。
之后,所述内存块获取控制单元1101在所述第一链表中查找并获取所述内存块分配指令对应的第一空闲内存块,是指,在将所述第二链表合并至所述第一链表之后,在更新后的第一链表中,查找并获取所述内存块分配指令对应的第一空闲内存块。
由本申请实施例中的方案可知,本申请实施例七在接收到内存块分配指令之后,首先判断该第一链表中的空闲内存块是否足以分配与所述内存块分配指令对应的第一空闲内存块,由此,在所述第一链表中的空闲内存块足以分配与所述内存块分配指令对应的第一空闲内存块时,直接在所述第一链表中查找并获取所述内存块分配指令对应的第一空闲内存块,而在所述第一链表中的空闲内存块不足以分配与所述内存块分配指令对应的第一空闲内存块时,首先将链接有之前被释放的空闲内存块的第二链表合并于第一链表中,再在所述第一链表中查找并获取所述内存块分配指令对应的第一空闲内存块,实现本申请实施例中分配空闲内存块的目的。
需要说明的是,上述方案中,存在一种情况,即为所述第一合并单元1105将第二链表的空闲内存块均链接于第一链表中之后,所述第一链表仍然无法足以分配与所述内存块分配指令对应的第一空闲内存块,发生此种情况可能原因之一是所述PRAM存储器件中几乎所有的空闲内存块其写入次数均达到预设写入阈值,其空闲内存块链接在第三链表中暂时不可分配。因此,参考图13,为本申请实施例七的另一部分结构示意图,其中,所述装置还可以包括:
第二判断单元1106,用于在所述第一合并单元1105将所述第二链表链接的空闲内存块链接于所述第一链表之后,在所述内存块获取控制单元1101在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块之前,判断更新链接的第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小,如果是,触发第二合并单元1107,否则,触发所述内存块获取控制单元1101在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块。
其中,所述第二判断单元1106中被判断的所述第一链表为所述第一合并单元1105将所述第二链表合并至所述第一链表之后的第一链表,此时,所述第二判断单元1106判断更新链接的第一链表链接的每个空闲内存块的大小是否均小于所需要调用分配的空闲内存块的大小,可以理解为,判断更新链接的第一链表中链接的空闲内存块的大小,由此,判断出更新链接的第一链表是否足以提供出与所述内存块分配指令对应的第一空闲内存块,在更新链接的第一链表足以提供出与所述内存块分配指令对应的第一空闲内存块时,触发所述内存块获取控制单元1101在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块即可,而在更新链表的第一链表无法提供出与所述内存块分配指令对应的第一空闲内存块时,触发第二合并单元1107。
第二合并单元1107,用于将所述第三链表链接的空闲内存块链接于所述第一链表,触发所述内存块获取控制单元1101在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
其中,所述第二合并单元1107将所述第三链表链接的空闲内存块链接于所述第一链表,是指,在将所述第二链表与所述第一链表进行合并之后,将所述第三链表再合并于所述第一链表中,实现将第二链表与所述第三链表均合并至所述第一链表中的目的。
需要说明的是,所述第三链表中链接的空闲内存块链接于所述第一链表的实现方式可以参考前文中所述第二链表链接的空闲内存块链接到第一链表的实现方式,在此不再详细描述。
之后,所述内存块获取控制单元1101在所述第一链表中查找并获取所述内存块分配指令对应的第一空闲内存块,是指,在将第三链表和第二链表合并至所述第一链表之后,在更新链接后的第一链表中,查找并获取所述内存块分配指令对应的第一空闲内存块。
参考图14,为本申请提供的一种内存块控制装置实施例八中所述内存块获取控制单元1101的结构示意图,其中,所述内存块获取控制单元1101可以包括:
当前阶查找子单元1111,用于在所述第一链表链接的当前可分配内存块中,查找是否存在与所述第一分配阶具有一致分配阶的空闲内存块,如果是,触发第一获取子单元1112,否则,触发第二获取子单元1113。
其中,所述第一分配阶是指所述内存块分配指令中表明需要分配的空闲内存块的分配阶,其标识该空闲内存块的大小。
需要说明的是,所述当前阶查找子单元1111是指在所述第一链表链接的当前可分配内存块中,查找是否有可以提供当前分配的空闲内存块。
第一获取子单元1112,用于获取查找到的空闲内存块作为第一空闲内存块进行分配,并在所述第一链表中移除所述查找到的空闲内存块。
其中,所述第一获取子单元1112是指,在所述当前阶查找子单元1111查找到与所述第一分配阶具有一致分配阶的空闲内存块时,表明所述第一链表链接的空闲内存块中具有同分配阶的空闲内存块可分配,此时,触发所述第一获取子单元11132,将该查找到的空闲内存块作为第一空闲内存块进行获取进行分配,实现所述内存块获取控制单元1101的目的。
需要说明的是,所述第一获取子单元1112获取到第一空闲内存块之后所述第一空闲内存块进行数据存储等操作,此时需要将所述第一链表中与该内存块之间的链接进行移出,也就是说,在所述第一链表中移除所述查找的空闲内存块。
第二获取子单元1113,用于在所述第一链表链接的分配阶高于所述第一分配阶的空闲内存块中,获取与所述内存块分配指令对应的第一空闲内存块。
其中,所述第二获取子单元1113是指,当所述第一链表中具有与所述第一分配阶相同分配阶的空闲内存块不存在时,需要在分配阶高于该第一分配阶的空闲内存块中去获取第一空闲内存块,具体的,参考图15,为本申请实施例八中所述第二获取子单元1113的结构示意图,其中,所述第二获取子单元1113可以包括:
目标获取模块1501,用于确定所述第一链表链接的分配阶高于所述第一分配阶的目标空闲内存块。
内存块拆分模块1502,用于将所述目标空闲内存块进行拆分,得到分配阶与所述第一分配阶一致的空闲内存块作为第一空闲内存块。
其中,所述内存块拆分模块1502可以通过expand()等函数实现,也就是说,所述内存块拆分模块1502对确定到的目标空闲内存块依据所述第一分配阶进行折半拆分,之后,直到将拆分之后的分配阶与所述第一分配阶一致为止,其中,与所述请求分配阶一致的空闲内存块进行分配,同时,对所述目标空闲内存块被拆分之后除了所述被分配的空闲内存块其余的空闲内存块的分配阶进行更新并链接在对应分配阶的链表头部。
上述各个实施例中,参考图16,为本申请提供的一种内存块控制装置实施例九中所述内存块释放控制单元1102的结构示意图,其中,所述内存块释放控制单元1102可以包括:
相邻内存块查找子单元1121,用于查找所述第二链表是否链接有与所述内存块释放指令对应的第二空闲内存块分配阶相同且地址相邻的空闲内存块,如果是,触发内存块合并子单元1122,否则,触发内存块链接子单元1123。
其中,所述相邻内存块查找子单元1121查找与第二空闲内存块分配阶相同且地址相邻的空闲内存块,是指查找与所述第二空闲内存块可以作为伙伴对的空闲内存块,所述伙伴对是指首尾地址相邻且分配阶相同,作为伙伴对的两个内存块可以进行合并。
需要说明的是,所述相邻内存块查找子单元1121可以通过调用_page_find_buddy()函数来在所述第二链表中查找与第二空闲内存块分配阶相同且地址相邻的内存块,可以通过page_is_buddy()函数来判断该查找到的内存块是否为空闲内存块并且链接在相同链表中。
内存块合并子单元1122,用于依据所述第二空闲内存块的地址信息,将所述第二空闲内存块与查找到的空闲内存块进行合并,更新合并后的空闲内存块的分配阶,返回触发所述相邻内存块查找子单元1121重新查找所述第二链表中是否链接有与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块,在查找所述第二链表中链接有与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块时,触发所述内存块合并子单元1122依据所述第二空闲内存块的地址信息,将所述第二空闲内存块与查找到的空闲内存块进行合并,更新合并后的空闲内存块的分配阶,直到述相邻内存块查找子单元1121无法查找到与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块为止,不再触发所述内存块合并子单元1122,触发所述内存块链接子单元1123;
其中,所述内存块合并子单元1122将所述第二空闲内存块与查找到的空闲内存块进行合并,具体的,可以为:将所述第二空闲内存块与查找到的空闲内存块依据其相邻的物理地址进行链接,组合成一个空闲内存块,该空闲内存块的分配阶被更新为所述第二空闲内存块的分配阶加1。
内存块链接子单元1123,用于依据所述第二空闲内存块的第二分配阶,将所述第二空闲内存块链接于所述第二链表。
其中,所述内存块链接子单元1123在所述相邻内存块查找子单元1121未查找到能够与所述第二空闲内存块进行合并的空闲内存块时,将所述第二空闲内存块依据其第二分配阶链接于所述第二链表中,实现将最近释放的空闲内存块链接至第二链表中的目的。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本申请所提供的一种内存块控制方法及装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (12)
1.一种内存块控制方法,其特征在于,应用于预先设置的链表集合,所述链表集合包括第一链表、第二链表和第三链表,所述第一链表链接有当前可分配的空闲内存块,所述第二链表链接有最近释放的空闲内存块,所述第三链表链接有写入次数达到预设写入阈值的空闲内存块,所述方法包括:
接收内存块分配指令,在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块;
接收内存块释放指令,将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表;
接收内存块挂起指令,将与所述内存块挂起指令相对应的写入次数达到预设写入阈值的第三空闲内存块链接于所述第三链表中。
2.根据权利要求1所述的方法,其特征在于,在接收内存块分配指令之后,在所述依据所述第一链表,获取与所述内存块分配指令对应的第一空闲内存块之前,所述方法还包括:
判断所述第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小;
若是,将所述第二链表链接的空闲内存块链接于所述第一链表,在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块;
若否,在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
3.根据权利要求2所述的方法,其特征在于,在所述将所述第二链表链接的空闲内存块链接于所述第一链表之后,在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块之前,所述方法还包括
判断更新链接的第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小;
若是,将所述第三链表链接的空闲内存块链接于所述第一链表,在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块;
若否,在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
4.根据权利要求1、2或3所述的方法,其特征在于,在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块,包括:
在所述第一链表中,查找是否链接有与所述内存块分配指令相对应的第一分配阶具有一致分配阶的空闲内存块;
若是,获取查找到的空闲内存块作为第一空闲内存块进行分配,并在所述第一链表中移除所述查找到的空闲内存块;
若否,在所述第一链表链接的分配阶高于所述第一分配阶的空闲内存块中,获取与所述内存块分配指令对应的第一空闲内存块。
5.根据权利要求4所述的方法,其特征在于,在所述第一链表链接的分配阶高于所述第一分配阶的空闲内存块中,获取与所述内存块指令对应的第一空闲内存块,包括:
确定所述第一链表链接的分配阶高于所述第一分配阶的目标空闲内存块;
将所述目标空闲内存块进行拆分,得到分配阶与所述第一分配阶一致的空闲内存块作为第一空闲内存块进行分配。
6.根据权利要求1所述的方法,其特征在于,所述将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表,包括:
查找所述第二链表是否链接有与所述内存块释放指令对应的第二空闲内存块分配阶相同且地址相邻的空闲内存块;
若是,依据所述第二空闲内存块的地址信息,将所述第二空闲内存块与查找到的空闲内存块进行合并,更新合并后的空闲内存块的分配阶,返回重新查找所述第二链表中是否链接有与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块,直到所述第二链表中无法查找到与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块为止;
若否,依据所述第二空闲内存块的第二分配阶,将所述第二空闲内存块链接于所述第二链表。
7.一种内存块控制装置,其特征在于,应用于预先设置的链表集合,所述链表集合包括第一链表、第二链表和第三链表,所述第一链表链接有当前可分配的空闲内存块,所述第二链表链接有最近释放的空闲内存块,所述第三链表链接有写入次数达到预设写入阈值的空闲内存块,所述装置包括:
内存块获取控制单元,用于接收内存块分配指令,在所述第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块;
内存块释放控制单元,用于接收内存块释放指令,将与所述内存块释放指令对应的第二空闲内存块链接于所述第二链表;
内存块挂起控制单元,用于接收内存块挂起指令,将与所述内存块挂起指令相对应的写入次数达到预设写入阈值的第三空闲内存块链接于所述第三链表中。
8.根据权利要求7所述的装置,其特征在于,还包括:
第一判断单元,用于在所述内存块获取控制单元接收内存块分配指令之后,在所述内存块获取控制单元依据所述第一链表,获取与所述内存块分配指令对应的第一空闲内存块之前,判断所述第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小,如果是,触发第一合并单元,否则,触发所述内存块获取控制单元在所述第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块;
第一合并单元,用于将所述第二类链表链接的空闲内存块链接于所述第一链表,触发所述内存块获取控制单元在更新链接的第一链表中,查找并获取与所述内存块分配指令对应的第一空闲内存块。
9.根据权利要求8所述的装置,其特征在于,还包括:
第二判断单元,用于在所述第一合并单元将所述第二类链表链接的空闲内存块链接于所述第一链表之后,在所述内存块获取控制单元在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块之前,判断更新链接的第一链表链接的每个空闲内存块的大小是否均小于与所述内存块分配指令对应的第一空闲内存块的大小,如果是,触发第二合并单元,否则,触发所述内存块获取控制单元在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块;
第二合并单元,用于将所述第三链表链接的空闲内存块链接于所述第一链表,触发所述内存块获取控制单元在更新链接的第一链表中查找并获取与所述内存块分配指令对应的第一空闲内存块。
10.根据权利要求7、8或9所述的装置,其特征在于,所述内存块获取控制单元包括:
当前阶查找子单元,用于在所述第一链表中,查找是否链接有与所述内存块分配指令相对应的第一分配阶具有一致分配阶的空闲内存块,如果是,触发第一获取子单元,否则,触发第二获取子单元;
第一获取子单元,用于获取查找到的空闲内存块作为第一空闲内存块进行分配,并在所述第一链表中移除所述查找到的空闲内存块;
第二获取子单元,用于在所述第一链表链接的分配阶高于所述第一分配阶的空闲内存块中,获取与所述内存块分配指令对应的第一空闲内存块。
11.根据权利要求10所述的装置,其特征在于,所述第二获取子单元包括:
目标获取模块,用于确定所述第一链表链接的分配阶高于所述第一分配阶的目标空闲内存块;
内存块拆分模块,用于将所述目标空闲内存块进行拆分,得到分配阶与所述第一分配阶一致的空闲内存块作为第一空闲内存块进行分配。
12.根据权利要求7所述的装置,其特征在于,所述内存块释放控制单元包括:
相邻内存块查找子单元,用于查找所述第二链表是否链接有与所述内存块释放指令对应的第二空闲内存块分配阶相同且地址相邻的空闲内存块,如果是,触发内存块合并子单元,否则,触发内存块链接子单元;
内存块合并子单元,用于依据所述第二空闲内存块的地址信息,将所述第二空闲内存块与查找到的空闲内存块进行合并,更新合并后的空闲内存块的分配阶,返回触发所述相邻内存块查找子单元重新查找所述第二链表中是否链接有与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块,直到述相邻内存块查找子单元无法查找到与更新分配阶后的空闲内存块分配阶相同且地址相邻的空闲内存块为止;
内存块链接子单元,用于依据所述第二空闲内存块的第二分配阶,将所述第二空闲内存块链接于所述第二链表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410177696.5A CN103942155B (zh) | 2014-04-29 | 2014-04-29 | 一种内存块控制方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410177696.5A CN103942155B (zh) | 2014-04-29 | 2014-04-29 | 一种内存块控制方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103942155A true CN103942155A (zh) | 2014-07-23 |
CN103942155B CN103942155B (zh) | 2017-01-11 |
Family
ID=51189827
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410177696.5A Active CN103942155B (zh) | 2014-04-29 | 2014-04-29 | 一种内存块控制方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103942155B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106776375A (zh) * | 2016-12-27 | 2017-05-31 | 东方网力科技股份有限公司 | 一种磁盘内部的数据缓存方法及装置 |
CN106873915A (zh) * | 2017-02-22 | 2017-06-20 | 郑州云海信息技术有限公司 | 一种基于rdma注册内存块的数据传输方法和装置 |
CN115858184A (zh) * | 2023-03-03 | 2023-03-28 | 浪潮电子信息产业股份有限公司 | 一种rdma内存管理方法、装置、设备及介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1427342A (zh) * | 2001-12-21 | 2003-07-02 | 上海贝尔有限公司 | 一种内存管理系统及其分配方法 |
US20050154851A1 (en) * | 2004-01-14 | 2005-07-14 | Charles Andrew A. | Fast, high reliability dynamic memory manager |
US7343513B1 (en) * | 2003-09-24 | 2008-03-11 | Juniper Networks, Inc. | Systems and methods for recovering memory |
CN102063385A (zh) * | 2010-12-23 | 2011-05-18 | 深圳市金宏威实业发展有限公司 | 一种内存管理方法和系统 |
US20120303927A1 (en) * | 2011-05-24 | 2012-11-29 | Richard Goldberg | Memory allocation using power-of-two block sizes |
CN102999434A (zh) * | 2011-09-15 | 2013-03-27 | 阿里巴巴集团控股有限公司 | 一种内存管理方法及装置 |
-
2014
- 2014-04-29 CN CN201410177696.5A patent/CN103942155B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1427342A (zh) * | 2001-12-21 | 2003-07-02 | 上海贝尔有限公司 | 一种内存管理系统及其分配方法 |
US7343513B1 (en) * | 2003-09-24 | 2008-03-11 | Juniper Networks, Inc. | Systems and methods for recovering memory |
US20050154851A1 (en) * | 2004-01-14 | 2005-07-14 | Charles Andrew A. | Fast, high reliability dynamic memory manager |
CN102063385A (zh) * | 2010-12-23 | 2011-05-18 | 深圳市金宏威实业发展有限公司 | 一种内存管理方法和系统 |
US20120303927A1 (en) * | 2011-05-24 | 2012-11-29 | Richard Goldberg | Memory allocation using power-of-two block sizes |
CN102999434A (zh) * | 2011-09-15 | 2013-03-27 | 阿里巴巴集团控股有限公司 | 一种内存管理方法及装置 |
Non-Patent Citations (1)
Title |
---|
何煦岚,何晓岚: "基于多链表结构的嵌入式系统内存管理", 《计算机应用与软件》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106776375A (zh) * | 2016-12-27 | 2017-05-31 | 东方网力科技股份有限公司 | 一种磁盘内部的数据缓存方法及装置 |
CN106873915A (zh) * | 2017-02-22 | 2017-06-20 | 郑州云海信息技术有限公司 | 一种基于rdma注册内存块的数据传输方法和装置 |
CN115858184A (zh) * | 2023-03-03 | 2023-03-28 | 浪潮电子信息产业股份有限公司 | 一种rdma内存管理方法、装置、设备及介质 |
CN115858184B (zh) * | 2023-03-03 | 2023-05-02 | 浪潮电子信息产业股份有限公司 | 一种rdma内存管理方法、装置、设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103942155B (zh) | 2017-01-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9400767B2 (en) | Subgraph-based distributed graph processing | |
US20140195761A1 (en) | Logical volume space sharing | |
CN105095287A (zh) | Lsm数据合并排序方法和装置 | |
CN105843748B (zh) | 一种对内存中内存页的处理方法及装置 | |
CN101410905A (zh) | 减小非易失性存储器读取延迟的方法和设备 | |
CN105630812A (zh) | 集群应用缓存刷新方法及装置 | |
US20120246661A1 (en) | Data arrangement calculating system, data arrangement calculating method, master unit and data arranging method | |
KR101835604B1 (ko) | 메모리를 위한 스케줄러 | |
CN103019861A (zh) | 虚拟机分配方法及装置 | |
CN102866947A (zh) | 一种Linux内核内存泄漏的检测方法 | |
CN103324582A (zh) | 一种内存迁移方法、装置及设备 | |
CN103577308A (zh) | 移动设备的日志文件的获取方法 | |
CN104932933A (zh) | 一种获取自旋锁的方法及装置 | |
CN102722455A (zh) | 一种闪存设备中数据存储的方法及装置 | |
CN104317734A (zh) | 一种适用于slab的内存分配方法及装置 | |
CN103942155A (zh) | 一种内存块控制方法及装置 | |
CN103605617A (zh) | 一种记录存储数据发生变化的方法及装置 | |
CN105718319A (zh) | 一种内存池版图解析方法和内存池装置 | |
CN105138481A (zh) | 存储数据的处理方法、装置和系统 | |
CN103218305A (zh) | 存储空间的分配方法 | |
CN105359122A (zh) | 多cpu系统中的增强型数据传输 | |
CN104572941A (zh) | 数据存储方法、装置和设备 | |
CN106776018B (zh) | 用于分布式系统的主节点和从节点的并行处理方法和设备 | |
CN104517067A (zh) | 访问数据的方法、装置及系统 | |
CN102203737B (zh) | 多线程访问多副本的方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |