本發(fā)明涉及虛擬化技術(shù)領(lǐng)域,特別是涉及一種虛擬機(jī)內(nèi)存管理方法和裝置、虛擬機(jī)管理器。
背景技術(shù):
在虛擬化技術(shù)領(lǐng)域中,通常是通過內(nèi)存超配技術(shù)(內(nèi)存超配,指當(dāng)前物理主機(jī)上運(yùn)行的若干個虛擬機(jī)的配置內(nèi)存總和大于物理主機(jī)的物理內(nèi)存)來實(shí)現(xiàn)虛擬機(jī)內(nèi)存資源的按需分配。這樣一來,虛擬機(jī)部分內(nèi)存不能直接訪問,而是由hypervisor(虛擬機(jī)管理器,運(yùn)行于物理主機(jī)上的實(shí)現(xiàn)虛擬化功能的裝置)根據(jù)虛擬機(jī)對內(nèi)存的需求,為虛擬機(jī)分配和回收物理內(nèi)存,以實(shí)現(xiàn)物理內(nèi)存的按需分配。
ballooning(內(nèi)存氣球)技術(shù)是虛擬化技術(shù)領(lǐng)域較流行的一種虛擬機(jī)內(nèi)存超配技術(shù)。然而,傳統(tǒng)的內(nèi)存氣球技術(shù)中,虛擬機(jī)操作系統(tǒng)會認(rèn)為內(nèi)存氣球中的內(nèi)存空間對應(yīng)的這部分物理內(nèi)存是被占用了,就會判定可用內(nèi)存不足而進(jìn)行一些特殊操作,比如會開始使用交換分區(qū),進(jìn)而給系統(tǒng)性能帶來負(fù)面影響。
此外,由于傳統(tǒng)方法中內(nèi)存的回收和歸還都是由hypervisor來控制的,hypervisor要動態(tài)平衡所有的虛擬機(jī)內(nèi)存的回收與歸還,虛擬機(jī)數(shù)量越多,hypervisor的控制策略就越復(fù)雜,因此無法適用于大規(guī)模部署的場景。且這種根據(jù)hypervisor監(jiān)控虛擬機(jī)內(nèi)存使用情況來進(jìn)行內(nèi)存的歸還的情況下,由于監(jiān)控具有滯后性,且內(nèi)存歸還速度有限,很容易造成因虛擬機(jī)操作系統(tǒng)突發(fā)使用較大內(nèi)存,而內(nèi)存歸還不及時,而造成系統(tǒng)因內(nèi)存不足出現(xiàn)卡頓或死機(jī)的情況。
技術(shù)實(shí)現(xiàn)要素:
基于此,有必要針對上述問題,提供一種能夠不因內(nèi)存回收而影響虛擬機(jī)操作系統(tǒng)的運(yùn)行性能,能夠及時歸還內(nèi)存、且適用性高的虛擬機(jī)內(nèi)存管理方法和裝置、虛擬機(jī)管理器。
一種虛擬機(jī)內(nèi)存管理方法,該方法應(yīng)用于虛擬機(jī)管理器中,該方法包括:
發(fā)送內(nèi)存氣球膨脹指令至虛擬機(jī),所述內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量,使所述虛擬機(jī)根據(jù)所述需回收的內(nèi)存量增大所述內(nèi)存氣球的體積以占據(jù)虛擬內(nèi)存頁;
接收虛擬機(jī)發(fā)送的內(nèi)存占據(jù)通知,獲取內(nèi)存占據(jù)通知中攜帶的內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識,回收占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁;
發(fā)送內(nèi)存氣球收縮指令至虛擬機(jī),使虛擬機(jī)將增大后的內(nèi)存氣球的體積縮小為零,以使虛擬機(jī)中被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞;
接收虛擬機(jī)發(fā)送的對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,根據(jù)所述訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。
在其中一個實(shí)施例中,回收占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁的步驟,包括:
將占據(jù)的虛擬內(nèi)存頁標(biāo)識通過位圖進(jìn)行對應(yīng)標(biāo)記;
接收虛擬機(jī)發(fā)送的內(nèi)存占據(jù)停止通知,將標(biāo)記的虛擬內(nèi)存頁標(biāo)識對應(yīng)的地址連續(xù)的第一物理內(nèi)存頁進(jìn)行一次性回收。
一種虛擬機(jī)內(nèi)存管理方法,該方法應(yīng)用于虛擬機(jī)中,該方法包括:
接收虛擬機(jī)管理器發(fā)送的內(nèi)存氣球膨脹指令,內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量,根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球的體積;
發(fā)送內(nèi)存占據(jù)通知至虛擬機(jī)管理器,內(nèi)存占據(jù)通知中攜帶內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識,使虛擬機(jī)管理器根據(jù)占據(jù)的虛擬內(nèi)存頁標(biāo)識回收對應(yīng)的第一物理內(nèi)存頁;
接收虛擬機(jī)管理器發(fā)送的內(nèi)存氣球收縮指令,根據(jù)內(nèi)存氣球收縮指令將內(nèi)存氣球的體積縮小為零,以使被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞;
向所述虛擬機(jī)管理器發(fā)送對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,使虛擬機(jī)管理器根據(jù)所述訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。
在其中一個實(shí)施例中,在根據(jù)內(nèi)存氣球收縮指令將內(nèi)存氣球的體積縮小為零的步驟之前,還包括:
通過虛擬化插件關(guān)閉內(nèi)存頁自動置零機(jī)制。
在其中一個實(shí)施例中,該方法還包括:
在根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球體積時,檢查虛擬機(jī)對應(yīng)的剩余物理內(nèi)存量,當(dāng)剩余物理內(nèi)存量達(dá)到預(yù)設(shè)安全閾值時,則停止增大內(nèi)存氣球體積。
一種虛擬機(jī)管理器,該虛擬機(jī)管理器包括:
指令發(fā)送模塊,用于發(fā)送內(nèi)存氣球膨脹指令至虛擬機(jī),內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量,使虛擬機(jī)根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球的體積以占據(jù)虛擬內(nèi)存頁;
內(nèi)存回收模塊,用于接收虛擬機(jī)發(fā)送的內(nèi)存占據(jù)通知,獲取內(nèi)存占據(jù)通知中攜帶的內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識,回收占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁;
指令發(fā)送模塊還用于發(fā)送內(nèi)存氣球收縮指令至虛擬機(jī),使虛擬機(jī)將增大后的內(nèi)存氣球的體積縮小為零,以使虛擬機(jī)中被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞;
內(nèi)存歸還模塊,用于接收虛擬機(jī)發(fā)送的對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,根據(jù)該訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。
在其中一個實(shí)施例中,內(nèi)存回收模塊還用于將占據(jù)的虛擬內(nèi)存頁標(biāo)識通過位圖進(jìn)行對應(yīng)標(biāo)記;接收虛擬機(jī)發(fā)送的內(nèi)存占據(jù)停止通知,將標(biāo)記的虛擬內(nèi)存頁標(biāo)識對應(yīng)的地址連續(xù)的第一物理內(nèi)存頁進(jìn)行一次性回收。
一種虛擬機(jī)內(nèi)存管理裝置,該裝置包括:
體積增大模塊,用于接收虛擬機(jī)管理器發(fā)送的內(nèi)存氣球膨脹指令,內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量,根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球的體積;
發(fā)送模塊,用于發(fā)送內(nèi)存占據(jù)通知至虛擬機(jī)管理器,內(nèi)存占據(jù)通知中攜帶內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識,使虛擬機(jī)管理器根據(jù)占據(jù)的虛 擬內(nèi)存頁標(biāo)識回收對應(yīng)的第一物理內(nèi)存頁;
體積收縮模塊,用于接收虛擬機(jī)管理器發(fā)送的內(nèi)存氣球收縮指令,根據(jù)內(nèi)存氣球收縮指令將內(nèi)存氣球的體積縮小為零,以使被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞;
發(fā)送模塊還用于向虛擬機(jī)管理器發(fā)送對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,使虛擬機(jī)管理器根據(jù)該訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。
在其中一個實(shí)施例中,該裝置還包括:
自動置零關(guān)閉模塊,用于通過虛擬化插件關(guān)閉內(nèi)存頁自動置零機(jī)制。
在其中一個實(shí)施例中,該裝置還包括:
剩余內(nèi)存檢查模塊,用于在根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球體積時,檢查虛擬機(jī)對應(yīng)的剩余物理內(nèi)存量,當(dāng)剩余物理內(nèi)存量達(dá)到預(yù)設(shè)安全閾值時,則通知體積增大模塊停止增大內(nèi)存氣球體積。
上述虛擬機(jī)內(nèi)存管理方法和裝置、虛擬機(jī)管理器,通過內(nèi)存氣球膨脹指令使內(nèi)存氣球膨脹以占據(jù)虛擬內(nèi)存頁,回收所占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁,通過內(nèi)存氣球收縮指令將增大后的內(nèi)存氣球體積縮小為零,使虛擬機(jī)中被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞,在接收虛擬機(jī)發(fā)送的對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求時,為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。通過建立內(nèi)存空洞的方式,在回收物理內(nèi)存時,虛擬機(jī)感受不到內(nèi)存被占用,從而避免因內(nèi)存回收造成的虛擬機(jī)誤以為內(nèi)存不足而進(jìn)行一些特殊操作,而影響系統(tǒng)性能。此外,在內(nèi)存歸還時,不需要虛擬機(jī)管理器統(tǒng)一對所有虛擬機(jī)的內(nèi)存使用情況進(jìn)行監(jiān)控,實(shí)現(xiàn)了內(nèi)存的自動按需歸還,保證了內(nèi)存的及時歸還,且提高了適用性,能夠適用于大規(guī)模部署場景。
附圖說明
圖1為一個實(shí)施例中虛擬機(jī)內(nèi)存管理方法的流程示意圖;
圖2a至圖2b為一個實(shí)施例中內(nèi)存空洞的示意圖;
圖3為一個實(shí)施例中物理內(nèi)存頁回收方法的流程示意圖;
圖4為另一個實(shí)施例中虛擬機(jī)內(nèi)存管理方法的流程示意圖;
圖5為一個實(shí)施例中虛擬機(jī)管理器的結(jié)構(gòu)示意圖;
圖6為一個實(shí)施例中虛擬機(jī)內(nèi)存管理裝置的結(jié)構(gòu)示意圖;
圖7為另一個實(shí)施例中虛擬機(jī)內(nèi)存管理裝置的結(jié)構(gòu)示意圖;
圖8為又一個實(shí)施例中虛擬機(jī)內(nèi)存管理裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對本發(fā)明進(jìn)行進(jìn)一步的詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用于解釋本發(fā)明,并不用于限定本發(fā)明。
如圖1所示,在一個實(shí)施例中,提供了一種虛擬機(jī)內(nèi)存管理方法,該方法應(yīng)用于虛擬機(jī)管理器中,該虛擬機(jī)管理器可用于監(jiān)控和管理虛擬機(jī)物理內(nèi)存分配情況,該虛擬機(jī)管理器運(yùn)行于運(yùn)行了若干個虛擬機(jī)的物理主機(jī)中,該方法具體包括以下步驟:
步驟102,發(fā)送內(nèi)存氣球膨脹指令至虛擬機(jī),內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量,使虛擬機(jī)根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球的體積以占據(jù)虛擬內(nèi)存頁。
本實(shí)施例中,虛擬機(jī)管理器向虛擬機(jī)發(fā)送內(nèi)存氣球膨脹指令,其中,內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量。虛擬機(jī)接收內(nèi)存氣球膨脹指令后,會調(diào)用預(yù)先安裝于虛擬機(jī)操作系統(tǒng)中的氣球驅(qū)動,氣球驅(qū)動根據(jù)需回收的內(nèi)存量將內(nèi)存氣球增大至對應(yīng)的體積,其中,增大內(nèi)存氣球體積時,內(nèi)存氣球中的內(nèi)存頁即為占據(jù)的虛擬內(nèi)存頁。
步驟104,接收虛擬機(jī)發(fā)送的內(nèi)存占據(jù)通知,獲取內(nèi)存占據(jù)通知中攜帶的內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識,回收占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁。
本實(shí)施例中,虛擬機(jī)中的氣球驅(qū)動在增大內(nèi)存氣球體積占據(jù)虛擬內(nèi)存頁時,會發(fā)送內(nèi)存占據(jù)通知給虛擬機(jī)管理器,內(nèi)存占據(jù)通知中攜帶了內(nèi)存氣球體積增 大時所占據(jù)的虛擬內(nèi)存頁對應(yīng)的虛擬內(nèi)存頁標(biāo)識,以通知虛擬機(jī)管理器所占據(jù)的虛擬內(nèi)存有哪些。
進(jìn)一步,虛擬機(jī)管理器獲取內(nèi)存占據(jù)通知中攜帶的占據(jù)的虛擬內(nèi)存頁標(biāo)識,回收占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁。具體的,虛擬機(jī)管理器會解除占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的虛擬內(nèi)存頁到物理內(nèi)存頁的映射關(guān)系,以回收對應(yīng)的第一物理內(nèi)存頁。
需要說明的是,虛擬機(jī)中的氣球驅(qū)動可以邊增大內(nèi)存氣球體積,邊向虛擬機(jī)管理器發(fā)送內(nèi)存占據(jù)通知,,比如,通過增大內(nèi)存氣球體積占據(jù)預(yù)設(shè)數(shù)量的內(nèi)存頁時,就向虛擬機(jī)管理器發(fā)送內(nèi)存占據(jù)通知,其中,內(nèi)存占據(jù)通知中攜帶所占據(jù)的預(yù)設(shè)數(shù)量的虛擬內(nèi)存頁對應(yīng)的虛擬內(nèi)存頁標(biāo)識,可以理解,預(yù)設(shè)數(shù)量可以為至少一頁。此外,虛擬機(jī)中的氣球驅(qū)動也可以在停止增大內(nèi)存氣球體積后,向虛擬機(jī)管理器發(fā)送一個內(nèi)存占據(jù)通知,該內(nèi)存占據(jù)通知中攜帶內(nèi)存氣球中的占據(jù)的總的虛擬內(nèi)存頁標(biāo)識。本發(fā)明實(shí)施例虛擬機(jī)何時向虛擬機(jī)管理器發(fā)送內(nèi)存占據(jù)通知不作限定。
步驟106,發(fā)送內(nèi)存氣球收縮指令至虛擬機(jī),使虛擬機(jī)將增大后的內(nèi)存氣球的體積縮小為零,以使虛擬機(jī)中被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞。
本實(shí)施例中,虛擬機(jī)管理器在回收對應(yīng)的第一物理內(nèi)存頁之后,進(jìn)一步向虛擬機(jī)發(fā)送內(nèi)存氣球收縮指令。虛擬機(jī)根據(jù)內(nèi)存氣球收縮指令將增大后的內(nèi)存氣球體積縮小為零。這樣一來,在步驟104被回收的第一物理內(nèi)存頁在虛擬機(jī)中對應(yīng)的內(nèi)存空間就形成了內(nèi)存空洞。
結(jié)合圖2a至2b來進(jìn)行解釋說明內(nèi)存空洞的建立方法,如圖2a所示,圖2a中為一個預(yù)先配置了8g內(nèi)存的虛擬機(jī)的內(nèi)存使用情況,m1為7g空閑內(nèi)存,m2為1g已使用的內(nèi)存,虛擬機(jī)的氣球驅(qū)動接收虛擬機(jī)管理器的內(nèi)存氣球膨脹指令,先將內(nèi)存氣球膨脹占據(jù)整個m1的內(nèi)存空間,虛擬機(jī)管理器回收內(nèi)存氣球占據(jù)的7g內(nèi)存,然后向虛擬機(jī)發(fā)送氣球收縮指令,氣球驅(qū)動則將內(nèi)存氣球體積收縮為零,則被回收的第一物理內(nèi)存頁對應(yīng)的之前被內(nèi)存氣球占據(jù)的內(nèi)存空間即形成內(nèi)存空洞,如圖2b所示,圖2b中的m3即為形成的7g內(nèi)存空洞。
內(nèi)存空洞,是一種內(nèi)存空間,該內(nèi)存空間中的內(nèi)存頁在虛擬機(jī)看來是可用的、未被占用的內(nèi)存,但實(shí)際上該內(nèi)存空間中的虛擬機(jī)內(nèi)存頁對應(yīng)的物理內(nèi)存頁已經(jīng)被虛擬機(jī)管理器回收了,故將該種內(nèi)存空間成為內(nèi)存空洞??梢岳斫?,因?yàn)閮?nèi)存氣球收縮為零了,所以虛擬機(jī)感知不到內(nèi)存空洞中的這部分內(nèi)存被占用了,即虛擬機(jī)認(rèn)為內(nèi)存空洞中的這部分內(nèi)存是可用的。然而,內(nèi)存空洞中的虛擬內(nèi)存頁對應(yīng)的物理內(nèi)存頁已經(jīng)被回收了,所以回收的物理內(nèi)存頁是可以被虛擬機(jī)管理器分配給其他有需要的虛擬機(jī)的。
步驟108,接收虛擬機(jī)發(fā)送的對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,根據(jù)該訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。
進(jìn)一步,當(dāng)虛擬機(jī)操作系統(tǒng)中運(yùn)行的程序要訪問內(nèi)存空洞中的虛擬內(nèi)存頁時,虛擬機(jī)會向虛擬機(jī)管理器發(fā)送對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,虛擬機(jī)管理器接收對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求后,會根據(jù)該訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。具體的,虛擬機(jī)管理器會根據(jù)訪問請求確定被請求訪問的虛擬內(nèi)存頁的數(shù)量,進(jìn)一步,從剩余空閑物理內(nèi)存頁中分配出對應(yīng)的第二物理內(nèi)存頁,即為被請求訪問的虛擬內(nèi)存頁建立一個物理內(nèi)存頁的映射關(guān)系,即實(shí)現(xiàn)第二物理內(nèi)存頁的分配。比如,請求訪問的虛擬內(nèi)存頁數(shù)量為2g,則虛擬機(jī)管理器會根據(jù)該訪問請求,從剩余空閑物理內(nèi)存頁中分配出對應(yīng)的第二物理內(nèi)存頁,即對應(yīng)分配2g物理內(nèi)存頁,進(jìn)一步為被請求訪問的虛擬內(nèi)存頁與分配出的第二物理內(nèi)存頁之間建立映射關(guān)系。
本實(shí)施例中,通過向虛擬機(jī)發(fā)送內(nèi)存氣球膨脹指令,實(shí)現(xiàn)對內(nèi)存氣球膨脹時所占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁的回收,通過向虛擬機(jī)發(fā)送內(nèi)存氣球收縮指令,使虛擬機(jī)中被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞,當(dāng)虛擬機(jī)中的程序請求訪問內(nèi)存空洞中的虛擬內(nèi)存頁時,為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。通過建立內(nèi)存空洞的方式,在回收物理內(nèi)存時,虛擬機(jī)感受不到內(nèi)存被占用,從而避免因內(nèi)存回收造成的虛擬機(jī)誤以為內(nèi)存不足而進(jìn)行一些特殊操作,而影響系統(tǒng)性能。此外,在內(nèi)存歸還時,不需要虛擬機(jī)管理器統(tǒng)一對所有虛擬機(jī)的內(nèi)存使用情況進(jìn)行監(jiān)控,實(shí)現(xiàn)了內(nèi)存的自動按需歸還,保證了內(nèi)存的及時歸還,且提高了適用性,能夠適用于大規(guī) 模部署場景。
如圖3所示,在一個實(shí)施例中,回收占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁的步驟(簡稱物理內(nèi)存頁回收的步驟)包括:
步驟302,將占據(jù)的虛擬內(nèi)存頁標(biāo)識通過位圖進(jìn)行對應(yīng)標(biāo)記。
步驟304,接收虛擬機(jī)發(fā)送的內(nèi)存占據(jù)停止通知,將標(biāo)記的虛擬內(nèi)存頁標(biāo)識對應(yīng)的地址連續(xù)的第一物理內(nèi)存頁進(jìn)行一次性回收。
本實(shí)施例中,在獲取虛擬機(jī)發(fā)送的內(nèi)存占據(jù)通知中攜帶的內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識后,進(jìn)一步將占據(jù)的虛擬內(nèi)存頁標(biāo)識通過位圖(bitmap)進(jìn)行對應(yīng)標(biāo)記。
虛擬機(jī)在停止增大氣球體積之后,會發(fā)送內(nèi)存占據(jù)停止通知給虛擬機(jī)管理器,虛擬機(jī)管理器則會根據(jù)虛擬內(nèi)存頁標(biāo)識在位圖上的標(biāo)記,判斷哪些虛擬內(nèi)存頁對應(yīng)的第一物理內(nèi)存頁地址是連續(xù)的,將地址連續(xù)的第一物理內(nèi)存頁進(jìn)行一次性回收。其中,一次性回收是指,虛擬機(jī)管理器只調(diào)用一次api接口(applicationprogramminginterface,應(yīng)用程序編程接口)即實(shí)現(xiàn)將地址連續(xù)的這部分第一物理內(nèi)存頁一起回收。
可以理解,虛擬機(jī)管理器在回收物理內(nèi)存頁時需要調(diào)用api接口進(jìn)行回收,其中,只調(diào)用一次api接口將將地址連續(xù)的這部分第一物理內(nèi)存頁一起回收,相較于傳統(tǒng)方法中獲取一個占用的內(nèi)存頁標(biāo)識就調(diào)用一次api接口進(jìn)行對應(yīng)的物理內(nèi)存頁(即傳統(tǒng)方法是將物理內(nèi)存頁一頁一頁的回收)來說,大大減少了api接口的調(diào)用次數(shù),從而提高了物理內(nèi)存頁的回收效率。
如圖4所示,在一個實(shí)施例中,提供了一種虛擬機(jī)內(nèi)存管理方法,以該方法應(yīng)用于虛擬機(jī)中為例進(jìn)行說明,其中該方法可適用于虛擬機(jī)中各種類型的操作系統(tǒng),該虛擬機(jī)運(yùn)行于物理主機(jī)中,該方法具體包括以下步驟:
步驟402,接收虛擬機(jī)管理器發(fā)送的內(nèi)存氣球膨脹指令,內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量,根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球的體積。
本實(shí)施例中,虛擬機(jī)管理器向虛擬機(jī)發(fā)送內(nèi)存氣球膨脹指令,其中,內(nèi)存 氣球膨脹指令中攜帶需回收的內(nèi)存量。虛擬機(jī)接收內(nèi)存氣球膨脹指令后,會調(diào)用預(yù)先安裝于虛擬機(jī)操作系統(tǒng)中的氣球驅(qū)動,氣球驅(qū)動根據(jù)需回收的內(nèi)存量將內(nèi)存氣球增大至對應(yīng)的體積,其中,增大內(nèi)存氣球體積時,內(nèi)存氣球中的內(nèi)存頁即為占據(jù)的虛擬內(nèi)存頁。
步驟404,發(fā)送內(nèi)存占據(jù)通知至虛擬機(jī)管理器,內(nèi)存占據(jù)通知中攜帶內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識,使虛擬機(jī)管理器根據(jù)占據(jù)的虛擬內(nèi)存頁標(biāo)識回收對應(yīng)的第一物理內(nèi)存頁。
本實(shí)施例中,虛擬機(jī)中的氣球驅(qū)動在增大內(nèi)存氣球體積占據(jù)虛擬內(nèi)存頁時,會發(fā)送內(nèi)存占據(jù)通知給虛擬機(jī)管理器,內(nèi)存占據(jù)通知中攜帶了內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁對應(yīng)的虛擬內(nèi)存頁標(biāo)識,以通知虛擬機(jī)管理器所占據(jù)的內(nèi)存有哪些。
進(jìn)一步,虛擬機(jī)管理器獲取內(nèi)存占據(jù)通知中攜帶的占據(jù)的虛擬內(nèi)存頁標(biāo)識,回收占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的物理內(nèi)存頁。具體的,虛擬機(jī)管理器會解除占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的虛擬內(nèi)存頁到物理內(nèi)存頁的映射關(guān)系,以回收對應(yīng)的物理內(nèi)存頁。
需要說明的是,虛擬機(jī)中的氣球驅(qū)動可以邊增大內(nèi)存氣球體積,邊向虛擬機(jī)管理器發(fā)送內(nèi)存占據(jù)通知,,比如,通過增大內(nèi)存氣球體積占據(jù)預(yù)設(shè)數(shù)量的內(nèi)存頁是,就向虛擬機(jī)管理器發(fā)送內(nèi)存占據(jù)通知,其中,內(nèi)存占據(jù)通知中攜帶所占據(jù)的預(yù)設(shè)數(shù)量的虛擬內(nèi)存頁對應(yīng)的虛擬內(nèi)存頁標(biāo)識,可以理解,預(yù)設(shè)數(shù)量可以為至少一頁。此外,虛擬機(jī)中的氣球驅(qū)動也可以在停止增大內(nèi)存氣球體積后,向虛擬機(jī)管理器發(fā)送一個內(nèi)存占據(jù)通知,該內(nèi)存占據(jù)通知中攜帶內(nèi)存氣球中的占據(jù)的總的虛擬內(nèi)存頁標(biāo)識。本發(fā)明實(shí)施例虛擬機(jī)何時向虛擬機(jī)管理器發(fā)送內(nèi)存占據(jù)通知不作限定。
步驟406,接收虛擬機(jī)管理器發(fā)送的內(nèi)存氣球收縮指令,根據(jù)內(nèi)存氣球收縮指令將內(nèi)存氣球體積縮小為零,以使被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞。
本實(shí)施例中,虛擬機(jī)管理器在回收對應(yīng)的物理內(nèi)存頁之后,進(jìn)一步向虛擬機(jī)發(fā)送內(nèi)存氣球收縮指令。虛擬機(jī)根據(jù)內(nèi)存氣球收縮指令將增大后的內(nèi)存氣球 體積縮小為零。這樣一來,在步驟104被回收的物理內(nèi)存頁在虛擬機(jī)中對應(yīng)的內(nèi)存空間就形成了內(nèi)存空洞。
其中,內(nèi)存空洞,是一種內(nèi)存空間,該內(nèi)存空間中的內(nèi)存頁在虛擬機(jī)看來是可用的、未被占用的內(nèi)存,但實(shí)際上該內(nèi)存空間中的虛擬機(jī)內(nèi)存頁對應(yīng)的物理內(nèi)存頁已經(jīng)被虛擬機(jī)管理器回收了,故將該種內(nèi)存空間成為內(nèi)存空洞??梢岳斫?,因?yàn)閮?nèi)存氣球收縮為零了,所以虛擬機(jī)感知不到內(nèi)存空洞中的這部分內(nèi)存被占用了,即虛擬機(jī)認(rèn)為內(nèi)存空洞中的這部分內(nèi)存是可用的。然而,內(nèi)存空洞中的虛擬內(nèi)存頁對應(yīng)的物理內(nèi)存頁已經(jīng)被回收了,所以回收的物理內(nèi)存頁是可以被虛擬機(jī)管理器分配給其他有需要的虛擬機(jī)的。
步驟408,向虛擬機(jī)管理器發(fā)送對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,使虛擬機(jī)管理器根據(jù)該訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。
進(jìn)一步,當(dāng)虛擬機(jī)操作系統(tǒng)中運(yùn)行的程序要訪問內(nèi)存空洞中的虛擬內(nèi)存頁時,虛擬機(jī)會向虛擬機(jī)管理器發(fā)送對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,虛擬機(jī)管理器接收對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求后,會根據(jù)該訪問請求為被請求訪問的虛擬內(nèi)存頁第二分配物理內(nèi)存頁。具體的,虛擬機(jī)管理器會根據(jù)訪問請求確定被請求訪問的虛擬內(nèi)存頁的數(shù)量,進(jìn)一步,從剩余空閑物理內(nèi)存頁中分配出對應(yīng)的第二物理內(nèi)存頁,即為被請求訪問的虛擬內(nèi)存頁建立一個物理內(nèi)存頁的映射關(guān)系,即實(shí)現(xiàn)第二物理內(nèi)存頁的分配。
在一個實(shí)施例中,在根據(jù)內(nèi)存氣球收縮指令將述內(nèi)存氣球的體積縮小為零的步驟之前,還包括通過虛擬化插件關(guān)閉內(nèi)存頁自動置零機(jī)制的步驟。
本實(shí)施例中,在根據(jù)內(nèi)存氣球收縮指令將述內(nèi)存氣球的體積縮小為零之前(即相當(dāng)于建立內(nèi)存空洞的步驟之前),對于一些存在內(nèi)存頁自動置零機(jī)制的操作系統(tǒng),需要將內(nèi)存頁自動置零機(jī)制關(guān)閉。具體的,虛擬機(jī)會通過預(yù)先安裝于虛擬機(jī)中的虛擬化插件來關(guān)閉內(nèi)存頁自動置零機(jī)制。以windows系統(tǒng)為例,可以通過虛擬化插件將windows系統(tǒng)中的零頁線程掛起,實(shí)現(xiàn)內(nèi)存頁自動置零機(jī)制的關(guān)閉。可以理解,對于不存在內(nèi)存頁自動置零機(jī)制的操作系統(tǒng),則可以省 略該步驟。
可以理解,因?yàn)樵趦?nèi)存氣球收縮為零形成內(nèi)存空洞時,內(nèi)存空洞中的內(nèi)存對虛擬機(jī)來說是可用的,所以虛擬機(jī)會認(rèn)為是有內(nèi)存釋放的,則虛擬機(jī)會執(zhí)行內(nèi)存頁自動置零機(jī)制,進(jìn)行自動置零操作,而自動置零操作會導(dǎo)致已回收的物理內(nèi)存頁又被重新映射,導(dǎo)致之前回收的物理內(nèi)存頁因自動置零操作又被歸還了。因此,需要在建立內(nèi)存空洞之前,將內(nèi)存頁自動置零機(jī)制關(guān)閉。
進(jìn)一步,可以在啟動虛擬機(jī)操作系統(tǒng)時,將虛擬機(jī)操作系統(tǒng)中的內(nèi)存頁自動置零機(jī)制關(guān)閉,也可以在建立內(nèi)存空洞之前的任何步驟來執(zhí)行關(guān)閉該內(nèi)存頁自動置零機(jī)制的步驟。本發(fā)明實(shí)施例對此不做限定,只要滿足在建立內(nèi)存空洞之前關(guān)閉內(nèi)存頁自動置零機(jī)制,使該內(nèi)存頁自動置零機(jī)制不干擾、破壞內(nèi)存空洞即可。
在一個實(shí)施例中,該虛擬機(jī)內(nèi)存管理方法還包括以下步驟:在根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球體積時,檢查虛擬機(jī)對應(yīng)的剩余物理內(nèi)存量,當(dāng)剩余物理內(nèi)存量達(dá)到預(yù)設(shè)安全閾值時,則停止增大內(nèi)存氣球體積。
本實(shí)施例中,在虛擬機(jī)的氣球驅(qū)動中增加了安全檢查機(jī)制,并預(yù)先設(shè)置了安全閾值,當(dāng)氣球驅(qū)動根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球體積時,氣球驅(qū)動會通過安全檢查機(jī)制檢查剩余的虛擬機(jī)內(nèi)存頁的數(shù)量,即檢查剩余虛擬內(nèi)存量,根據(jù)虛擬內(nèi)存頁與物理內(nèi)存頁的映射關(guān)系,確定剩余虛擬內(nèi)存量對應(yīng)的剩余物理內(nèi)存量,即確定該虛擬機(jī)對應(yīng)的剩余物理內(nèi)存量。當(dāng)檢查到虛擬機(jī)對應(yīng)的剩余物理內(nèi)存量達(dá)到預(yù)設(shè)安全閾值時,會停止增大內(nèi)存氣球體積。
進(jìn)一步,虛擬機(jī)會通過氣球驅(qū)動向虛擬機(jī)管理器發(fā)送內(nèi)存占據(jù)停止的通知。
可以理解,該安全閾值可以根據(jù)實(shí)際情況進(jìn)行不同設(shè)定。
本實(shí)施例中,通過在氣球驅(qū)動中增加安全檢查機(jī)制,在增大內(nèi)存氣球體積時,檢查剩余的虛擬機(jī)內(nèi)存頁的數(shù)量對應(yīng)的剩余物理內(nèi)存量是否超過預(yù)設(shè)安全閾值,當(dāng)剩余物理內(nèi)存量達(dá)到預(yù)設(shè)安全閾值時,則停止增大內(nèi)存氣球體積。避免了根據(jù)虛擬機(jī)管理器請求收回的內(nèi)存量過大而導(dǎo)致虛擬機(jī)操作系統(tǒng)的內(nèi)存耗盡,避免因內(nèi)存回收而導(dǎo)致操作系統(tǒng)卡頓或死機(jī)的情況發(fā)生,實(shí)現(xiàn)在內(nèi)存回收 時,不影響操作系統(tǒng)的正常工作。
如圖5所示,在一個實(shí)施例中,提供了一種虛擬機(jī)管理器,該虛擬機(jī)管理器包括:
指令發(fā)送模塊502,用于發(fā)送內(nèi)存氣球膨脹指令至虛擬機(jī),內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量,使虛擬機(jī)根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球的體積以占據(jù)虛擬內(nèi)存頁。
內(nèi)存回收模塊504,用于接收虛擬機(jī)發(fā)送的內(nèi)存占據(jù)通知,獲取內(nèi)存占據(jù)通知中攜帶的內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識,回收占據(jù)的虛擬內(nèi)存頁標(biāo)識對應(yīng)的第一物理內(nèi)存頁。
指令發(fā)送模塊502還用于發(fā)送內(nèi)存氣球收縮指令至虛擬機(jī),使虛擬機(jī)將增大后的內(nèi)存氣球的體積縮小為零,以使虛擬機(jī)中被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞。
內(nèi)存歸還模塊506,用于接收虛擬機(jī)發(fā)送的對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,根據(jù)該訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。
在一個實(shí)施例中,內(nèi)存回收模塊504還用于將占據(jù)的虛擬內(nèi)存頁標(biāo)識通過位圖進(jìn)行對應(yīng)標(biāo)記;接收虛擬機(jī)發(fā)送的內(nèi)存占據(jù)停止通知,將標(biāo)記的虛擬內(nèi)存頁標(biāo)識對應(yīng)的地址連續(xù)的第一物理內(nèi)存頁進(jìn)行一次性回收。
如圖6所示,在一個實(shí)施例中,提供了一種虛擬機(jī)內(nèi)存管理裝置,該裝置包括:
體積增大模塊602,用于接收虛擬機(jī)管理器發(fā)送的內(nèi)存氣球膨脹指令,內(nèi)存氣球膨脹指令中攜帶需回收的內(nèi)存量,根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球的體積。
發(fā)送模塊604,用于發(fā)送內(nèi)存占據(jù)通知至虛擬機(jī)管理器,內(nèi)存占據(jù)通知中攜帶內(nèi)存氣球體積增大時所占據(jù)的虛擬內(nèi)存頁標(biāo)識,使虛擬機(jī)管理器根據(jù)占據(jù)的虛擬內(nèi)存頁標(biāo)識回收對應(yīng)的第一物理內(nèi)存頁。
體積收縮模塊606,用于接收虛擬機(jī)管理器發(fā)送的內(nèi)存氣球收縮指令,根據(jù) 內(nèi)存氣球收縮指令將內(nèi)存氣球的體積縮小為零,以使被回收的第一物理內(nèi)存頁對應(yīng)的內(nèi)存空間形成內(nèi)存空洞。
發(fā)送模塊604還用于向虛擬機(jī)管理器發(fā)送對內(nèi)存空洞中的虛擬內(nèi)存頁的訪問請求,使虛擬機(jī)管理器根據(jù)該訪問請求為被請求訪問的虛擬內(nèi)存頁分配第二物理內(nèi)存頁。
如圖7所示,在一個實(shí)施例中,該裝置還包括:
自動置零關(guān)閉模塊605,用于通過虛擬化插件關(guān)閉內(nèi)存頁自動置零機(jī)制。
如圖8所示,在一個實(shí)施例中,該裝置還包括:
剩余內(nèi)存檢查模塊603,用于在根據(jù)需回收的內(nèi)存量增大內(nèi)存氣球體積時,檢查虛擬機(jī)對應(yīng)的剩余物理內(nèi)存量,當(dāng)剩余物理內(nèi)存量達(dá)到預(yù)設(shè)安全閾值時,則通知體積增大模塊602停止增大內(nèi)存氣球體積。
以上所述實(shí)施例的各技術(shù)特征可以進(jìn)行任意的組合,為使描述簡潔,未對上述實(shí)施例中的各個技術(shù)特征所有可能的組合都進(jìn)行描述,然而,只要這些技術(shù)特征的組合不存在矛盾,都應(yīng)當(dāng)認(rèn)為是本說明書記載的范圍。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。