虚拟机内存管理方法和装置、虚拟机管理器转让专利

申请号 : CN201610130620.6

文献号 : CN107168766B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李凡

申请人 : 深信服科技股份有限公司

摘要 :

本发明涉及一种虚拟机内存管理方法和装置、虚拟机管理器,该方法包括:发送内存气球膨胀指令至虚拟机,内存气球膨胀指令中携带需回收内存量,使虚拟机根据需回收内存量增大内存气球体积;接收内存占据通知,获取内存占据通知中携带的内存气球体积增大时占据的虚拟内存页标识,回收占据的虚拟内存页标识对应的第一物理内存页;发送内存气球收缩指令,使虚拟机将增大后内存气球体积缩小为零,以使被回收的第一物理内存页对应的内存空间形成内存空洞;接收对内存空洞中虚拟内存页的访问请求,根据访问请求为被请求访问虚拟内存页分配第二物理内存页。避免因内存回收影响系统性能,保证内存及时归还,提高了适用性。

权利要求 :

1.一种虚拟机内存管理方法,所述方法应用于虚拟机管理器中,所述方法包括:发送内存气球膨胀指令至虚拟机,所述内存气球膨胀指令中携带需回收的内存量,使所述虚拟机根据所述需回收的内存量增大所述内存气球的体积以占据虚拟内存页;

接收所述虚拟机发送的内存占据通知,获取所述内存占据通知中携带的所述内存气球体积增大时所占据的虚拟内存页标识,回收所述占据的虚拟内存页标识对应的第一物理内存页;

发送内存气球收缩指令至所述虚拟机,使所述虚拟机通过虚拟化插件,将操作系统中的零页线程挂起,以关闭内存页自动置零机制,并将所述增大后的内存气球的体积缩小为零,以使所述虚拟机中被回收的第一物理内存页对应的内存空间形成内存空洞;

接收所述虚拟机发送的对所述内存空洞中的虚拟内存页的访问请求,根据所述访问请求为被请求访问的所述虚拟内存页分配第二物理内存页。

2.根据权利要求1所述的方法,其特征在于,所述回收所述占据的虚拟内存页标识对应的第一物理内存页的步骤,包括:将所述占据的虚拟内存页标识通过位图进行对应标记;

接收所述虚拟机发送的内存占据停止通知,将标记的所述虚拟内存页标识对应的地址连续的第一物理内存页进行一次性回收。

3.一种虚拟机内存管理方法,所述方法应用于虚拟机中,所述方法包括:

接收虚拟机管理器发送的内存气球膨胀指令,所述内存气球膨胀指令中携带需回收的内存量,根据所述需回收的内存量增大所述内存气球的体积;

发送内存占据通知至所述虚拟机管理器,所述内存占据通知中携带所述内存气球体积增大时所占据的虚拟内存页标识,使所述虚拟机管理器根据所述占据的虚拟内存页标识回收对应的第一物理内存页;

接收所述虚拟机管理器发送的内存气球收缩指令,通过虚拟化插件,将操作系统中的零页线程挂起,以关闭内存页自动置零机制,并根据所述内存气球收缩指令将所述内存气球的体积缩小为零,以使被回收的所述第一物理内存页对应的内存空间形成内存空洞;

向所述虚拟机管理器发送对所述内存空洞中的虚拟内存页的访问请求,使所述虚拟机管理器根据所述访问请求为被请求访问的所述虚拟内存页分配第二物理内存页。

4.根据权利要求3所述的方法,其特征在于,所述方法还包括:

在根据所述需回收的内存量增大所述内存气球体积时,检查虚拟机对应的剩余物理内存量,当所述剩余物理内存量达到预设安全阈值时,则停止增大内存气球体积。

5.一种虚拟机管理器,其特征在于,所述虚拟机管理器包括:

指令发送模块,用于发送内存气球膨胀指令至虚拟机,所述内存气球膨胀指令中携带需回收的内存量,使所述虚拟机根据所述需回收的内存量增大所述内存气球的体积以占据虚拟内存页;

内存回收模块,用于接收所述虚拟机发送的内存占据通知,获取所述内存占据通知中携带的所述内存气球体积增大时所占据的虚拟内存页标识,回收所述占据的虚拟内存页标识对应的第一物理内存页;

所述指令发送模块还用于发送内存气球收缩指令至所述虚拟机,使所述虚拟机通过虚拟化插件,将操作系统中的零页线程挂起,以关闭内存页自动置零机制,并将所述增大后的内存气球的体积缩小为零,以使所述虚拟机中被回收的第一物理内存页对应的内存空间形成内存空洞;

内存归还模块,用于接收所述虚拟机发送的对所述内存空洞中的虚拟内存页的访问请求,根据所述访问请求为被请求访问的所述虚拟内存页分配第二物理内存页。

6.根据权利要求5所述的虚拟机管理器,其特征在于,所述内存回收模块还用于将所述占据的虚拟内存页标识通过位图进行对应标记;接收所述虚拟机发送的内存占据停止通知,将标记的所述虚拟内存页标识对应的地址连续的第一物理内存页进行一次性回收。

7.一种虚拟机内存管理装置,其特征在于,所述装置包括:

体积增大模块,用于接收虚拟机管理器发送的内存气球膨胀指令,所述内存气球膨胀指令中携带需回收的内存量,根据所述需回收的内存量增大所述内存气球的体积;

发送模块,用于发送内存占据通知至所述虚拟机管理器,所述内存占据通知中携带所述内存气球体积增大时所占据的虚拟内存页标识,使所述虚拟机管理器根据所述占据的虚拟内存页标识回收对应的第一物理内存页;

体积收缩模块,用于接收所述虚拟机管理器发送的内存气球收缩指令,通过虚拟化插件,将操作系统中的零页线程挂起,以关闭内存页自动置零机制,并根据所述内存气球收缩指令将所述内存气球的体积缩小为零,以使被回收的所述第一物理内存页对应的内存空间形成内存空洞;

所述发送模块还用于向所述虚拟机管理器发送对所述内存空洞中的虚拟内存页的访问请求,使所述虚拟机管理器根据所述访问请求为被请求访问的所述虚拟内存页第二分配物理内存页。

8.根据权利要求7所述的装置,其特征在于,所述装置还包括:

剩余内存检查模块,用于在根据所述需回收的内存量增大所述内存气球体积时,检查虚拟机对应的剩余物理内存量,当所述剩余物理内存量达到预设安全阈值时,则通知所述体积增大模块停止增大内存气球体积。

说明书 :

虚拟机内存管理方法和装置、虚拟机管理器

技术领域

[0001] 本发明涉及虚拟化技术领域,特别是涉及一种虚拟机内存管理方法和装置、虚拟机管理器。

背景技术

[0002] 在虚拟化技术领域中,通常是通过内存超配技术(内存超配,指当前物理主机上运行的若干个虚拟机的配置内存总和大于物理主机的物理内存)来实现虚拟机内存资源的按需分配。这样一来,虚拟机部分内存不能直接访问,而是由Hypervisor(虚拟机管理器,运行于物理主机上的实现虚拟化功能的装置)根据虚拟机对内存的需求,为虚拟机分配和回收物理内存,以实现物理内存的按需分配。
[0003] ballooning(内存气球)技术是虚拟化技术领域较流行的一种虚拟机内存超配技术。然而,传统的内存气球技术中,虚拟机操作系统会认为内存气球中的内存空间对应的这部分物理内存是被占用了,就会判定可用内存不足而进行一些特殊操作,比如会开始使用交换分区,进而给系统性能带来负面影响。
[0004] 此外,由于传统方法中内存的回收和归还都是由Hypervisor来控制的,Hypervisor要动态平衡所有的虚拟机内存的回收与归还,虚拟机数量越多,Hypervisor的控制策略就越复杂,因此无法适用于大规模部署的场景。且这种根据Hypervisor监控虚拟机内存使用情况来进行内存的归还的情况下,由于监控具有滞后性,且内存归还速度有限,很容易造成因虚拟机操作系统突发使用较大内存,而内存归还不及时,而造成系统因内存不足出现卡顿或死机的情况。

发明内容

[0005] 基于此,有必要针对上述问题,提供一种能够不因内存回收而影响虚拟机操作系统的运行性能,能够及时归还内存、且适用性高的虚拟机内存管理方法和装置、虚拟机管理器。
[0006] 一种虚拟机内存管理方法,该方法应用于虚拟机管理器中,该方法包括:
[0007] 发送内存气球膨胀指令至虚拟机,所述内存气球膨胀指令中携带需回收的内存量,使所述虚拟机根据所述需回收的内存量增大所述内存气球的体积以占据虚拟内存页;
[0008] 接收虚拟机发送的内存占据通知,获取内存占据通知中携带的内存气球体积增大时所占据的虚拟内存页标识,回收占据的虚拟内存页标识对应的第一物理内存页;
[0009] 发送内存气球收缩指令至虚拟机,使虚拟机将增大后的内存气球的体积缩小为零,以使虚拟机中被回收的第一物理内存页对应的内存空间形成内存空洞;
[0010] 接收虚拟机发送的对内存空洞中的虚拟内存页的访问请求,根据所述访问请求为被请求访问的虚拟内存页分配第二物理内存页。
[0011] 在其中一个实施例中,回收占据的虚拟内存页标识对应的第一物理内存页的步骤,包括:
[0012] 将占据的虚拟内存页标识通过位图进行对应标记;
[0013] 接收虚拟机发送的内存占据停止通知,将标记的虚拟内存页标识对应的地址连续的第一物理内存页进行一次性回收。
[0014] 一种虚拟机内存管理方法,该方法应用于虚拟机中,该方法包括:
[0015] 接收虚拟机管理器发送的内存气球膨胀指令,内存气球膨胀指令中携带需回收的内存量,根据需回收的内存量增大内存气球的体积;
[0016] 发送内存占据通知至虚拟机管理器,内存占据通知中携带内存气球体积增大时所占据的虚拟内存页标识,使虚拟机管理器根据占据的虚拟内存页标识回收对应的第一物理内存页;
[0017] 接收虚拟机管理器发送的内存气球收缩指令,根据内存气球收缩指令将内存气球的体积缩小为零,以使被回收的第一物理内存页对应的内存空间形成内存空洞;
[0018] 向所述虚拟机管理器发送对内存空洞中的虚拟内存页的访问请求,使虚拟机管理器根据所述访问请求为被请求访问的虚拟内存页分配第二物理内存页。
[0019] 在其中一个实施例中,在根据内存气球收缩指令将内存气球的体积缩小为零的步骤之前,还包括:
[0020] 通过虚拟化插件关闭内存页自动置零机制。
[0021] 在其中一个实施例中,该方法还包括:
[0022] 在根据需回收的内存量增大内存气球体积时,检查虚拟机对应的剩余物理内存量,当剩余物理内存量达到预设安全阈值时,则停止增大内存气球体积。
[0023] 一种虚拟机管理器,该虚拟机管理器包括:
[0024] 指令发送模块,用于发送内存气球膨胀指令至虚拟机,内存气球膨胀指令中携带需回收的内存量,使虚拟机根据需回收的内存量增大内存气球的体积以占据虚拟内存页;
[0025] 内存回收模块,用于接收虚拟机发送的内存占据通知,获取内存占据通知中携带的内存气球体积增大时所占据的虚拟内存页标识,回收占据的虚拟内存页标识对应的第一物理内存页;
[0026] 指令发送模块还用于发送内存气球收缩指令至虚拟机,使虚拟机将增大后的内存气球的体积缩小为零,以使虚拟机中被回收的第一物理内存页对应的内存空间形成内存空洞;
[0027] 内存归还模块,用于接收虚拟机发送的对内存空洞中的虚拟内存页的访问请求,根据该访问请求为被请求访问的虚拟内存页分配第二物理内存页。
[0028] 在其中一个实施例中,内存回收模块还用于将占据的虚拟内存页标识通过位图进行对应标记;接收虚拟机发送的内存占据停止通知,将标记的虚拟内存页标识对应的地址连续的第一物理内存页进行一次性回收。
[0029] 一种虚拟机内存管理装置,该装置包括:
[0030] 体积增大模块,用于接收虚拟机管理器发送的内存气球膨胀指令,内存气球膨胀指令中携带需回收的内存量,根据需回收的内存量增大内存气球的体积;
[0031] 发送模块,用于发送内存占据通知至虚拟机管理器,内存占据通知中携带内存气球体积增大时所占据的虚拟内存页标识,使虚拟机管理器根据占据的虚拟内存页标识回收对应的第一物理内存页;
[0032] 体积收缩模块,用于接收虚拟机管理器发送的内存气球收缩指令,根据内存气球收缩指令将内存气球的体积缩小为零,以使被回收的第一物理内存页对应的内存空间形成内存空洞;
[0033] 发送模块还用于向虚拟机管理器发送对内存空洞中的虚拟内存页的访问请求,使虚拟机管理器根据该访问请求为被请求访问的虚拟内存页分配第二物理内存页。
[0034] 在其中一个实施例中,该装置还包括:
[0035] 自动置零关闭模块,用于通过虚拟化插件关闭内存页自动置零机制。
[0036] 在其中一个实施例中,该装置还包括:
[0037] 剩余内存检查模块,用于在根据需回收的内存量增大内存气球体积时,检查虚拟机对应的剩余物理内存量,当剩余物理内存量达到预设安全阈值时,则通知体积增大模块停止增大内存气球体积。
[0038] 上述虚拟机内存管理方法和装置、虚拟机管理器,通过内存气球膨胀指令使内存气球膨胀以占据虚拟内存页,回收所占据的虚拟内存页标识对应的第一物理内存页,通过内存气球收缩指令将增大后的内存气球体积缩小为零,使虚拟机中被回收的第一物理内存页对应的内存空间形成内存空洞,在接收虚拟机发送的对内存空洞中的虚拟内存页的访问请求时,为被请求访问的虚拟内存页分配第二物理内存页。通过建立内存空洞的方式,在回收物理内存时,虚拟机感受不到内存被占用,从而避免因内存回收造成的虚拟机误以为内存不足而进行一些特殊操作,而影响系统性能。此外,在内存归还时,不需要虚拟机管理器统一对所有虚拟机的内存使用情况进行监控,实现了内存的自动按需归还,保证了内存的及时归还,且提高了适用性,能够适用于大规模部署场景。

附图说明

[0039] 图1为一个实施例中虚拟机内存管理方法的流程示意图;
[0040] 图2A至图2B为一个实施例中内存空洞的示意图;
[0041] 图3为一个实施例中物理内存页回收方法的流程示意图;
[0042] 图4为另一个实施例中虚拟机内存管理方法的流程示意图;
[0043] 图5为一个实施例中虚拟机管理器的结构示意图;
[0044] 图6为一个实施例中虚拟机内存管理装置的结构示意图;
[0045] 图7为另一个实施例中虚拟机内存管理装置的结构示意图;
[0046] 图8为又一个实施例中虚拟机内存管理装置的结构示意图。

具体实施方式

[0047] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施例仅用于解释本发明,并不用于限定本发明。
[0048] 如图1所示,在一个实施例中,提供了一种虚拟机内存管理方法,该方法应用于虚拟机管理器中,该虚拟机管理器可用于监控和管理虚拟机物理内存分配情况,该虚拟机管理器运行于运行了若干个虚拟机的物理主机中,该方法具体包括以下步骤:
[0049] 步骤102,发送内存气球膨胀指令至虚拟机,内存气球膨胀指令中携带需回收的内存量,使虚拟机根据需回收的内存量增大内存气球的体积以占据虚拟内存页。
[0050] 本实施例中,虚拟机管理器向虚拟机发送内存气球膨胀指令,其中,内存气球膨胀指令中携带需回收的内存量。虚拟机接收内存气球膨胀指令后,会调用预先安装于虚拟机操作系统中的气球驱动,气球驱动根据需回收的内存量将内存气球增大至对应的体积,其中,增大内存气球体积时,内存气球中的内存页即为占据的虚拟内存页。
[0051] 步骤104,接收虚拟机发送的内存占据通知,获取内存占据通知中携带的内存气球体积增大时所占据的虚拟内存页标识,回收占据的虚拟内存页标识对应的第一物理内存页。
[0052] 本实施例中,虚拟机中的气球驱动在增大内存气球体积占据虚拟内存页时,会发送内存占据通知给虚拟机管理器,内存占据通知中携带了内存气球体积增大时所占据的虚拟内存页对应的虚拟内存页标识,以通知虚拟机管理器所占据的虚拟内存有哪些。
[0053] 进一步,虚拟机管理器获取内存占据通知中携带的占据的虚拟内存页标识,回收占据的虚拟内存页标识对应的第一物理内存页。具体的,虚拟机管理器会解除占据的虚拟内存页标识对应的虚拟内存页到物理内存页的映射关系,以回收对应的第一物理内存页。
[0054] 需要说明的是,虚拟机中的气球驱动可以边增大内存气球体积,边向虚拟机管理器发送内存占据通知,,比如,通过增大内存气球体积占据预设数量的内存页时,就向虚拟机管理器发送内存占据通知,其中,内存占据通知中携带所占据的预设数量的虚拟内存页对应的虚拟内存页标识,可以理解,预设数量可以为至少一页。此外,虚拟机中的气球驱动也可以在停止增大内存气球体积后,向虚拟机管理器发送一个内存占据通知,该内存占据通知中携带内存气球中的占据的总的虚拟内存页标识。本发明实施例虚拟机何时向虚拟机管理器发送内存占据通知不作限定。
[0055] 步骤106,发送内存气球收缩指令至虚拟机,使虚拟机将增大后的内存气球的体积缩小为零,以使虚拟机中被回收的第一物理内存页对应的内存空间形成内存空洞。
[0056] 本实施例中,虚拟机管理器在回收对应的第一物理内存页之后,进一步向虚拟机发送内存气球收缩指令。虚拟机根据内存气球收缩指令将增大后的内存气球体积缩小为零。这样一来,在步骤104被回收的第一物理内存页在虚拟机中对应的内存空间就形成了内存空洞。
[0057] 结合图2A至2B来进行解释说明内存空洞的建立方法,如图2A所示,图2A中为一个预先配置了8G内存的虚拟机的内存使用情况,M1为7G空闲内存,M2为1G已使用的内存,虚拟机的气球驱动接收虚拟机管理器的内存气球膨胀指令,先将内存气球膨胀占据整个M1的内存空间,虚拟机管理器回收内存气球占据的7G内存,然后向虚拟机发送气球收缩指令,气球驱动则将内存气球体积收缩为零,则被回收的第一物理内存页对应的之前被内存气球占据的内存空间即形成内存空洞,如图2B所示,图2B中的M3即为形成的7G内存空洞。
[0058] 内存空洞,是一种内存空间,该内存空间中的内存页在虚拟机看来是可用的、未被占用的内存,但实际上该内存空间中的虚拟机内存页对应的物理内存页已经被虚拟机管理器回收了,故将该种内存空间成为内存空洞。可以理解,因为内存气球收缩为零了,所以虚拟机感知不到内存空洞中的这部分内存被占用了,即虚拟机认为内存空洞中的这部分内存是可用的。然而,内存空洞中的虚拟内存页对应的物理内存页已经被回收了,所以回收的物理内存页是可以被虚拟机管理器分配给其他有需要的虚拟机的。
[0059] 步骤108,接收虚拟机发送的对内存空洞中的虚拟内存页的访问请求,根据该访问请求为被请求访问的虚拟内存页分配第二物理内存页。
[0060] 进一步,当虚拟机操作系统中运行的程序要访问内存空洞中的虚拟内存页时,虚拟机会向虚拟机管理器发送对内存空洞中的虚拟内存页的访问请求,虚拟机管理器接收对内存空洞中的虚拟内存页的访问请求后,会根据该访问请求为被请求访问的虚拟内存页分配第二物理内存页。具体的,虚拟机管理器会根据访问请求确定被请求访问的虚拟内存页的数量,进一步,从剩余空闲物理内存页中分配出对应的第二物理内存页,即为被请求访问的虚拟内存页建立一个物理内存页的映射关系,即实现第二物理内存页的分配。比如,请求访问的虚拟内存页数量为2G,则虚拟机管理器会根据该访问请求,从剩余空闲物理内存页中分配出对应的第二物理内存页,即对应分配2G物理内存页,进一步为被请求访问的虚拟内存页与分配出的第二物理内存页之间建立映射关系。
[0061] 本实施例中,通过向虚拟机发送内存气球膨胀指令,实现对内存气球膨胀时所占据的虚拟内存页标识对应的第一物理内存页的回收,通过向虚拟机发送内存气球收缩指令,使虚拟机中被回收的第一物理内存页对应的内存空间形成内存空洞,当虚拟机中的程序请求访问内存空洞中的虚拟内存页时,为被请求访问的虚拟内存页分配第二物理内存页。通过建立内存空洞的方式,在回收物理内存时,虚拟机感受不到内存被占用,从而避免因内存回收造成的虚拟机误以为内存不足而进行一些特殊操作,而影响系统性能。此外,在内存归还时,不需要虚拟机管理器统一对所有虚拟机的内存使用情况进行监控,实现了内存的自动按需归还,保证了内存的及时归还,且提高了适用性,能够适用于大规模部署场景。
[0062] 如图3所示,在一个实施例中,回收占据的虚拟内存页标识对应的第一物理内存页的步骤(简称物理内存页回收的步骤)包括:
[0063] 步骤302,将占据的虚拟内存页标识通过位图进行对应标记。
[0064] 步骤304,接收虚拟机发送的内存占据停止通知,将标记的虚拟内存页标识对应的地址连续的第一物理内存页进行一次性回收。
[0065] 本实施例中,在获取虚拟机发送的内存占据通知中携带的内存气球体积增大时所占据的虚拟内存页标识后,进一步将占据的虚拟内存页标识通过位图(Bitmap)进行对应标记。
[0066] 虚拟机在停止增大气球体积之后,会发送内存占据停止通知给虚拟机管理器,虚拟机管理器则会根据虚拟内存页标识在位图上的标记,判断哪些虚拟内存页对应的第一物理内存页地址是连续的,将地址连续的第一物理内存页进行一次性回收。其中,一次性回收是指,虚拟机管理器只调用一次API接口(Application Programming Interface,应用程序编程接口)即实现将地址连续的这部分第一物理内存页一起回收。
[0067] 可以理解,虚拟机管理器在回收物理内存页时需要调用API接口进行回收,其中,只调用一次API接口将将地址连续的这部分第一物理内存页一起回收,相较于传统方法中获取一个占用的内存页标识就调用一次API接口进行对应的物理内存页(即传统方法是将物理内存页一页一页的回收)来说,大大减少了API接口的调用次数,从而提高了物理内存页的回收效率。
[0068] 如图4所示,在一个实施例中,提供了一种虚拟机内存管理方法,以该方法应用于虚拟机中为例进行说明,其中该方法可适用于虚拟机中各种类型的操作系统,该虚拟机运行于物理主机中,该方法具体包括以下步骤:
[0069] 步骤402,接收虚拟机管理器发送的内存气球膨胀指令,内存气球膨胀指令中携带需回收的内存量,根据需回收的内存量增大内存气球的体积。
[0070] 本实施例中,虚拟机管理器向虚拟机发送内存气球膨胀指令,其中,内存气球膨胀指令中携带需回收的内存量。虚拟机接收内存气球膨胀指令后,会调用预先安装于虚拟机操作系统中的气球驱动,气球驱动根据需回收的内存量将内存气球增大至对应的体积,其中,增大内存气球体积时,内存气球中的内存页即为占据的虚拟内存页。
[0071] 步骤404,发送内存占据通知至虚拟机管理器,内存占据通知中携带内存气球体积增大时所占据的虚拟内存页标识,使虚拟机管理器根据占据的虚拟内存页标识回收对应的第一物理内存页。
[0072] 本实施例中,虚拟机中的气球驱动在增大内存气球体积占据虚拟内存页时,会发送内存占据通知给虚拟机管理器,内存占据通知中携带了内存气球体积增大时所占据的虚拟内存页对应的虚拟内存页标识,以通知虚拟机管理器所占据的内存有哪些。
[0073] 进一步,虚拟机管理器获取内存占据通知中携带的占据的虚拟内存页标识,回收占据的虚拟内存页标识对应的物理内存页。具体的,虚拟机管理器会解除占据的虚拟内存页标识对应的虚拟内存页到物理内存页的映射关系,以回收对应的物理内存页。
[0074] 需要说明的是,虚拟机中的气球驱动可以边增大内存气球体积,边向虚拟机管理器发送内存占据通知,,比如,通过增大内存气球体积占据预设数量的内存页是,就向虚拟机管理器发送内存占据通知,其中,内存占据通知中携带所占据的预设数量的虚拟内存页对应的虚拟内存页标识,可以理解,预设数量可以为至少一页。此外,虚拟机中的气球驱动也可以在停止增大内存气球体积后,向虚拟机管理器发送一个内存占据通知,该内存占据通知中携带内存气球中的占据的总的虚拟内存页标识。本发明实施例虚拟机何时向虚拟机管理器发送内存占据通知不作限定。
[0075] 步骤406,接收虚拟机管理器发送的内存气球收缩指令,根据内存气球收缩指令将内存气球体积缩小为零,以使被回收的第一物理内存页对应的内存空间形成内存空洞。
[0076] 本实施例中,虚拟机管理器在回收对应的物理内存页之后,进一步向虚拟机发送内存气球收缩指令。虚拟机根据内存气球收缩指令将增大后的内存气球体积缩小为零。这样一来,在步骤104被回收的物理内存页在虚拟机中对应的内存空间就形成了内存空洞。
[0077] 其中,内存空洞,是一种内存空间,该内存空间中的内存页在虚拟机看来是可用的、未被占用的内存,但实际上该内存空间中的虚拟机内存页对应的物理内存页已经被虚拟机管理器回收了,故将该种内存空间成为内存空洞。可以理解,因为内存气球收缩为零了,所以虚拟机感知不到内存空洞中的这部分内存被占用了,即虚拟机认为内存空洞中的这部分内存是可用的。然而,内存空洞中的虚拟内存页对应的物理内存页已经被回收了,所以回收的物理内存页是可以被虚拟机管理器分配给其他有需要的虚拟机的。
[0078] 步骤408,向虚拟机管理器发送对内存空洞中的虚拟内存页的访问请求,使虚拟机管理器根据该访问请求为被请求访问的虚拟内存页分配第二物理内存页。
[0079] 进一步,当虚拟机操作系统中运行的程序要访问内存空洞中的虚拟内存页时,虚拟机会向虚拟机管理器发送对内存空洞中的虚拟内存页的访问请求,虚拟机管理器接收对内存空洞中的虚拟内存页的访问请求后,会根据该访问请求为被请求访问的虚拟内存页第二分配物理内存页。具体的,虚拟机管理器会根据访问请求确定被请求访问的虚拟内存页的数量,进一步,从剩余空闲物理内存页中分配出对应的第二物理内存页,即为被请求访问的虚拟内存页建立一个物理内存页的映射关系,即实现第二物理内存页的分配。
[0080] 在一个实施例中,在根据内存气球收缩指令将述内存气球的体积缩小为零的步骤之前,还包括通过虚拟化插件关闭内存页自动置零机制的步骤。
[0081] 本实施例中,在根据内存气球收缩指令将述内存气球的体积缩小为零之前(即相当于建立内存空洞的步骤之前),对于一些存在内存页自动置零机制的操作系统,需要将内存页自动置零机制关闭。具体的,虚拟机会通过预先安装于虚拟机中的虚拟化插件来关闭内存页自动置零机制。以windows系统为例,可以通过虚拟化插件将windows系统中的零页线程挂起,实现内存页自动置零机制的关闭。可以理解,对于不存在内存页自动置零机制的操作系统,则可以省略该步骤。
[0082] 可以理解,因为在内存气球收缩为零形成内存空洞时,内存空洞中的内存对虚拟机来说是可用的,所以虚拟机会认为是有内存释放的,则虚拟机会执行内存页自动置零机制,进行自动置零操作,而自动置零操作会导致已回收的物理内存页又被重新映射,导致之前回收的物理内存页因自动置零操作又被归还了。因此,需要在建立内存空洞之前,将内存页自动置零机制关闭。
[0083] 进一步,可以在启动虚拟机操作系统时,将虚拟机操作系统中的内存页自动置零机制关闭,也可以在建立内存空洞之前的任何步骤来执行关闭该内存页自动置零机制的步骤。本发明实施例对此不做限定,只要满足在建立内存空洞之前关闭内存页自动置零机制,使该内存页自动置零机制不干扰、破坏内存空洞即可。
[0084] 在一个实施例中,该虚拟机内存管理方法还包括以下步骤:在根据需回收的内存量增大内存气球体积时,检查虚拟机对应的剩余物理内存量,当剩余物理内存量达到预设安全阈值时,则停止增大内存气球体积。
[0085] 本实施例中,在虚拟机的气球驱动中增加了安全检查机制,并预先设置了安全阈值,当气球驱动根据需回收的内存量增大内存气球体积时,气球驱动会通过安全检查机制检查剩余的虚拟机内存页的数量,即检查剩余虚拟内存量,根据虚拟内存页与物理内存页的映射关系,确定剩余虚拟内存量对应的剩余物理内存量,即确定该虚拟机对应的剩余物理内存量。当检查到虚拟机对应的剩余物理内存量达到预设安全阈值时,会停止增大内存气球体积。
[0086] 进一步,虚拟机会通过气球驱动向虚拟机管理器发送内存占据停止的通知。
[0087] 可以理解,该安全阈值可以根据实际情况进行不同设定。
[0088] 本实施例中,通过在气球驱动中增加安全检查机制,在增大内存气球体积时,检查剩余的虚拟机内存页的数量对应的剩余物理内存量是否超过预设安全阈值,当剩余物理内存量达到预设安全阈值时,则停止增大内存气球体积。避免了根据虚拟机管理器请求收回的内存量过大而导致虚拟机操作系统的内存耗尽,避免因内存回收而导致操作系统卡顿或死机的情况发生,实现在内存回收时,不影响操作系统的正常工作。
[0089] 如图5所示,在一个实施例中,提供了一种虚拟机管理器,该虚拟机管理器包括:
[0090] 指令发送模块502,用于发送内存气球膨胀指令至虚拟机,内存气球膨胀指令中携带需回收的内存量,使虚拟机根据需回收的内存量增大内存气球的体积以占据虚拟内存页。
[0091] 内存回收模块504,用于接收虚拟机发送的内存占据通知,获取内存占据通知中携带的内存气球体积增大时所占据的虚拟内存页标识,回收占据的虚拟内存页标识对应的第一物理内存页。
[0092] 指令发送模块502还用于发送内存气球收缩指令至虚拟机,使虚拟机将增大后的内存气球的体积缩小为零,以使虚拟机中被回收的第一物理内存页对应的内存空间形成内存空洞。
[0093] 内存归还模块506,用于接收虚拟机发送的对内存空洞中的虚拟内存页的访问请求,根据该访问请求为被请求访问的虚拟内存页分配第二物理内存页。
[0094] 在一个实施例中,内存回收模块504还用于将占据的虚拟内存页标识通过位图进行对应标记;接收虚拟机发送的内存占据停止通知,将标记的虚拟内存页标识对应的地址连续的第一物理内存页进行一次性回收。
[0095] 如图6所示,在一个实施例中,提供了一种虚拟机内存管理装置,该装置包括:
[0096] 体积增大模块602,用于接收虚拟机管理器发送的内存气球膨胀指令,内存气球膨胀指令中携带需回收的内存量,根据需回收的内存量增大内存气球的体积。
[0097] 发送模块604,用于发送内存占据通知至虚拟机管理器,内存占据通知中携带内存气球体积增大时所占据的虚拟内存页标识,使虚拟机管理器根据占据的虚拟内存页标识回收对应的第一物理内存页。
[0098] 体积收缩模块606,用于接收虚拟机管理器发送的内存气球收缩指令,根据内存气球收缩指令将内存气球的体积缩小为零,以使被回收的第一物理内存页对应的内存空间形成内存空洞。
[0099] 发送模块604还用于向虚拟机管理器发送对内存空洞中的虚拟内存页的访问请求,使虚拟机管理器根据该访问请求为被请求访问的虚拟内存页分配第二物理内存页。
[0100] 如图7所示,在一个实施例中,该装置还包括:
[0101] 自动置零关闭模块605,用于通过虚拟化插件关闭内存页自动置零机制。
[0102] 如图8所示,在一个实施例中,该装置还包括:
[0103] 剩余内存检查模块603,用于在根据需回收的内存量增大内存气球体积时,检查虚拟机对应的剩余物理内存量,当剩余物理内存量达到预设安全阈值时,则通知体积增大模块602停止增大内存气球体积。
[0104] 以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0105] 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。