一种支持进程热升级的内存处理方法、装置及电子设备与流程
未命名
09-24
阅读:37
评论:0
1.本发明涉及计算机技术领域,具体涉及一种支持进程热升级的内存处理方法、装置、及电子设备。
背景技术:
2.进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。进程是程序的基本执行实体,也是线程的容器。程序是指令、数据及其组织形式的描述,在操作系统运行起来的程序可以称为进程。所谓热升级,实际上就是在程序/服务不停止的前提下,通过增加、修改、删除相关功能模块,达到功能升级的目的。
3.然而,在进程的热升级过程中,通常是通过在底层对进程的内存数据进行修改,用新函数替换旧的共享库中的函数,通过更新共享库的方式实现进程的热升级。由于更新共享库需要依赖于共享库本身的内部函数来实现,并且旧的共享库没有被彻底升级之前,进程每次运行都需要重新执行一遍跳转逻辑,从而导致热升级效率低且应用场景受限。
技术实现要素:
4.为解决现有存在的技术问题,本技术的技术方案是这样实现的:
5.根据本技术的一方面,提供一种支持进程热升级的内存处理方法,所述方法包括:
6.在第一进程热升级的过程中,确定所述第一进程所占用内存的类型信息;
7.根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收;
8.将标记后的所述内存页面添加到对应的共享内存列表;
9.启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,实现将所述第一进程的内存移交给所述第二进程。
10.上述方案中,所述根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收,包括以下方法之一:
11.根据所述类型信息确定所述第一进程所占用的栈内存,为所述栈内存的内存页面添加复制标记,以锁定所述栈内存不被释放和回收;
12.根据所述类型信息确定所述第一进程所占用的堆内存,为所述堆内存的内存页面添加共享标记,以锁定所述堆内存不被释放和回收;
13.根据所述类型信息确定所述第一进程所占用的共享库内存,为所述共享库内存的内存页面添加共享标记,以锁定所述共享库内存不被释放和回收;
14.根据所述类型信息确定所述第一进程所占用的有名映射区内存,为所述有名映射区内存的内存页面添加共享标记,以锁定所述有名映射区内存不被释放和回收;
15.根据所述类型信息确定所述第一进程所占用的匿名共享内存,为所述匿名共享内存的内存页面添加文件句柄标记,以锁定所述匿名共享内存不被释放和回收。
16.上述方案中,所述将标记后的所述内存页面添加到对应的共享内存列表,包括:
17.将标记后的所述栈内存的内存页面添加到共享内存拷贝列表;
18.将标记后的所述堆内存的内存页面、所述共享库内存的内存页面以及所述有名映射区内存的内存页面添加到共享内存保留列表;
19.将标记后的所述匿名共享内存的内存页面添加到共享内存句柄列表。
20.上述方案中,在所述启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,所述方法还包括:
21.合并所述共享内存拷贝列表、所述共享内存保留列表和所述共享内存句柄列表,以生成全局共享内存列表;
22.将所述全局共享内存列表映射到共享内存,以供所述第二进程直接使用;或者,生成所述全局共享内存列表的启动参数,所述启动参数表征所述全局共享内存列表的存放地址;将所述启动参数发送给所述第二进程,以实现内存共享。
23.上述方案中,所述启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,包括:
24.启动第二进程,通过所述第二进程在所述共享内存中获得所述全局共享内存列表;或者,通过所述第二进程解析所述启动参数,以得到所述全局共享内存列表的第一存放地址,通过所述第一存放地址获得所述全局共享内存列表;
25.解析所述全局共享内存列表中存储的各子列表参数,得到各子列表的第二存放地址;所述各子列表中存储有各类型内存页面;
26.基于所述第二存放地址得到所述各子表列;
27.删除之前为所述各子列表中内存页面添加的所述锁定标记,以恢复所述内存升级之前原有的状态。
28.上述方案中,所述共享内存列表中至少包括:
29.用于记录内存页面的初始虚拟地址;
30.用于记录从所述初始虚拟地址开始计数的内存页面总标记数;
31.其中,所述初始虚拟地址和所述内存页面总标记数针对的是同一种内存类型;
32.所述启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,还包括:
33.启动第二进程,通过所述第二进程基于所述共享内存列表中的所述内存页面总标记数从所述初始虚拟地址开始对同一种类型的内存进行连续恢复。
34.上述方案中,所述确定所述第一进程所占用内存的类型信息,包括:
35.基于操作系统内部逻辑获取所述第一进程的进程控制信息;
36.基于所述进程控制信息中的内存指针获取所述第一进程的内存控制信息;
37.基于所述内存控制信息中的内存指针获取所述第一进程所占用内存的内存数据信息;
38.基于所述内存数据信息确定所述第一进程所占用内存的类型信息。
39.上述方案中,所述确定所述第一进程所占用内存的类型信息,还包括:
40.基于所述第一进程中的进程参数确定所述第一进程中具有子进程;
41.根据所述进程控制信息获取所述子进程的进程识别号;
42.根据所述进程识别号确定所述子进程所占用内存的类型信息。
43.根据本技术的第二方面,提供一种支持进程热升级的内存处理装置,其特征在于,所述装置包括:
44.确定单元,用于在第一进程热升级的过程中,确定所述第一进程所占用内存的类型信息;
45.标记单元,用于根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收;
46.添加单元,用于将标记后的所述内存页面添加到对应的共享内存列表;
47.恢复单元,用于启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,实现将所述第一进程的内存移交给所述第二进程。
48.根据本技术的第三方面,提供一种电子设备,其特征在于,所述电子设备包括:处理器和用于存储能够在处理器上运行的计算机程序的存储器,
49.其中,所述处理器用于运行所述计算机程序时,执行上述任一种支持进程热升级的内存处理方法中的任一项方法步骤。
50.根据本技术的第四方面,提供一种计算机可读存储介质,其特征在于,用于存储计算机指令,所述计算机指令被处理器执行时,执行上述任一种支持进程热升级的内存处理方法中的任一项方法步骤。
51.本发明实施例提供的支持进程热升级的内存处理方法、装置及电子设备,通过在第一进程热升级的过程中,确定所述第一进程所占用内存的类型信息;根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收;将标记后的所述内存页面添加到对应的共享内存列表;启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,实现将所述第一进程的内存移交给所述第二进程。为一种在进程热升级过程中,进行内存标记保留,通过分配已标记内存将原始进程的内存移交给新进程,并在新进程中恢复内存运行环境的整体解决方案。相比现有技术中通过替换旧的共享库中函数实现热升级,本技术的方案通过内存共享不仅可以减少热升级所消耗的时间,提高热升级的整体效率,而且使用场景不受限制。
附图说明
52.图1为本技术中支持进程热升级的内存处理方法的流程实现示意图一;
53.图2为本技术中对进程的不同内存类型进行标记的示意图;
54.图3为本技术中支持进程热升级的内存处理方法的流程实现示意图二;
55.图4为本技术中支持进程热升级的内存处理装置的结构组成示意图;
56.图5为本技术中电子设备的结构组成示意图。
具体实施方式
57.下面结合附图对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。
58.图1为本技术中支持进程热升级的内存处理方法的流程实现示意图一,该方法可以应用于基于windows或linux或macos操作系统的各种电子设备,该电子设备包括但不限于智能手机、笔记本电脑、台式电脑或平板电脑等终端设备,也可以是常规服务器、云服务
器或服务器阵列等服务端设备。如图1所示,该方法包括:
59.步骤101,在第一进程热升级的过程中,确定所述第一进程所占用内存的类型信息;
60.本技术中,第一进程占用的内存类型(以linux系统中进程占用情况为例)可主要分为代码段、数据段、堆、映射区、栈等几大类,其中映射区又可细分为通过mmap文件映射的有名映射区,以及memfd_create等系统调用分配的匿名共享映射区等。
61.本技术中,该电子设备在第一进程热升级的过程中,可以控制该第一进程中的所有线程停止运行。然后基于操作系统内部逻辑获取该第一进程的进程控制信息(pcb,process control block);基于该进程控制信息中的内存指针可以获取该第一进程的内存控制信息;基于该内存控制信息中的内存指针又可以获取该第一进程所占用内存的内存数据信息;基于该内存数据信息可以确定该第一进程所占用内存的类型信息。
62.这里,在pcb中包括有进程的进程识别号(pid,process identification)。比如在linux系统下,在用户空间可基于进程识别号通过文件“/proc/$pid/maps”来查看一个进程的所有段(segment)在虚拟地址空间的分布情况,该文件详细列出了不同段内存的起始地址与结束地址,通过遍历这些地址相应的页结构,便可以确定其内存类型。也可在程序中直接访问current宏定义获取进程pcb指针,然后基于pcb中有关内存控制信息获取各种内存地址,从而确定其占用的内存类型。
63.本技术中,该电子设备还可以基于该第一进程中的进程参数确定该第一进程中是否具有子进程。当该第一进程中具有子进程时,该电子设备根据该进程控制信息可以获取该子进程的进程识别号;根据该子进程的进程识别号可以通过确定第一进程所占内存的类型信息的方式确定该子进程所占用内存的类型信息。
64.比如,该电子设备可以在第一进程中获取表征子进程的参数,如果该参数是“no”,表示当前第一进程中没有子进程,如果该参数是“1”,表征当前第一进程中具有1个子进程,如果该参数是“2”,表征当前第一进程中具有2个子进程,如果该参数是“3”,表征当前第一进程中有3个子进程。
65.步骤102,根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收;
66.本技术中,该电子设备在对第一进程的内存进行保留标记时,需要对操作系统的内核(软件层面)做相应修改以实现部分功能的支持。在具体实现中,该电子设备需要让运行升级后二进制程序文件的新进程(第二进程)在execve()系统函数执行后,能够保留原有进程(第一进程)的内存。由于在默认情况下execve()函数并不支持内存的保留,所以要在内存管理中添加一个专门用于进程热升级的标记vma_exec_keep来保证该页(page)内存属于保留内存,在标记清除前不能予以释放和回收。
67.一种实现中,该电子设备如果根据该类型信息确定该第一进程所占用的内存是栈内存,则可以为该栈内存的内存页面添加复制标记,以锁定该栈内存不被释放和回收。
68.例如,该电子设备的操作系统在通过execve()执行第二进程的elf可执行文件时,则该可执行文件的代码段,数据段,栈空间就建立了,由于代码段和数据段在一开始是固化到程序文件里面的,对于进程热升级而言,该第一进程和该第二进程无需保持一致,所以这部分内存可以直接使用,在此不做处理。而栈空间由于随该第一进程运行而时刻改变,且其
空间不会太大,考虑到具体实施的难易程度,为保证热升级成功的概率该电子设备可以采用对第一进程栈空间进行内存标记,以防该内存被释放和回收。
69.这里,针对不易直接复用且空间十分有限的栈内存,采取复制内存数据的手段,可以提高热升级的成功率。
70.在另一实现中,该电子设备如果根据该类型信息确定该第一进程所占用的内存是堆内存,则可以为该堆内存的内存页面添加共享标记,以锁定该堆内存不被释放和回收。如果根据该类型信息确定该第一进程所占用的内存是共享库内存,则可以为该共享库内存的内存页面添加共享标记,以锁定该共享库内存不被释放和回收;如果根据该类型信息确定该第一进程所占用的内存是有名映射区内存,则可以为该有名映射区内存的内存页面添加共享标记,以锁定该有名映射区内存不被释放和回收。
71.例如,在该第一进程的运行过程中,可能需要借助ld.so加载动态链接库,比如最常用的libc,则此时第一进程的内存空间内会包含libc.so的代码段、数据段;随着第一进程的运行,绝大多数情况都会基于malloc()函数开辟堆内存,根据所需内存的大小,进程可能会通过brk()来扩大堆的大小,也可能通过mmap()的匿名映射来实现与其他进程的内存共享。对于这些内存,该电子设备可以采用对该第一进程内存进行标记保留,以防该内存被释放和回收。
72.这里,针对包含大量内存页面的映射区和堆内存采取重复利用旧进程相应页面的措施,可以减少内存复制从而节省时间。
73.本技术中,该电子设备如果根据该类型信息确定该第一进程所占用的内存是匿名共享内存,则可以为该电子设备如果匿名共享内存的内存页面添加文件句柄标记,以锁定该匿名共享内存不被释放和回收。
74.例如,在该第一进程的运行过程中,可能还存在一种匿名内存共享使用的情况,即通过对某一内存区域进行映射,并获得该块区域的文件句柄fd来操作内存的访问使用等。针对此种内存,由于获取到操纵内存的文件句柄fd就可以恢复该块内存,所以该电子设备可以采用对该内存进行内存标记防止该内存被释放和回收。
75.这里,针对包含文件句柄fd的匿名映射区则通过直接传递fd来恢复内存,可以提高进程热升级的整体效率。
76.这里,针对第一进程中具有子进程的情况,该电子设备可以针对每一个子进程进行递归运算来实现内存标记。
77.步骤103,将标记后的所述内存页面添加到对应的共享内存列表;
78.本技术中,该电子设备可以将标记后的该栈内存的内存页面添加到共享内存拷贝列表(例如copylist)中,等新升级的第二进程运行起来后逐一将栈内存数据按需复制到第二进程的栈空间实现新旧进程栈内存保持一致。
79.本技术中,该电子设备还可以将标记后的该堆内存的内存页面、该共享库内存的内存页面以及该有名映射区内存的内存页面添加到共享内存保留列表(如preservedlist)中,等新升级的第二进程运行起来后依次查找preservedlist中的标记页面便可以将该第一进程内存直接复用,进行热升级中的内存恢复。
80.本技术中,该电子设备还可以将标记后的该匿名共享内存的内存页面添加到共享内存句柄列表(fdlist)中,等新升级后的第二进程运行起来后通过获取该共享内存句柄列
表中的所有fd值,进而可以获取相应的内存数据以实现内存恢复。
81.本技术中,为了提高传输标记页面的效率,通过建立各种全局list列表(copylist,preservedlist,fdlist)来保存相应的内存数据页面,然后在新进程启动时,直接将包含list头信息的数据传递给新进程就可实现对标记页面的恢复。
82.本技术中,该电子设备还可以合并该共享内存拷贝列表、该共享内存保留列表和该共享内存句柄列表,以生成全局共享内存列表。如此,可以减少向第二进程传送该共享内存列表的次数,以提高向第二进程传输该共享内存列表的效率。
83.本技术中,该电子设备还可以将该全局共享内存列表映射到共享内存以供第二进程直接使用;或者,生成该全局共享内存列表的启动参数。然后在启动第二进程的过程中,将该启动参数发送给第二进程,以实现内存共享。
84.这里,该启动参数表征该全局共享内存列表的存放地址。
85.步骤104,启动第二进程,通过所述第二进程基于所述内存列表恢复所述内存状态。
86.一种实现中,该电子设备在启动第二进程的过程中,可以通过该第二进程在该共享内存中获得该全局共享内存列表。
87.另一种实现中,该电子设备可以通过该第二进程解析该启动参数,以得到该全局共享内存列表的第一存放地址,通过该第一存放地址获得该全局共享内存列表。
88.本技术中,该电子设备在通过第二进程获得该全局共享内存列表后,还可以解析该全局共享内存列表中存储的各子列表参数,以得到各子列表的第二存放地址;这里,各子列表中存储有各类型内存页面;基于该第二存放地址得到该各子表列;然后通过删除之前在该各子列表中添加在内存页面的保留标记(即锁定标记),以恢复该第一进程所占用的内存的内存状态。
89.比如,该电子设备通过该第二进程可以在子列表(copylist)中复制栈内存页面,并去除栈内存页面的vma_exec_keep标记,以恢复stack栈内存空间;通过该第二进程可以在子列表(preservedlist)中直接获取相应的内存页面(比如堆内存的内存页面、该共享库内存的内存页面以及该有名映射区内存的内存页面),并去除相应内存页面中的vma_exec_keep标记,以恢复堆、共享库、有名映射区相应的内存空间;通过该第二进程可以在子列表(fdlist)中获取匿名共享内存中控制页面的文件句柄,根据fd可以查找到相应内存并去除匿名共享内存页面中vma_exec_keep标记,以恢复匿名共享内存。
90.本技术中,该电子设备在创建第二进程之后,不需要为第二进程分配内存空间,而是将带有保留标记的内存(即所述第一进程占用的内存)采用少量复制和多数直接移交的方法转移给第二进程,这样第二进程就可以基于同样的虚拟地址来访问第一进程之前占用的内存,实现内存共享。这样在进程热升级过程中,会极大的避免将第一进程的内存数据拷贝到第二进程内存空间的操作,实现快速升级保证效率。
91.本技术中,该全局内存列表中至少包括:用于记录内存页面的初始虚拟地址;以及用于记录从所述初始虚拟地址开始计数的内存页面总标记数;其中,该初始虚拟地址和该内存页面总标记数针对的是同一种内存类型;该电子设备在启动第二进程的过程中,通过该第二进程可以基于该共享内存列表中的该内存页面总标记数从该初始虚拟地址开始对同一种类型的内存进行连续恢复。如此,在保存连续标记页面时,不用再将每个标记页面的
addr都添加到list中,而是只添加起始页面的addr和一个记录多少连续标记页面的num即可。从而可以提高连续页面的标记存储速率和恢复效率。比如之前要存1000个页面地址,现在只需存1个页面地址加一个数字即可。
92.这里,对于三类保存列表*list(copylist,preservedlist,fdlist)来说,除了用于记录页面初始虚拟地址addr之外,还会添加一个num属性,用于记录从addr开始总共标记多少个page页面。
93.比如对于(addr,num)=(0x12345678,128)而言。就代表从虚拟地址0x12345678处开始,连续对其后的128个页面(包括自己)进行标记保存。如果只标记一页,就对num赋值为1即可。如此,可以大大提高连续页面的标记存储效率和恢复效率。
94.这里,在为进程所占用内存的连续页面添加锁定标记时,还是要一个页面一个页面添加,只不过对于连续页面来说,可以一次性循环添加完毕之后再对下一个类型的页存内存进行标记的添加。
95.本技术中,针对第一进程中具有子进程的情况,该电子设备可以针对每一个子进程进行递归运算来实现内存恢复。
96.本技术中,在进程运行中一般还会存在一些针对数据安全考虑的缓冲防护空间,它们的大小往往比较固定比如4k,针对此种页面,因为其数据信息绝大多数没有意义,所以在进程的热升级中,可以直接略过,在内存恢复时按应用具体情况酌情预留出防护空间即可;如果追求绝对的内存恢复或对热升级所消耗的时间容忍度较高,也可以将其全部像堆内存那样标记保留,后期再逐一恢复。
97.本技术提供的支持进程热升级的内存处理方法,通过为初始进程占用的内存添加保留标记,以确保该内存不被释放,使得在新进程启动后可以基于全局内存列表*list查找标记页面将旧进程之前保留的内存逐一恢复,实现内存共享,而无需进行内存拷贝,这样不仅可以节约资源,而且还可以减少热升级所消耗的时间从而提高整体效率。
98.另外,本技术中针对进程热升级的内存保留与恢复过程,对于进程热升级的适用范围不做具体限制,即不再局限于进程中共享库的升级,只要能通过对操作系统内核修改添加类似vm_exec_keep的flag用于支持内存标记,就可以在原始进程运行期间暂停,通过本方案提出的内存标记保留与恢复技术,实现新进程对内存的复用与热升级。
99.其次,本方案对于一般进程运行过程中所遇到的几种不同内存类型分别进行分析并提出与之对应的内存处理措施,包括但不限于大块内存的重复分配,带文件句柄fd内存的直接复用,以及为确保热升级成功而做的栈空间复制等操作。针对不同的内存类型做处理,可以更灵活的扩大进程热升级的适用范围,以及提升热升级的整体效率。这些内存的处理得益于对内核添加vm_exec_keep的修改,以保证内存支持保留技术,同时也借助于操作系统对进程的控制信息以获取到该进程的内存信息,从而进一步针对不同的内存类型进行各种标记恢复操作。
100.第四,本技术根据进程使用内存的局部性原理,进程中所使用的内存有很大部分是连续的,这样通过在添加标记内存时所采用的的连续页面处理机制,可以很大程度上减少进程热升级时存储标记内存页面所消耗的时间,进而提升整体升级效率。
101.第五,本技术所描述的内存保留与恢复技术,由于极大的复用内存减少了升级消耗,所以在进程热升级时具有非常小的宕停时间downtime(进程热升级时从停止服务开始
直到热升级完毕并恢复服务所需的总时间),downtime根据具体进程占据系统资源的不同而不同,一般不超过300ms。目前在一种虚拟机监控软件进程热升级中模拟适用以上内存保留与恢复技术,在新建虚拟机(规格为4c16g)初始状态完成监控软件进程热升级,并恢复新建虚机的总体downtime时间约为220ms。
102.图2为本技术中对进程的不同内存类型进行标记的示意图,如图2所示,
103.以linux系统中进程占用情况为例,根据进程占用的内存类型可主要分为代码段、数据段、堆、共享库、映射区、栈等几大类,其中映射区又可细分为通过mmap文件映射的有名映射区,以及memfd_create等系统调用分配的匿名共享映射区等。
104.其中,由于代码段和数据段在一开始是固化到程序文件里面的,对于进程热升级而言,该第一进程和该第二进程无需保持一致,所以这部分内存可以直接使用,在此不做处理。
105.而栈空间(stack)由于随该第一进程运行而时刻改变,且其空间不会太大,考虑到具体实施的难易程度,为保证热升级成功的概率,所以本技术采用字符串“vma_exec_keep”对第一进程栈空间(stack)进行内存标记,并将标记后的栈内存页面添加进全局内存拷贝列表copylist中,等第二进程运行起来后逐一将栈内存数据按需复制到第二进程的栈空间实现新旧进程栈内存保持一致。
106.在该第一进程运行过程中,可能需要借助ld.so加载动态链接库,比如最常用的libc,则此时第一进程的内存空间内会包含libc.so的代码段、数据段;随着进程运行,绝大多数情况都会基于malloc()函数开辟堆内存,根据所需内存的大小,进程可能会通过brk()来扩大堆的大小,也可能通过mmap()的匿名映射来实现与其他进程的内存共享。对于这些内存,本技术同样采用字符串“vma_exec_keep”对第一进程的内存进行标记保留,并将标记后的堆的内存页面添加进全局内存保留列表preservedlist中,等第二进程运行起来后依次查找preservedlist中的标记页面便可以将该第一进程的内存直接复用,从而实现在进程热升级中的内存恢复。
107.在该第一进程运行过程中,可能还存在一种匿名内存共享使用的情况,即通过对某一内存区域进行映射,并获得该块区域的文件句柄fd来操作内存的访问使用等。针对此种内存,由于获取到操纵内存的文件句柄fd就可以恢复该块内存,所以本技术同样采用字符串“vma_exec_keep”对该内存进行内存标记防止释放,然后将其文件句柄添加到全局内存句柄列表fdlist中,等第二进程运行起来后通过获取列表中的所有fd,进而获取相应的内存数据以实现内存恢复。
108.本技术根据这些不同的内存类型,采取不同的处理措施可以实现高效快速的内存保留及后期恢复。
109.图3为本技术中进程的热升级方法的流程实现示意图二,如图3所示,该方法包括:
110.步骤301,停止待升级进程process1的运行;
111.步骤302,通过process1的进程控制信息(如pcb),找到内存控制信息(如mm);
112.步骤303,对stack栈内存使用到的页page添加vma_exec_keep标记;并对其引用计数执行refcount++操作;
113.步骤304,判断是否还有一下页面需要标记;如果是,重复步骤303,如果否,执行步骤305;
114.步骤305,将所有标记完成后的内存页添加到copylist列表中;
115.步骤306,分别对heap堆内存、共享库内存、有名映射区使用到的页page添加vma_exec_keep标记,并对其引用计数执行refcount++操作;
116.步骤307,判断是否还有一下页面需要标记;如果是,重复步骤306,如果否,执行步骤308;
117.步骤308,将所有标记完成后的内存页添加到preservedlist列表中;
118.步骤309,对通过文件句柄fd操作的匿名共享内存使用到的页page添加vma_exec_keep标记,并对其引用计数执行refcount++操作;
119.这里,若进程未使用该类型页面则略过此步骤;
120.步骤310,判断是否还有一下页面需要标记;如果是,重复步骤309,如果否,执行步骤311;
121.步骤311,将所有标记完成后的内存页添加到fdlist列表中;
122.步骤312,查找process1有无子进程,若有则对所有子进程递归执行上述步骤302至步骤311,若无则略过;
123.步骤313,启动新进程process2,并将包含copylist、preservedlist、fdlist列表地址的信息以启动参数的形式传递给process2;
124.步骤314,process2启动运行时,解析各个参数,分别找到各类list的存放地址;
125.步骤315,通过地址copylist复制栈内存页面,并去除vma_exec_keep标记,恢复stack栈内存空间;
126.步骤316,通过地址preservedlist直接获取相应的内存页面,并去除vma_exec_keep标记,恢复堆、共享库、有名映射区相应的内存空间;
127.步骤317,通过地址fdlist获取控制页面的文件句柄,根据fd查找到相应内存并去除vma_exec_keep标记,恢复匿名共享内存;
128.步骤318,process2内存恢复,开始从process1暂停处继续运行。
129.至此,process1退出,结束运行。
130.本技术提供的是在对进程进行热升级时用到的内存标记保留、共享查找、内存恢复的整体方案。即在旧进程准备升级时,先对其进程占用的内存进行遍历,根据不同的内存类型进行不同的处理。比如为所有使用到的共享库内存页面添加一种特殊标记(此标记需要修改操作系统内核,为内存添加一种全新的只用于进程热升级保留的flag),并使其页面引用计数加1,以锁定内存不被释放。所有遍历出来的内存整体根据不同的类型存放到相应的全局保留内存列表*list中,最后合并成统一列表preserved_lists,并映射到共享内存(或以启动参数的形式传递给新进程使用)。启动升级后的新进程,然后通过查找共享内存中的preserved_lists列表逐一恢复之前旧进程使用到的内存,新进程在执行过程中基于所保存的内存数据恢复之前的进程状态,并为内存页面去除之前添加的保留标记,完成内存还原从而提供进程热升级的内存支持。
131.图4为本技术中支持进程热升级的内存处理装置的结构组成示意图,如图4所示,该装置包括:
132.确定单元401,用于在第一进程热升级的过程中,确定所述第一进程所占用内存的类型信息;
133.标记单元402,用于根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收;
134.添加单元403,用于将标记后的所述内存页面添加到对应的共享内存列表;
135.恢复单元404,用于启动第二进程时,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,实现将所述第一进程的内存移交给所述第二进程。
136.优选方案中,确定单元401,还用于根据所述类型信息确定所述第一进程所占用的栈内存;
137.标记单元402,具体用于为所述栈内存的内存页面添加复制标记,以锁定所述栈内存不被释放和回收;
138.优选方案中,确定单元401,还用于根据所述类型信息确定所述第一进程所占用的堆内存;
139.标记单元402,具体用于为所述堆内存的内存页面添加共享标记,以锁定所述堆内存不被释放和回收;
140.优选方案中,确定单元401,还用于根据所述类型信息确定所述第一进程所占用的共享库内存;
141.标记单元402,具体用于为所述共享库内存的内存页面添加共享标记,以锁定所述共享库内存不被释放和回收;
142.优选方案中,确定单元401,还用于根据所述类型信息确定所述第一进程所占用的有名映射区内存;
143.标记单元402,具体用于为所述有名映射区内存的内存页面添加共享标记,以锁定所述有名映射区内存不被释放和回收;
144.优选方案中,确定单元401,还用于根据所述类型信息确定所述第一进程所占用的匿名共享内存;
145.标记单元402,具体用于为所述匿名共享内存的内存页面添加文件句柄标记,以锁定所述匿名共享内存不被释放和回收。
146.优选方案中,添加单元403,具体用于将标记后的所述栈内存的内存页面添加到共享内存拷贝列表;以及将标记后的所述堆内存的内存页面、所述共享库内存的内存页面以及所述有名映射区内存的内存页面添加到共享内存保留列表;以及将标记后的所述匿名共享内存的内存页面添加到共享内存句柄列表。
147.优选方案中,该电子设备还包括:合并单元405、处理单元406和发送单元407;
148.其中,合并单元405,用于合并所述共享内存拷贝列表、所述共享内存保留列表和所述共享内存句柄列表,以生成全局共享内存列表;
149.处理单元406,用于将所述全局共享内存列表映射到共享内存以供第二进程直接使用;或者,生成所述全局共享内存列表的启动参数,所述启动参数表征所述全局共享内存列表的存放地址;
150.发送单元407,用于将所述启动参数发送给所述第二进程,以实现内存共享。
151.优选方案中,该电子设备还包括:
152.获取单元408,用于启动第二进程时,通过所述第二进程在所述共享内存中获得所述全局共享内存列表;或者,通过所述第二进程解析所述启动参数,以得到所述全局共享内
存列表的第一存放地址,通过所述第一存放地址获得所述全局共享内存列表;以及解析所述全局共享内存列表中存储的各子列表参数,得到各子列表的第二存放地址;所述各子列表中存储有各类型内存页面;以及基于所述第二存放地址得到所述各子表列;
153.恢复单元404,具体用于删除之前添加到所述各子列表中内存页面的锁定标记,以恢复所述内存升级之前原有的状态。
154.这里,所述共享内存列表中至少包括:
155.用于记录内存页面的初始虚拟地址;
156.用于记录从所述初始虚拟地址开始计数的内存页面总标记数;
157.其中,所述初始虚拟地址和所述内存页面总标记数针对的是同一种内存类型。
158.优选方案中,该恢复单元404,具体还用于启动第二进程,通过所述第二进程基于所述共享内存列表中的所述内存页面总标记数从所述初始虚拟地址开始对同一种类型的内存进行连续恢复。
159.优选方案中,该获取单元408,还用于基于操作系统内部逻辑获取所述第一进程的进程控制信息;
160.基于所述进程控制信息中的内存指针获取所述第一进程的内存控制信息;
161.基于所述内存控制信息中的内存指针获取所述第一进程所占用内存的内存数据信息;
162.确定单元401,具体用于基于所述内存数据信息确定所述第一进程所占用内存的类型信息。
163.优选方案中,确定单元401,还用于基于所述第一进程中的进程参数确定所述第一进程中具有子进程;
164.该获取单元408,还用于根据所述进程控制信息获取所述子进程的进程识别号;
165.确定单元401,具体用于根据所述进程识别号确定所述子进程所占用内存的类型信息。
166.需要说明的是:上述实施例提供的支持进程热升级的内存处理装置在对进程进行内存标记和内存恢复时,仅以上述各程序模块的划分进行举例说明,实际应用中,可以根据需要而将上述处理分配由不同的程序模块完成,即将装置的内部结构划分成不同的程序模块,以完成以上描述的全部或者部分处理。另外,上述实施例提供的支持进程热升级的内存处理装置与上述提供的支持进程热升级的内存处理方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
167.图5为本技术中电子设备的结构组成示意图,如图5所示,电子设备500可以是基于windows或linux或macos操作系统的一种计算机设备,包括但不限于是计算机、数字广播终端、信息收发设备、医疗设备、健身设备、个人数字助理等终端或服务器,这里,服务器包括但不限于实体服务器、云服务器。图5所示的电子设备500包括:至少一个处理器501、存储器502、至少一个网络接口504和用户接口503。网络接口504可以与与外部数据库连通,进行数据访问和操作,该外部数据库可以非本计算机设备的硬件组成部分,而是部署在本设备之外的计算机设备上的数据库系统,并通过网络向外部提供数据库服务;网络接口504还可以与消息队列实体连通,将本硬件实体产生的消息放入消息队列实体,或从消息队列实体中消费消息,该消息队列可以非本计算机设备的硬件组成部分,而是部署在本设备之外的计
算机设备上的消息队列系统,并通过网络向外部提供消息服务;网络接口504还可以与向被测系统的网络接口发送网络报文,并接收响应报文,该被测系统可以非本计算机设备的硬件组成部分,而是部署在本设备之外的计算机设备上的某个网络应用系统,并通过网络向外部提供应用服务。
168.电子设备500中的各个组件通过总线系统505耦合在一起。可理解,总线系统505用于实现这些组件之间的连接通信。总线系统505除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图5中将各种总线都标为总线系统505。
169.其中,用户接口503可以包括显示器、键盘、鼠标、轨迹球、点击轮、按键、按钮、触感板或者触摸屏等。
170.可以理解,存储器502可以是易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(rom,read only memory)、可编程只读存储器(prom,programmable read-only memory)、可擦除可编程只读存储器(eprom,erasable programmable read-only memory)、电可擦除可编程只读存储器(eeprom,electrically erasable programmable read-only memory)、磁性随机存取存储器(fram,ferromagnetic random access memory)、快闪存储器(flash memory)、磁表面存储器、光盘、或只读光盘(cd-rom,compact disc read-only memory);磁表面存储器可以是磁盘存储器或磁带存储器。易失性存储器可以是随机存取存储器(ram,random access memory),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的ram可用,例如静态随机存取存储器(sram,static random access memory)、同步静态随机存取存储器(ssram,synchronous static random access memory)、动态随机存取存储器(dram,dynamic random access memory)、同步动态随机存取存储器(sdram,synchronous dynamic random access memory)、双倍数据速率同步动态随机存取存储器(ddrsdram,double data rate synchronous dynamic random access memory)、增强型同步动态随机存取存储器(esdram,enhanced synchronous dynamic random access memory)、同步连接动态随机存取存储器(sldram,synclink dynamic random access memory)、直接内存总线随机存取存储器(drram,direct rambus random access memory)。本技术实施例描述的存储器502旨在包括但不限于这些和任意其它适合类型的存储器。
171.本技术实施例中的存储器502用于存储各种类型的数据以支持电子设备500的操作。这些数据的示例包括:用于在电子设备500上操作的任何计算机程序,如操作系统5021和应用程序5022;联系人数据;电话簿数据;消息;图片;音频等。其中,操作系统5021包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序5022可以包含各种应用程序,例如媒体播放器(media player)、浏览器(browser)等,用于实现各种应用业务。实现本技术实施例方法的程序可以包含在应用程序5022中。
172.上述本技术实施例揭示的方法可以应用于处理器501中,或者由处理器501实现。处理器501可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器501中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器501可以是通用处理器、数字信号处理器(dsp,digital signal processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。处理器501可以实现或者执
行本技术实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本技术实施例所公开的方法的步骤,可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于存储介质中,该存储介质位于存储器502,处理器501读取存储器502中的信息,结合其硬件完成前述方法的步骤。
173.在示例性实施例中,电子设备500可以被一个或多个应用专用集成电路(asic,application specific integrated circuit)、dsp、可编程逻辑器件(pld,programmable logic device)、复杂可编程逻辑器件(cpld,complex programmable logic device)、现场可编程门阵列(fpga,field-programmable gate array)、通用处理器、控制器、微控制器(mcu,micro controller unit)、微处理器(microprocessor)、或其他电子元件实现,用于执行前述方法。
174.在示例性实施例中,本技术实施例还提供了一种计算机可读存储介质,例如包括计算机程序的存储器502,上述计算机程序可由电子设备500的处理器501执行,以完成前述方法所述步骤。计算机可读存储介质可以是fram、rom、prom、eprom、eeprom、flash memory、磁表面存储器、光盘、或cd-rom等存储器;也可以是包括上述存储器之一或任意组合的各种设备,如移动电话、计算机、平板设备、个人数字助理等。
175.一种计算机可读存储介质,其上存储有计算机指令,该计算机指令被处理器执行时,执行上述任一种系统测试方法中任一项方法步骤。
176.在本技术所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
177.上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
178.本技术所提供的几个方法实施例中所揭露的方法,在不冲突的情况下可以任意组合,得到新的方法实施例。
179.本技术所提供的几个产品实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的产品实施例。
180.本技术所提供的几个方法或设备实施例中所揭露的特征,在不冲突的情况下可以任意组合,得到新的方法实施例或设备实施例。
181.以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
技术特征:
1.一种支持进程热升级的内存处理方法,其特征在于,所述方法包括:在第一进程热升级的过程中,确定所述第一进程所占用内存的类型信息;根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收;将标记后的所述内存页面添加到对应的共享内存列表;启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,实现将所述第一进程的内存移交给所述第二进程。2.根据权利要求1所述的方法,其中,所述根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收,包括以下方法之一:根据所述类型信息确定所述第一进程所占用的栈内存,为所述栈内存的内存页面添加复制标记,以锁定所述栈内存不被释放和回收;根据所述类型信息确定所述第一进程所占用的堆内存,为所述堆内存的内存页面添加共享标记,以锁定所述堆内存不被释放和回收;根据所述类型信息确定所述第一进程所占用的共享库内存,为所述共享库内存的内存页面添加共享标记,以锁定所述共享库内存不被释放和回收;根据所述类型信息确定所述第一进程所占用的有名映射区内存,为所述有名映射区内存的内存页面添加共享标记,以锁定所述有名映射区内存不被释放和回收;根据所述类型信息确定所述第一进程所占用的匿名共享内存,为所述匿名共享内存的内存页面添加文件句柄标记,以锁定所述匿名共享内存不被释放和回收。3.根据权利要求2所述的方法,其中,所述将标记后的所述内存页面添加到对应的共享内存列表,包括:将标记后的所述栈内存的内存页面添加到共享内存拷贝列表;将标记后的所述堆内存的内存页面、所述共享库内存的内存页面以及所述有名映射区内存的内存页面添加到共享内存保留列表;将标记后的所述匿名共享内存的内存页面添加到共享内存句柄列表。4.根据权利要求3所述的方法,其中,在所述启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,所述方法还包括:合并所述共享内存拷贝列表、所述共享内存保留列表和所述共享内存句柄列表,以生成全局共享内存列表;将所述全局共享内存列表映射到共享内存,以供所述第二进程直接使用;或者,生成所述全局共享内存列表的启动参数,所述启动参数表征所述全局共享内存列表的存放地址;将所述启动参数发送给所述第二进程,以实现内存共享。5.根据权利要求4所述的方法,其中,所述启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,包括:启动第二进程,通过所述第二进程在所述共享内存中获得所述全局共享内存列表;或者,通过所述第二进程解析所述启动参数,以得到所述全局共享内存列表的第一存放地址,通过所述第一存放地址获得所述全局共享内存列表;解析所述全局共享内存列表中存储的各子列表参数,得到各子列表的第二存放地址;所述各子列表中存储有各类型内存页面;
基于所述第二存放地址得到所述各子表列;删除之前为所述各子列表中内存页面添加的所述锁定标记,以恢复所述内存升级之前原有的状态。6.根据权利要求1所述的方法,其中,所述共享内存列表中至少包括:用于记录内存页面的初始虚拟地址;用于记录从所述初始虚拟地址开始计数的内存页面总标记数;其中,所述初始虚拟地址和所述内存页面总标记数针对的是同一种内存类型;所述启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,还包括:启动第二进程,通过所述第二进程基于所述共享内存列表中的所述内存页面总标记数从所述初始虚拟地址开始对同一种类型的内存进行连续恢复。7.根据权利要求1所述的方法,其中,所述确定所述第一进程所占用内存的类型信息,包括:基于操作系统内部逻辑获取所述第一进程的进程控制信息;基于所述进程控制信息中的内存指针获取所述第一进程的内存控制信息;基于所述内存控制信息中的内存指针获取所述第一进程所占用内存的内存数据信息;基于所述内存数据信息确定所述第一进程所占用内存的类型信息。8.根据权利要求7所述的方法,其中,所述确定所述第一进程所占用内存的类型信息,还包括:基于所述第一进程中的进程参数确定所述第一进程中具有子进程;根据所述进程控制信息获取所述子进程的进程识别号;根据所述进程识别号确定所述子进程所占用内存的类型信息。9.一种支持进程热升级的内存处理装置,其特征在于,所述装置包括:确定单元,用于在第一进程热升级的过程中,确定所述第一进程所占用内存的类型信息;标记单元,用于根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收;添加单元,用于将标记后的所述内存页面添加到对应的共享内存列表;恢复单元,用于启动第二进程,通过所述第二进程基于所述共享内存列表恢复所述内存升级之前原有的状态,实现将所述第一进程的内存移交给所述第二进程。10.一种电子设备,其特征在于,所述电子设备包括:处理器和用于存储能够在处理器上运行的计算机程序的存储器,其中,所述处理器用于运行所述计算机程序时,执行上述权利要求1至8所述的任一种支持进程热升级的内存处理方法中的任一项方法步骤。
技术总结
本申请提供一种支持进程热升级的内存处理方法,所述方法包括:在第一进程热升级的过程中,确定所述第一进程所占用内存的类型信息;根据所述类型信息为不同类型的内存页面添加锁定标记,以锁定所述内存不被释放和回收;将标记后的所述内存页面添加到一种全局共享的内存列表;启动第二进程,通过所述第二进程基于所述内存列表恢复所述内存升级之前原有的状态,以支持进程热升级。本申请还同时提供了一种支持进程热升级的内存处理装置、及电子设备,可以提高进程的热升级效率。可以提高进程的热升级效率。可以提高进程的热升级效率。
技术研发人员:简春福 严海双 顾志峰
受保护的技术使用者:中国移动通信集团有限公司
技术研发日:2022.09.20
技术公布日:2023/9/22
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
航空商城 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/