发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种实现软件不中断业务升级的内存管理方法及系统,节省了大量的时间和缓存空间。
为达到以上目的,本发明采取的技术方案是:一种实现软件不中断业务升级的内存管理方法,包括以下步骤:
执行软件升级前,在系统内存中预留一块操作系统无法访问的内存空间;按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化预留的内存空间;通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间;
执行软件升级后,若操作系统重新加载,在系统内存中预留一块与执行软件升级前预留的相同的内存空间,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化升级后预留的内存空间,再通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,计算出关键数据的首地址,并赋给升级后的软件;
若操作系统未重新加载,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化升级前预留的内存空间,再通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,计算出关键数据的首地址,并赋给升级后的软件。
在上述技术方案的基础上,所述按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化预留的内存空间,具体包括以下步骤:
为shmem_pool_size和buf_size_min赋值;shmem_pool_size表示预留的内存空间的大小;buf_size_min表示最小内存块的大小;
为shmem_pool_phys和shmem_pool_ptr赋值;shmem_pool_phys表示预留的内存空间的物理地址;shmem_pool_ptr表示预留的内存空间的逻辑地址;
为mem_free和first_free赋值;mem_free表示全局剩余内存空间的大小;first_free表示全局剩余空间的首地址;
为num_tbl_entries和mem_pool_tbl_ptr赋值;num_tbl_entries表示mem_pool_tbl_ptr的数量;mem_pool_tbl_ptr用来管理从预留的内存空间中创建的内存块;
为fh_mem_pooL_t和fh_mem_pooL_buf_t赋值;fh_mem_pooL_t为从预留的内存空间中创建的内存的管理结构体;fh_mem_pooL_buf_t为从创建的预留的内存空间中分配关键数据的管理结构体。
在上述技术方案的基础上,通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,具体包括以下步骤:
更新fh_mem_pool_list_t结构体中的fh_mem_pool_t结构体的值,并更新first_free的值和mem_free的值;
更新fh_mem_poot_t结构体中的fh_mem_pool_but_t结构体的值。
在上述技术方案的基础上,在VxWorks操作系统中,直接操作预留的内存空间完成初始化;在Linux系统中,通过内存映射文件mmap,映射预留的内存完成初始化。
在上述技术方案的基础上,为关键数据分配内存空间时,当关键数据所占用的预留的内存空间不是最小内存块的倍数时,强行补齐。
本发明还公开了一种实现软件不中断业务升级的内存管理系统,包括:
内存空间预留模块,其用于执行软件升级前,在系统内存中预留一块操作系统无法访问的内存空间;执行软件升级后,若操作系统重新加载,在系统内存中预留一块与执行软件升级前预留的相同的内存空间;
内存空间初始化模块,其用于执行软件升级前,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化预留的内存空间;执行软件升级后,若操作系统重新加载,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化软件升级后预留的内存空间,若操作系统未重新加载,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化软件升级前预留的内存空间;
内存空间分配模块,其用于执行软件升级前,通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间;执行软件升级后,若操作系统重新加载,在软件升级后预留的内存空间中通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,计算出关键数据的首地址并赋给升级后的软件,若操作系统未重新加载,在软件升级前预留的内存空间中通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,计算出关键数据的首地址并赋给升级后的软件。
在上述技术方案的基础上,所述内存空间初始化模块按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化预留的内存空间,具体包括以下步骤:
为shmem_pool_size和buf_size_min赋值;shmem_pool_size表示预留的内存空间的大小;buf_size_min表示最小内存块的大小;
为shmem_pool_phys和shmem_pool_ptr赋值;shmem_pool_phys表示预留的内存空间的物理地址;shmem_pool_ptr表示预留的内存空间的逻辑地址;
为mem_free和first_free赋值;mem_free表示全局剩余内存空间的大小;first_free表示全局剩余空间的首地址;
为num_tbl_entries和mem_pool_tbl_ptr赋值;num_tbl_entries表示mem_pool_tbl_ptr的数量;mem_pool_tbl_ptr用来管理从预留的内存空间中创建的内存块;
为fh_mem_pooL_t和fh_mem_pooL_buf_t赋值;fh_mem_pooL_t为从预留的内存空间中创建的内存的管理结构体;fh_mem_pooL_buf_t为从创建的预留的内存空间中分配关键数据的管理结构体。
在上述技术方案的基础上,所述内存空间分配模块通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,具体包括以下步骤:
更新fh_mem_pool_list_t结构体中的fh_mem_pool_t结构体的值,并更新first_free的值和mem_free的值;
更新fh_mem_poot_t结构体中的fh_mem_pool_but_t结构体的值。
在上述技术方案的基础上,在VxWorks操作系统中,所述内存空间初始化模块直接操作预留的内存空间完成初始化;在Linux系统中,所述内存空间初始化模块通过内存映射文件,映射预留的内存完成初始化。
在上述技术方案的基础上,内存空间分配模块为关键数据分配内存空间时,当关键数据所占用的预留的内存空间不是最小内存块的倍数时,强行补齐。
与现有技术相比,本发明的优点在于:
本发明将不中断业务升级涉及的关键数据的分配和使用在操作系统无法访问的内存空间中,只需要将关键数据保存到预留的内存空间中,而无须将关键数据复制到文件系统中,节省了大量的时间和缓存空间。同时,省去了传统方案中分步查找关键数据并复制到文件系统的过程,并且不存在遗漏的问题。
具体实施方式
以下结合附图及实施例对本发明作进一步详细说明。
实施例1:
参见图1所示,本发明实施例提供一种实现软件不中断业务升级的内存管理方法,包括以下步骤:
执行软件升级前,在系统内存中预留一块操作系统无法访问的内存空间;按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化预留的内存空间;通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间;
执行软件升级后,若操作系统重新加载,在系统内存中预留一块与执行软件升级前预留的相同的内存空间,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化升级后预留的内存空间,再通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,计算出关键数据的首地址,并赋给升级后的软件;
若操作系统未重新加载,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化升级前预留的内存空间,再通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,计算出关键数据的首地址,并赋给升级后的软件。
本发明将不中断业务升级涉及的关键数据的分配和使用在操作系统无法访问的内存空间中,只需要将关键数据保存到预留的内存空间中,而无须将关键数据复制到文件系统中,节省了大量的时间和缓存空间。同时,省去了传统方案中分步查找关键数据并复制到文件系统的过程,并且不存在遗漏的问题。
实施例2:
在实施例1的基础上,在页表建立之前,通过引导内存分配器(boot memoryallocator–缩写为bootmem分配器),在内存中预留一块操作系统无法访问的内存空间。
bootmem分配器基于最先适配(first-first)分配器的原理,使用一个位图来管理页,以位图代替原来的空闲链表结构来表示存储空间,位图的比特位的数目与系统中物理内存页面数目相同。若位图中某一位是1,则标识该页面已经被分配(已用页),否则表示未被占有(未用页)。在需要分配内存时,分配器逐位的扫描位图,直至找到一个能提供足够连续页的位置,即所谓的最先最佳(first-best)或最先适配位置。该分配机制通过记录上一次分配的页面帧号(PFN)结束时的偏移量来实现分配大小小于一页的空间,连续的小的空闲空间将被合并存储在一页上。
在内存中预留一块操作系统无法访问的内存空间时,所述预留的内存空间系统设于系统内存的最末端。因为操作系统一般在内存低地址段完成中断等关键操作,因此预留内存的首地址尽量选择在高地址段,如系统内存的最末端,并根据关键数据合理的选择预留空间的大小。
实施例3:
在实施例1的基础上,在VxWorks操作系统中,直接操作预留的内存空间完成初始化;在Linux系统中,通过内存映射文件(mmap)的方法,映射预留的内存完成初始化。mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。
为关键数据分配内存空间时,当关键数据所占用的预留的内存空间不是最小内存块的倍数时,将通过算法强行补齐,有助于某些关键资源对于特殊bit位对齐的要求。
实施例4:
在实施例1的基础上,实现软件不中断业务升级的内存管理方法,包括以下步骤:
S1、内存空间预留:在页表建立之前通过reserve_bootmem(…)方法预留一块操作系统无法访问的内存空间。由于操作系统一般在内存低地址段完成中断等关键操作,因此预留内存的首地址尽量选择在高地址段,如系统内存的最末端,并根据关键数据合理的选择预留空间的大小。
S2、按照图2设计的数据结构初始化操作系统无法访问的内存。
其中,first_free为mem_free的首地址,shmem_pool_ptr为共享内存逻辑首地址,fh_mem_pooL_t为从共享内存中create的内存的管理结构体,fh_mem_pooL_buf_t为从create的内存中分配关键数据的管理结构体,buf_ptr为分配的关键数据内存块逻辑首地址。
参见图2所示,数据结构初始化的具体步骤如下:
首先为shmem_pool_size和buf_size_min赋值。shmem_pool_size表示预留的内存空间的大小,以byte为单位计量,如8M内存空间时,shmem_pool_size=8*220=8388608。buf_size_min表示最小内存块的大小,以byte为计量单位buf_size_min=256。
第二步为shmem_pool_phys和shmem_pool_ptr赋值。shmem_pool_phys表示预留的内存空间的物理地址,如从512M内存中预留最后8M空间,那么shmem_pool_phys=504M。shmem_pool_ptr表示预留的内存空间的逻辑地址,当VxWorks系统时,shmem_pool_ptr=504M;当Linux系统时,shmem_pool_ptr=mmap预留的内存空间返回的值。
第三步为mem_free和first_free赋值。mem_free表示全局剩余内存空间的大小,如8M内存空间时,mem_free=8*220,它会随着关键资源的分配过程而更新。first_free表示全局剩余空间的首地址,如8M内存空间时,first_free=504M,它会随着关键资源的分配过程而更新。
第四步为num_tbl_entries和mem_pool_tbl_ptr赋值。num_tbl_entries表示mem_pool_tbl_ptr的数量,当8M内存空间时,num_tbl_entries=8M/256=32768。mem_pool_tbl_ptr用来管理从预留的内存空间中create的内存块,在初始化时,置位flag=0,当create时再对其它的结构体成员赋值。
第五步为fh_mem_pooL_t和fh_mem_pooL_buf_t赋值;fh_mem_pooL_t为从预留的内存空间中create的内存的管理结构体,fh_mem_pooL_buf_t为从create的预留的内存空间中分配关键数据的管理结构体,buf_ptr为分配的关键数据内存块逻辑首地址。
VxWorks系统直接操作预留的物理内存完成初始化,Linux系统通过mmap方式,映射预留的内存完成初始化。初始化预留的内存空间指对管理内存的数据结构赋初值,它指的是逻辑概念,初始化的对象是数据结构,并不是操作物理内存,如图2中的全局数据区,具体就是给它赋初值。
S3、按照预设的内存分配方法为关键数据分配内存空间,本发明中,最小的内存块为256bytes,当关键数据占用内存空间不是最小内存块的倍数时,将通过算法强行补齐,这样做可能会带来资源的浪费,但有助于某些关键资源对于特殊bit位对齐的要求。
按照预设的内存分配方法为关键数据分配内存空间,即通过更新管理结构体成员关键数据分配内存空间,具体包括以下过程:
初始化预留的内存空间后,管理结构体成员的值显示预留的内存空间全部可用,当需要为关键数据a分配内存空间时,首先从预留的内存空间中create一片sizeof(a)*n(一般情况下,n=1)的内存空间m,此过程主要更新fh_mem_pool_list_t结构体中的fh_mem_pool_t结构体、first_free和mem_free,完成对create的内存空间和全局剩余的内存空间的管理。然后再从内存空间m中malloc一片sizeof(a)的内存空间,此过程主要更新fh_mem_poot_t结构体中的fh_mem_pool_but_t结构体,完成对malloc的内存空间的管理,也即为关键数据a分配的内存空间。
S4、执行软件包升级不中断业务,软件包升级,此步骤不涉及关键数据的copy。
S5、根据操作系统是否重新加载,选择不同的流程。若重新加载,执行S6,在系统内存中预留S1预留的空间,否则执行步骤S7。
S6、在系统内存中预留与S1同样的内存空间,一定保持一致,否则会出现关键数据恢复失败的情况。
S7、重新初始化预留的内存空间,并按照S3中预设的内存分配方法重新分配内存资源。由于软件升级不中断业务过程中不断电,内存空间的值保持完备性,并且内存资源分配的算法一致,顺序相同,因此恢复的关键数据与软件升级前保持一致。
重新分配内存资源指为各个关键数据寻找首地址,分配内存资源就是按照专利的算法计算出关键数据块的首地址。
特别在linux系统下,每次mmap预留的内存空间返回的逻辑地址可能不一样,所以需要重新分配内存资源找出各个关键数据的首地址,并且由于算法是一致的,且分配关键数据的方法和S3步骤一样,所以能正确的寻找到每个关键数据。
实施例5:
本实施例公开了一种实现软件不中断业务升级的内存管理系统,包括:
内存空间预留模块,其用于执行软件升级前,在系统内存中预留一块操作系统无法访问的内存空间;执行软件升级后,若操作系统重新加载,在系统内存中预留一块与执行软件升级前预留的相同的内存空间;
内存空间初始化模块,其用于执行软件升级前,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化预留的内存空间;执行软件升级后,若操作系统重新加载,按照预设的数据结构,为预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化软件升级后预留的内存空间,若操作系统未重新加载,按照预设的数据结构,预留的内存空间创建管理内存的管理结构体和分配关键数据的管理结构体,并初始化软件升级前预留的内存空间;
内存空间分配模块,其用于执行软件升级前,通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间;执行软件升级后,若操作系统重新加载,在软件升级后预留的内存空间中通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,计算出关键数据的首地址并赋给升级后的软件,若操作系统未重新加载,在软件升级前预留的内存空间中通过更新管理内存的管理结构体和分配关键数据的管理结构体的值为关键数据分配内存空间,计算出关键数据的首地址并赋给升级后的软件。
实施例6:
在实施例5的基础上,内存空间预留模块通过引导内存分配器在内存中预留一块操作系统无法访问的内存空间。内存空间预留模块在内存中预留一块操作系统无法访问的内存空间时,预留的内存空间系统设于系统内存的最末端。
在VxWorks操作系统中,内存空间初始化模块直接操作预留的内存空间完成初始化;在Linux系统中,内存空间初始化模块通过内存映射文件的方法,映射预留的内存完成初始化。
内存空间分配模块为关键数据分配内存空间时,关键数据所占用的预留的内存空间不是最小内存块的倍数时,将通过算法强行补齐,有助于某些关键资源对于特殊bit位对齐的要求。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。