本發(fā)明涉及通信領(lǐng)域,特別涉及一種報文發(fā)送方法及物理機。
背景技術(shù):
目前在虛擬化環(huán)境下,運行在宿主機(host)中的虛擬機(virtualmachine,vm)并不能直接訪問該host中的硬件設(shè)備,而必須借助于host來實現(xiàn)數(shù)據(jù)的傳遞。
例如,host可以為vm提供一條用于連通硬件設(shè)備的數(shù)據(jù)通路,即i/o(輸入/輸出)通道,i/o通道一般包括host及vm中的若干設(shè)備,例如可以包括vm中的前端設(shè)備(frontdevice)、host中的后端設(shè)備(backdevice)、連接在前端設(shè)備和后端設(shè)備之間的數(shù)據(jù)處理模塊(dataprocessmodules)、host中的橋(bridge)和host中的本地設(shè)備(nativedevice)。前端設(shè)備是host為vm呈現(xiàn)的設(shè)備,對于vm來說是可見的,在vm中可以對前端設(shè)備進行配置,后端設(shè)備是在host中呈現(xiàn)的設(shè)備,與vm中的前端設(shè)備一一對應(yīng),數(shù)據(jù)處理模塊用于連接前端設(shè)備和后端設(shè)備,主要可以完成相應(yīng)的數(shù)據(jù)處理業(yè)務(wù),例如數(shù)據(jù)拷貝或數(shù)據(jù)過濾等,橋用于連接本地設(shè)備和后端設(shè)備,其中,前端設(shè)備、數(shù)據(jù)處理模塊、后端設(shè)備和橋均可以是軟件模塊,本地設(shè)備是host中的真正的硬件設(shè)備。例如,本地設(shè)備可以向運行在該host中的vm發(fā)送報文,該報文依次經(jīng)過橋、后端設(shè)備、數(shù)據(jù)處理模塊和前端設(shè)備,再到達vm,同樣vm也可以按照相反的路徑向本地設(shè)備發(fā)送報文,這樣就實現(xiàn)了vm對host的硬件設(shè)備的訪問。
在網(wǎng)絡(luò)虛擬化場景下,本地設(shè)備和后端設(shè)備之間在傳輸報文時,一般用規(guī)定的數(shù)據(jù)結(jié)構(gòu)體來進行傳輸,即,可以將報文的內(nèi)容存儲在內(nèi)存里,將存儲了 報文的內(nèi)存空間的地址封裝在數(shù)據(jù)結(jié)構(gòu)體中進行傳輸,接收設(shè)備在接收數(shù)據(jù)結(jié)構(gòu)體后,可以根據(jù)數(shù)據(jù)結(jié)構(gòu)體中封裝的地址獲取報文的內(nèi)容。例如目前一般比較通用的數(shù)據(jù)結(jié)構(gòu)體為skb結(jié)構(gòu)體。例如后端設(shè)備要向vm發(fā)送報文,則后端設(shè)備可以從本地的內(nèi)存中申請內(nèi)存空間用于存儲報文的內(nèi)容,skb結(jié)構(gòu)中包括用于存儲報文的元數(shù)據(jù)的地址的字段以及用于存儲報文的內(nèi)容的地址的字段,這兩個字段所指示的內(nèi)存空間可以連續(xù)也可以不連續(xù),所以后端設(shè)備申請的內(nèi)存空間可能就是不連續(xù)的。那么前端設(shè)備在接收后端設(shè)備發(fā)送的skb結(jié)構(gòu)體后,可能就需要通過訪問不連續(xù)的內(nèi)存空間來獲取報文的全部內(nèi)容,即獲取報文的元數(shù)據(jù)及報文的內(nèi)容,如果不連續(xù)的內(nèi)存空間的跨度較大,就會增加訪問時的難度,使得訪問內(nèi)存時的操作復(fù)雜度較高,而訪問效率較低。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供一種報文發(fā)送方法及物理機,用于提高在因獲取報文的內(nèi)容而訪問內(nèi)存時的訪問效率。
第一方面,提供一種報文發(fā)送方法,該方法可以包括:物理機中的發(fā)送設(shè)備在需發(fā)送報文時,從資源池中獲取連續(xù)m頁內(nèi)存頁;其中,所述m頁內(nèi)存頁分別用于存儲m個數(shù)據(jù)結(jié)構(gòu)體所指示的數(shù)據(jù),每個數(shù)據(jù)結(jié)構(gòu)體所指示的內(nèi)存空間為一頁,所述資源池包括所述發(fā)送設(shè)備預(yù)先申請的連續(xù)n頁內(nèi)存頁,所述n頁內(nèi)存頁用于存儲n個數(shù)據(jù)結(jié)構(gòu)體所指示的數(shù)據(jù),所述m、n均為正整數(shù),且m小于等于n;所述發(fā)送設(shè)備將所述報文包括的m個數(shù)據(jù)結(jié)構(gòu)體依次所指示的數(shù)據(jù)分別存儲到所述m頁內(nèi)存頁中;所述發(fā)送設(shè)備將所述m頁內(nèi)存頁依次對應(yīng)的內(nèi)存地址分別封裝到所述m個數(shù)據(jù)結(jié)構(gòu)體中,并將所述m個數(shù)據(jù)結(jié)構(gòu)體發(fā)送給所述物理機中的接收設(shè)備;所述接收設(shè)備接收所述m個數(shù)據(jù)結(jié)構(gòu)體,并依次從所述m個數(shù)據(jù)結(jié)構(gòu)體分別封裝的內(nèi)存地址對應(yīng)的內(nèi)存中獲取數(shù)據(jù),以及將依次獲取的數(shù)據(jù)組成所述報文。
本發(fā)明實施例中,資源池中可以預(yù)留事先申請好的連續(xù)的內(nèi)存頁,這樣發(fā)送設(shè)備在需發(fā)送報文時,可以直接從資源池中獲取已申請的內(nèi)存頁來存儲報文 的內(nèi)容,減少了發(fā)送設(shè)備在發(fā)送報文時所需的準備工作,節(jié)省報文發(fā)送的時間。且m頁內(nèi)存頁是連續(xù)的,那么接收設(shè)備在接收發(fā)送設(shè)備發(fā)送的數(shù)據(jù)結(jié)構(gòu)體后,通過訪問數(shù)據(jù)結(jié)構(gòu)體所指示的連續(xù)的內(nèi)存頁就可以獲取報文的全部內(nèi)容,訪問較為簡單快捷,降低了訪問時的難度,從而提高了訪問效率。
結(jié)合第一方面,在第一方面的第一種可能的實現(xiàn)方式中,若m=1,則所述發(fā)送設(shè)備可以獲取所述資源池的首地址所指向的內(nèi)存頁;若m>1,則發(fā)送設(shè)備可以獲取所述資源池的首地址所指向的內(nèi)存頁,并從所述首地址所指向的內(nèi)存頁開始,依次獲取連續(xù)m-1個內(nèi)存頁。
發(fā)送設(shè)備可以每次從資源池的首地址開始獲取內(nèi)存頁,因為發(fā)送設(shè)備一般來說可以存儲資源池的首地址,這樣在獲取內(nèi)存頁時無需再查找地址,提高操作效率。
結(jié)合第一方面或第一方面的第一種可能的實現(xiàn)方式,在第一方面的第二種可能的實現(xiàn)方式中,在依次從所述m個數(shù)據(jù)結(jié)構(gòu)體分別封裝的內(nèi)存地址對應(yīng)的內(nèi)存中獲取數(shù)據(jù)之后,所述接收設(shè)備可以指示所述發(fā)送設(shè)備釋放所述m個數(shù)據(jù)結(jié)構(gòu)體,所述發(fā)送設(shè)備可以釋放所述m個數(shù)據(jù)結(jié)構(gòu)體,并清空所述m個數(shù)據(jù)結(jié)構(gòu)體所指示的所述m頁內(nèi)存頁中存儲的數(shù)據(jù)。
在數(shù)據(jù)結(jié)構(gòu)體使用完畢后,可以將其釋放,這樣在下一次可以繼續(xù)使用這些數(shù)據(jù)結(jié)構(gòu)體,且數(shù)據(jù)結(jié)構(gòu)體所指示的內(nèi)存頁也是固定的,在一次使用完畢后可以清空,以便下次繼續(xù)使用。這也就提高了數(shù)據(jù)結(jié)構(gòu)體和內(nèi)存的復(fù)用率。
結(jié)合第一方面的第二種可能的實現(xiàn)方式,在第一方面的第三種可能的實現(xiàn)方式中,發(fā)送設(shè)備可以從所述資源池的首地址所指向的內(nèi)存頁開始,依次清空所述m頁內(nèi)存頁中存儲的數(shù)據(jù)。
發(fā)送設(shè)備可能會存儲資源池的首地址,則發(fā)送設(shè)備在清空時可以從首地址指示的內(nèi)存頁開始清空,這樣可以省去了查找地址的步驟,提高操作效率。
結(jié)合第一方面或第一方面的第一種可能的實現(xiàn)方式至第三種可能的實現(xiàn)方式中的任一種可能的實現(xiàn)方式,在第一方面的第四種可能的實現(xiàn)方式中,若 所述資源池中已被所述發(fā)送設(shè)備獲取的內(nèi)存頁的數(shù)量大于等于第一門限值,則所述發(fā)送設(shè)備再申請連續(xù)k個內(nèi)存頁放入所述資源池,k為正整數(shù);或,若所述資源池中已被所述發(fā)送設(shè)備獲取的內(nèi)存頁的數(shù)量小于等于第二門限值,則所述發(fā)送設(shè)備從所述資源池中釋放連續(xù)p個內(nèi)存頁,p為正整數(shù);其中,所述第一門限值大于所述第二門限值。
在初始申請資源池時,為了不占用過多的內(nèi)存,申請的資源池可以不太大,在后期使用過程中,如果發(fā)送設(shè)備需要申請的內(nèi)存頁較多,則可以繼續(xù)申請新的內(nèi)存頁放入資源池,如果發(fā)送設(shè)備需申請的內(nèi)存頁較少,則可以從資源池中釋放一些內(nèi)存頁,這樣可以根據(jù)需要來動態(tài)調(diào)整資源池的大小,盡量使得內(nèi)存能夠得到較為合理高效的利用。而且在申請新的內(nèi)存頁放入資源池時,可以申請連續(xù)的內(nèi)存頁,且這些連續(xù)的內(nèi)存頁與資源池中已有的內(nèi)存頁也可以連續(xù),在釋放資源池中的內(nèi)存頁時,例如可以從資源池的尾部開始釋放連續(xù)的內(nèi)存頁,這樣可以盡量保證資源池中的內(nèi)存頁是連續(xù)的。
第二方面,提供一種物理機,包括發(fā)送設(shè)備和接收設(shè)備。其中,發(fā)送設(shè)備可以用于在需發(fā)送報文時,從資源池中獲取連續(xù)m頁內(nèi)存頁,將所述報文包括的m個數(shù)據(jù)結(jié)構(gòu)體依次所指示的數(shù)據(jù)分別存儲到所述m頁內(nèi)存頁中,將所述m頁內(nèi)存頁依次對應(yīng)的內(nèi)存地址分別封裝到所述m個數(shù)據(jù)結(jié)構(gòu)體中,并將所述m個數(shù)據(jù)結(jié)構(gòu)體發(fā)送給所述物理機中的接收設(shè)備;其中,所述m頁內(nèi)存頁分別用于存儲m個數(shù)據(jù)結(jié)構(gòu)體所指示的數(shù)據(jù),每個數(shù)據(jù)結(jié)構(gòu)體所指示的內(nèi)存空間為一頁,所述資源池包括所述發(fā)送設(shè)備預(yù)先申請的連續(xù)n頁內(nèi)存頁,所述n頁內(nèi)存頁用于存儲n個數(shù)據(jù)結(jié)構(gòu)體所指示的數(shù)據(jù),所述m、n均為正整數(shù),且m小于等于n。接收設(shè)備可以用于接收所述m個數(shù)據(jù)結(jié)構(gòu)體,并依次從所述m個數(shù)據(jù)結(jié)構(gòu)體分別封裝的內(nèi)存地址對應(yīng)的內(nèi)存中獲取數(shù)據(jù),以及將依次獲取的數(shù)據(jù)組成所述報文。
結(jié)合第二方面,在第二方面的第一種可能的實現(xiàn)方式中,若m=1,發(fā)送設(shè)備可以獲取所述資源池的首地址所指向的內(nèi)存頁;若m>1,發(fā)送設(shè)備可以獲取 所述資源池的首地址所指向的內(nèi)存頁,并從所述首地址所指向的內(nèi)存頁開始,依次獲取連續(xù)m-1個內(nèi)存頁。
結(jié)合第二方面或第二方面的第一種可能的實現(xiàn)方式,在第二方面的第二種可能的實現(xiàn)方式中,接收設(shè)備,還用于在依次從所述m個數(shù)據(jù)結(jié)構(gòu)體分別封裝的內(nèi)存地址對應(yīng)的內(nèi)存中獲取數(shù)據(jù)之后,指示所述發(fā)送設(shè)備釋放所述m個數(shù)據(jù)結(jié)構(gòu)體;發(fā)送設(shè)備,還用于釋放所述m個數(shù)據(jù)結(jié)構(gòu)體,并清空所述m個數(shù)據(jù)結(jié)構(gòu)體所指示的所述m頁內(nèi)存頁中存儲的數(shù)據(jù)。
結(jié)合第二方面的第二種可能的實現(xiàn)方式,在第二方面的第三種可能的實現(xiàn)方式中,發(fā)送設(shè)備可以從所述資源池的首地址所指向的內(nèi)存頁開始,依次清空所述m頁內(nèi)存頁中存儲的數(shù)據(jù)。
結(jié)合第二方面或第二方面的第一種可能的實現(xiàn)方式至第三種可能的實現(xiàn)方式中的任一種可能的實現(xiàn)方式,在第二方面的第四種可能的實現(xiàn)方式中,發(fā)送設(shè)備還可以用于:若所述資源池中已被所述發(fā)送設(shè)備獲取的內(nèi)存頁的數(shù)量大于等于第一門限值,則再申請連續(xù)k個內(nèi)存頁放入所述資源池,k為正整數(shù);或,若所述資源池已被所述發(fā)送設(shè)備獲取的內(nèi)存頁的數(shù)量小于等于第二門限值,則從所述資源池中釋放連續(xù)p個內(nèi)存頁,p為正整數(shù)。其中,所述第一門限值大于所述第二門限值。
附圖說明
為了更清楚地說明本發(fā)明實施例的技術(shù)方案,下面將對本發(fā)明實施例中所需要使用的附圖作簡單地介紹,顯而易見地,下面所介紹的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實施例提供的宿主機的內(nèi)部結(jié)構(gòu)示意圖;
圖2為skb結(jié)構(gòu)示意圖;
圖3為本發(fā)明實施例提供的pkt結(jié)構(gòu)示意圖;
圖4為本發(fā)明實施例提供的報文發(fā)送方法的一種可能的流程圖;
圖5為本發(fā)明實施例提供的物理機的一種可能的結(jié)構(gòu)框圖。
具體實施方式
為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明實施例保護的范圍。
以下,對本發(fā)明實施例中的部分用語進行解釋說明,以便于本領(lǐng)域技術(shù)人員理解。
1)物理機,可以運行vm,例如物理機可以包括服務(wù)器(server)和終端設(shè)備,終端設(shè)備是指向用戶提供語音和/或數(shù)據(jù)連通性的設(shè)備,例如可以包括具有無線連接功能的手持式設(shè)備、或連接到無線調(diào)制解調(diào)器的處理設(shè)備。該終端設(shè)備可以經(jīng)無線接入網(wǎng)(radioaccessnetwork,ran)與核心網(wǎng)進行通信,與ran交換語音和/或數(shù)據(jù)。該終端設(shè)備可以包括用戶設(shè)備(userequipment,ue)、無線終端設(shè)備、移動終端設(shè)備、訂戶單元(subscriberunit)、訂戶站(subscriberstation),移動站(mobilestation)、移動臺(mobile)、遠程站(remotestation)、接入點(accesspoint,ap)、遠程終端設(shè)備(remoteterminal)、接入終端設(shè)備(accessterminal)、用戶終端設(shè)備(userterminal)、用戶代理(useragent)、或用戶裝備(userdevice)等。例如,可以包括移動電話(或稱為“蜂窩”電話),具有移動終端設(shè)備的計算機,便攜式、袖珍式、手持式、計算機內(nèi)置的或者車載的移動裝置。例如,個人通信業(yè)務(wù)(personalcommunicationservice,pcs)電話、無繩電話、會話發(fā)起協(xié)議(sip)話機、無線本地環(huán)路(wirelesslocalloop,wll)站、個人數(shù)字助理(personaldigitalassistant,pda)等設(shè)備。
2)本發(fā)明實施例中,“多個”是指兩個或兩個以上?!昂?或”,描述關(guān)聯(lián)對象的關(guān)聯(lián)關(guān)系,表示可以存在三種關(guān)系,例如,a和/或b,可以表示:單獨存 在a,同時存在a和b,單獨存在b這三種情況。另外,字符“/”,如無特殊說明,一般表示前后關(guān)聯(lián)對象是一種“或”的關(guān)系。
請參見圖1,為物理機的一種可能的內(nèi)部結(jié)構(gòu),下面先對圖1中涉及到的功能模塊或設(shè)備、以及一些概念進行介紹。
虛擬機101,指通過軟件模擬的具有完整硬件系統(tǒng)功能的、運行在一個完全隔離的環(huán)境中的完整的計算機系統(tǒng)。
host102,是物理存在的計算機,即物理機,一個host102上可以運行多個vm101,host102上運行的操作系統(tǒng)可以為vm101對host102中的硬件設(shè)備的操作提供接口和i/o通道。
前端設(shè)備103,是vm101中能夠看到的設(shè)備,實際上是host102為vm101模擬的設(shè)備。
后端設(shè)備104,是host102上運行的操作系統(tǒng)中的與前端設(shè)備103相對應(yīng)的模擬設(shè)備。本發(fā)明實施例里的后端設(shè)備104,可以是指vm101的虛擬網(wǎng)卡的驅(qū)動。
本發(fā)明實施例里的本地設(shè)備105,可以是host102中的物理網(wǎng)卡的驅(qū)動。
橋106,用于連接本地設(shè)備105和后端設(shè)備104??商鎿Q的,如果本地設(shè)備105與后端設(shè)備104能夠直接通信,則橋106也可以取消。
數(shù)據(jù)處理模塊107,可以完成前端設(shè)備103與后端設(shè)備104之間的數(shù)據(jù)傳遞,一般可以包括與前端設(shè)備103和后端設(shè)備104的接口和工作線程等部分。
可選的,本發(fā)明實施例中,圖1中的本地設(shè)備105可以作為發(fā)送設(shè)備,圖1中的后端設(shè)備104可以作為接收設(shè)備,或者,圖1中的本地設(shè)備105可以作為接收設(shè)備,圖1中的后端設(shè)備104可以作為發(fā)送設(shè)備。
例如,vm101要向物理網(wǎng)卡發(fā)送數(shù)據(jù)時,vm101可以先將數(shù)據(jù)發(fā)送給vm101的虛擬網(wǎng)卡,vm101的虛擬網(wǎng)卡將數(shù)據(jù)發(fā)送給虛擬網(wǎng)卡的驅(qū)動,虛擬網(wǎng)卡的驅(qū)動將數(shù)據(jù)存儲到內(nèi)存中,然后將用于指示數(shù)據(jù)在內(nèi)存中的地址的數(shù)據(jù)結(jié)構(gòu)體發(fā)送給橋106,橋106將數(shù)據(jù)結(jié)構(gòu)體發(fā)送給host102中的物理網(wǎng)卡的 驅(qū)動,物理網(wǎng)卡的驅(qū)動根據(jù)數(shù)據(jù)結(jié)構(gòu)體指示的地址從內(nèi)存中獲取數(shù)據(jù),將數(shù)據(jù)發(fā)送給物理網(wǎng)卡,物理網(wǎng)卡接收該數(shù)據(jù),例如可以繼續(xù)將該數(shù)據(jù)發(fā)送給其他設(shè)備,例如其他host。例如,物理網(wǎng)卡向vm101發(fā)送數(shù)據(jù),則物理網(wǎng)卡將數(shù)據(jù)發(fā)送給物理網(wǎng)卡的驅(qū)動,物理網(wǎng)卡的驅(qū)動將數(shù)據(jù)存儲到內(nèi)存中,然后將用于指示數(shù)據(jù)在內(nèi)存中的地址的數(shù)據(jù)結(jié)構(gòu)體發(fā)送給橋106,橋106將數(shù)據(jù)結(jié)構(gòu)體發(fā)送給vm101的虛擬網(wǎng)卡的驅(qū)動,虛擬網(wǎng)卡的驅(qū)動根據(jù)數(shù)據(jù)結(jié)構(gòu)體指示的地址從內(nèi)存中獲取數(shù)據(jù),將數(shù)據(jù)發(fā)送給虛擬網(wǎng)卡,虛擬網(wǎng)卡再將數(shù)據(jù)發(fā)送給vm101,例如發(fā)送給vm101的虛擬處理器等。
元數(shù)據(jù)(metadata),是報文管理數(shù)據(jù),例如可以包括媒體訪問控制(mediaaccesscontrol,mac)頭所在位置、網(wǎng)際協(xié)議(internetprotocol,ip)頭所在位置、虛擬局域網(wǎng)(virtuallocalareanetwork,vlan)標識(identity,id)等信息。
目前,在本地設(shè)備105和后端設(shè)備104之間傳輸報文時,所用的數(shù)據(jù)結(jié)構(gòu)體為報文套接字數(shù)據(jù)結(jié)構(gòu)(skb)結(jié)構(gòu)體,是網(wǎng)絡(luò)虛擬化場景下用于傳輸報文的數(shù)據(jù)結(jié)構(gòu)體,用于管理報文,包括定義報文的數(shù)據(jù)所在的內(nèi)存位置,以及定義對應(yīng)的metadata所在的內(nèi)存位置等。下面介紹一下skb結(jié)構(gòu)體。
請參見圖2,為skb結(jié)構(gòu)體及其所指示的內(nèi)存空間的示意圖。其中,報文套接字管理數(shù)據(jù)結(jié)構(gòu)(sk_buff)字段用于存儲報文的元數(shù)據(jù)的地址,頭(head)字段用于存儲報文的第一頁內(nèi)容在內(nèi)存中的首地址,結(jié)束(end)字段用于存儲報文的第一頁內(nèi)容在內(nèi)存中的尾地址。線性數(shù)據(jù)區(qū)域(lineardataarea)為用于存儲報文的第一頁內(nèi)容的內(nèi)存頁,在報文存在多個分片時,報文套接字共享信息數(shù)據(jù)結(jié)構(gòu)(skb_shared_info)字段用于描述除了報文的線性區(qū)(首個分片中的數(shù)據(jù),在一頁內(nèi)存中)外的其他分片的信息,在skb發(fā)生復(fù)制(clone)時,skb_shared_info字段可被多個skb共享。報文套接字內(nèi)存頁(frags)(0)字段~frags(16)字段為內(nèi)存中的用于存儲報文的剩余內(nèi)容的區(qū)域,如果報文的內(nèi)容超過一頁,那么報文的第一頁內(nèi)容存儲在線性數(shù)據(jù)區(qū)域,報文的其他頁 的內(nèi)容可以依次存儲在frags(x)中,每個frags可以存儲一頁的內(nèi)容。
若按照skb結(jié)構(gòu)體來封裝用于存儲報文的內(nèi)容的內(nèi)存空間的地址,那么發(fā)送設(shè)備在需要發(fā)送報文時,可以根據(jù)報文的大小從內(nèi)存中申請內(nèi)存空間,skb結(jié)構(gòu)對于報文的元數(shù)據(jù)和報文的內(nèi)容的存儲位置不限制,因此發(fā)送設(shè)備申請的內(nèi)存空間可能是不連續(xù)的,發(fā)送設(shè)備可能將報文的元數(shù)據(jù)和報文的內(nèi)容存儲在不連續(xù)的內(nèi)存空間中,這樣,接收設(shè)備接收到用于指示不連續(xù)的內(nèi)存空間的skb結(jié)構(gòu)體后,需要通過訪問不連續(xù)的內(nèi)存空間來獲取報文的元數(shù)據(jù)和報文的內(nèi)容,可能訪問時的跨度較大,給訪問增加了難度,也增加了訪問所需的時間,訪問效率較低。
接收設(shè)備在不再需要使用skb結(jié)構(gòu)體時,可以指示發(fā)送設(shè)備釋放skb結(jié)構(gòu)體,而skb結(jié)構(gòu)體所指示的內(nèi)存空間可能是不連續(xù)的,大小可能也不一致,直接將其釋放回內(nèi)存中,出現(xiàn)碎片的概率較大,會影響系統(tǒng)的整體效率。
另外,釋放的內(nèi)存空間又分散釋放到了內(nèi)存中,若發(fā)送設(shè)備下次又需要通過skb結(jié)構(gòu)體來發(fā)送報文,則發(fā)送設(shè)備需要重新申請內(nèi)存空間,也就是說每次都需要重新申請內(nèi)存空間,操作步驟較為繁瑣,也降低了效率。
本發(fā)明實施例充分考慮到以上問題,資源池中可以預(yù)留事先申請好的連續(xù)的內(nèi)存頁,這樣發(fā)送設(shè)備在需發(fā)送報文時,可以直接從資源池中獲取已申請的內(nèi)存頁來存儲報文的內(nèi)容,減少了發(fā)送設(shè)備在發(fā)送報文時所需的準備工作,節(jié)省報文發(fā)送的時間。且m頁內(nèi)存頁是連續(xù)的,那么接收設(shè)備在接收發(fā)送設(shè)備發(fā)送的數(shù)據(jù)結(jié)構(gòu)體后,通過訪問數(shù)據(jù)結(jié)構(gòu)體所指示的連續(xù)的內(nèi)存頁就可以獲取報文的全部內(nèi)容,訪問較為簡單快捷,降低了訪問時的難度,從而提高了訪問效率。
另外,接收設(shè)備在不再需要使用該數(shù)據(jù)結(jié)構(gòu)體時,可以指示發(fā)送設(shè)備釋放該數(shù)據(jù)結(jié)構(gòu)體,而數(shù)據(jù)結(jié)構(gòu)體所指示的內(nèi)存頁是連續(xù)的,將其釋放回內(nèi)存中后出現(xiàn)碎片的概率較小,在一定程度上能夠提高系統(tǒng)的整體效率。
下面介紹本發(fā)明實施例所提供的方案。
請參見圖3,為本發(fā)明實施例提供的一種數(shù)據(jù)結(jié)構(gòu)體及其所指示的內(nèi)存空間的示意圖,在本發(fā)明實施例中,本地設(shè)備105和后端設(shè)備104之間可以按照該數(shù)據(jù)結(jié)構(gòu)體來傳輸報文。該數(shù)據(jù)結(jié)構(gòu)體的名稱例如為報文數(shù)據(jù)結(jié)構(gòu)(pkt),當然也可以有其他的命名,名稱對該數(shù)據(jù)結(jié)構(gòu)體本身不造成限制,為方便描述,下面將pkt作為該數(shù)據(jù)結(jié)構(gòu)體的名稱進行描述。
在pkt結(jié)構(gòu)體中,基于統(tǒng)一驅(qū)動框架的報文數(shù)據(jù)結(jié)構(gòu)緩存(ceth_pkt_buffer)字段可以用于定義該pkt結(jié)構(gòu)體占用的內(nèi)存頁或內(nèi)存頁所在的資源池的相關(guān)的管理信息,例如,可以記錄該內(nèi)存頁在內(nèi)存中的地址,還可以記錄資源池涉及的鏈表數(shù)據(jù)結(jié)構(gòu)等?;诮y(tǒng)一驅(qū)動框架的報文數(shù)據(jù)結(jié)構(gòu)(ceth_pkt)字段用于存儲報文的元數(shù)據(jù)在內(nèi)存中的地址,skb字段可以視為指針,可以用于訪問pkt結(jié)構(gòu)體對應(yīng)的skb結(jié)構(gòu)體,用于兼容skb結(jié)構(gòu)體,從而可以較為快速地將pkt結(jié)構(gòu)體和skb結(jié)構(gòu)體進行轉(zhuǎn)化,skb字段下面的frags字段,為pkt結(jié)構(gòu)體的標志位,可以用于記錄必要的報文屬性。end字段,可以視為指針,可以指向報文內(nèi)容在內(nèi)存中的結(jié)尾地址,end字段下面的數(shù)據(jù)(data)字段,可以視為指針,可以指向報文內(nèi)容在內(nèi)存中的起始地址。頂部空間(headroom),為報文的報頭之前的一段預(yù)留的內(nèi)存空間,用于為可能存在的報文提供向前擴展的能力。headroom下面的data,例如其中文名稱可以是報文數(shù)據(jù)空間,為一段內(nèi)存空間,這段內(nèi)存空間可以用于存儲報文的內(nèi)容。為了兼容skb結(jié)構(gòu)體,在pkt結(jié)構(gòu)體中保留了skb_shared_info、sk_buff、frags(0)~frags(16)、end、head、及data等字段,這樣,在提高訪問效率的同時,盡量避免破壞skb結(jié)構(gòu)體原有的功能。
另外,pkt結(jié)構(gòu)體中各個部分的命名只是一種可能的命名方式,也可以有其他的命名,內(nèi)部各個部分的名稱對該pkt結(jié)構(gòu)體本身不造成限制。
可以定義,圖3中所示的pkt結(jié)構(gòu)體所指示的內(nèi)存空間為一頁,即一個pkt結(jié)構(gòu)體所指示的報文的元數(shù)據(jù)和報文的內(nèi)容可以存儲在一頁內(nèi)存中,這樣元數(shù)據(jù)和報文的內(nèi)容不會存儲在不連續(xù)的內(nèi)存空間中,使得對內(nèi)存的訪問變得 更加簡單快捷,提高訪問效率。
可選的,如果報文的內(nèi)容較多,那么發(fā)送設(shè)備在申請內(nèi)存頁時可以申請多頁,即申請多個pkt結(jié)構(gòu)體,其中的第一個pkt結(jié)構(gòu)體所指示的內(nèi)存頁,即首個內(nèi)存頁可以存儲報文的元數(shù)據(jù)的地址和報文的第一頁的內(nèi)容的地址,報文的其他頁的地址可以依次存儲在申請的其他的pkt結(jié)構(gòu)體中,而其他的pkt結(jié)構(gòu)體中可以無需再存儲報文的元數(shù)據(jù)的地址,這樣可以減少需要存儲在pkt結(jié)構(gòu)體中的數(shù)據(jù)量,提高封裝效率。
下面介紹一種通過pkt結(jié)構(gòu)體來發(fā)送報文的方法,該方法可以依托于圖1所示的架構(gòu)實現(xiàn)。請參見圖4,該方法的流程描述如下:
步驟401:物理機中的發(fā)送設(shè)備在需發(fā)送報文時,從資源池中獲取連續(xù)m頁內(nèi)存頁;其中,m頁內(nèi)存頁分別用于存儲m個數(shù)據(jù)結(jié)構(gòu)體所指示的數(shù)據(jù),每個數(shù)據(jù)結(jié)構(gòu)體所指示的內(nèi)存空間為一頁,資源池包括發(fā)送設(shè)備預(yù)先申請的連續(xù)n頁內(nèi)存頁,n頁內(nèi)存頁用于存儲n個數(shù)據(jù)結(jié)構(gòu)體所指示的數(shù)據(jù),m、n均為正整數(shù),且m小于等于n;
步驟402:發(fā)送設(shè)備將報文包括的m個數(shù)據(jù)結(jié)構(gòu)體依次所指示的數(shù)據(jù)分別存儲到m頁內(nèi)存頁中;
步驟403:發(fā)送設(shè)備將m頁內(nèi)存頁依次對應(yīng)的內(nèi)存地址分別封裝到m個數(shù)據(jù)結(jié)構(gòu)體中,并將m個數(shù)據(jù)結(jié)構(gòu)體發(fā)送給物理機中的接收設(shè)備;
步驟404:接收設(shè)備接收m個數(shù)據(jù)結(jié)構(gòu)體,并依次從m個數(shù)據(jù)結(jié)構(gòu)體分別封裝的內(nèi)存地址對應(yīng)的內(nèi)存中獲取數(shù)據(jù),以及將依次獲取的數(shù)據(jù)組成報文。
可選的,圖4中的數(shù)據(jù),“數(shù)據(jù)”和“內(nèi)容”這兩個概念可互換。
可選的,圖4中的數(shù)據(jù)結(jié)構(gòu)體可以包括pkt結(jié)構(gòu)體。
資源池可以位于內(nèi)存中,無論發(fā)送設(shè)備是本地設(shè)備105還是后端設(shè)備104,只要是需要發(fā)送報文,則都可以在本地預(yù)先申請并維護資源池??蛇x的,如果發(fā)送設(shè)備是圖1中的本地設(shè)備105,那么資源池就位于本地設(shè)備105的內(nèi)存中,例如可以位于host102的物理網(wǎng)卡的內(nèi)存中,如果發(fā)送設(shè)備是圖1中的后端 設(shè)備104,由于后端設(shè)備104對應(yīng)的虛擬網(wǎng)卡實際上是軟件設(shè)備,因此資源池可以位于后端設(shè)備104的線性內(nèi)存中。
可選的,發(fā)送設(shè)備在從資源池中獲取連續(xù)的m個內(nèi)存頁之前,可以在內(nèi)存中預(yù)先申請連續(xù)的n頁內(nèi)存頁,發(fā)送設(shè)備可以將申請的n頁內(nèi)存頁用鏈表進行串接,這樣就相當于得到了該資源池,該資源池中就包括n頁內(nèi)存頁。發(fā)送設(shè)備在需要發(fā)送報文時,可以從資源池中獲取內(nèi)存頁,每個內(nèi)存頁可以存儲一個pkt結(jié)構(gòu)體所指示的數(shù)據(jù)。
可選的,一個pkt結(jié)構(gòu)體所指示的內(nèi)存空間為一頁,即,一個pkt結(jié)構(gòu)體可以指示資源池中的一頁內(nèi)存頁。發(fā)送設(shè)備需發(fā)送的報文的大小可能是不同的,比如有的報文的內(nèi)容可能只需占用一頁內(nèi)存頁,而有的報文的內(nèi)容可能需要占用多頁內(nèi)存頁,那么,發(fā)送設(shè)備在從資源池中獲取內(nèi)存頁時,可以根據(jù)報文的大小獲取不同數(shù)量的內(nèi)存頁。例如,如果報文的內(nèi)容為一頁,則發(fā)送設(shè)備可以獲取一頁內(nèi)存頁,即m=1,如果報文的內(nèi)容有多頁,則發(fā)送設(shè)備可以獲取多頁內(nèi)存頁,即m>1。
可選的,發(fā)送設(shè)備在預(yù)先申請資源池后,可以存儲資源池的首地址,即資源池中的第一個內(nèi)存頁的起始地址,那么發(fā)送設(shè)備在從資源池中獲取內(nèi)存頁時,可以優(yōu)先從資源池的首地址開始獲取,這樣節(jié)省了發(fā)送設(shè)備查找地址所需的時間。
例如,若m=1,則發(fā)送設(shè)備可以直接獲取資源池的首地址指向的內(nèi)存頁,若m>1,則發(fā)送設(shè)備可以獲取資源池的首地址指向的內(nèi)存頁,例如將其稱為第一內(nèi)存頁,且發(fā)送設(shè)備可以在資源池中從第一內(nèi)存頁開始,依次獲取連續(xù)的m-1頁內(nèi)存頁,這樣就獲得了m頁內(nèi)存頁。
發(fā)送設(shè)備在獲得m頁內(nèi)存頁后,可以將待發(fā)送的報文的內(nèi)容存儲到m頁內(nèi)存頁中,并按照該數(shù)據(jù)結(jié)構(gòu)體所指示的格式,即按照pkt結(jié)構(gòu)體封裝待發(fā)送的報文在內(nèi)存中的地址。例如,如果報文的內(nèi)容只有一頁,那么發(fā)送設(shè)備獲得的是一頁內(nèi)存頁,則發(fā)送設(shè)備用一個pkt結(jié)構(gòu)體封裝報文的元數(shù)據(jù)的地址 和報文的內(nèi)容的地址,如果報文的內(nèi)容有多頁,那么發(fā)送設(shè)備獲得的是多頁內(nèi)存頁,則發(fā)送設(shè)備通過多個pkt結(jié)構(gòu)體來封裝報文的元數(shù)據(jù)的地址和報文的內(nèi)容的地址,例如發(fā)送設(shè)備共獲得了3頁內(nèi)存頁,這3頁內(nèi)存頁在內(nèi)存中的地址從小到大的順序為:第1頁內(nèi)存頁的地址<第2頁內(nèi)存頁的地址<第3頁內(nèi)存頁的地址,那么,按照在內(nèi)存中的地址從小到大的順序,用于指示第1頁內(nèi)存頁的pkt結(jié)構(gòu)體可以用于封裝報文的元數(shù)據(jù)的地址和報文的第一頁的內(nèi)容的地址,用于指示第2頁內(nèi)存頁的pkt結(jié)構(gòu)體可以用于封裝報文的第二頁的內(nèi)容的地址,用于指示第3頁內(nèi)存頁的pkt結(jié)構(gòu)體可以用于封裝報文的第3頁的內(nèi)容的地址。
發(fā)送設(shè)備在將報文的地址封裝完畢后,可以發(fā)送pkt結(jié)構(gòu)體。例如發(fā)送設(shè)備為本地設(shè)備105,則pkt結(jié)構(gòu)體先發(fā)送給橋106,再發(fā)送給后端設(shè)備104,或者例如發(fā)送設(shè)備為后端設(shè)備104,則pkt結(jié)構(gòu)體先發(fā)送給橋106,再發(fā)送給本地設(shè)備105,也就是說,橋106也是其中的一個接收設(shè)備,本發(fā)明實施例暫時不討論橋106作為接收設(shè)備所要做的工作,例如發(fā)送設(shè)備為本地設(shè)備105,則本發(fā)明實施例所提到的接收設(shè)備可以是指后端設(shè)備104,或者例如發(fā)送設(shè)備為后端設(shè)備104,則本發(fā)明實施例所提到的接收設(shè)備可以是指本地設(shè)備105。
發(fā)送設(shè)備發(fā)送pkt結(jié)構(gòu)體后,接收設(shè)備可以接收pkt結(jié)構(gòu)體,接收設(shè)備接收pkt結(jié)構(gòu)體后,可以根據(jù)pkt結(jié)構(gòu)體中封裝的地址,從內(nèi)存中獲取報文的內(nèi)容。之后,如果接收設(shè)備為本地設(shè)備105,則可能報文的傳輸過程已經(jīng)完畢,或者報文可能通過本地設(shè)備105再傳輸給其他的物理機,或者,如果接收設(shè)備為后端設(shè)備104,則后端設(shè)備104可以將報文發(fā)送給vm101,無論如何,即使需要再傳輸報文,可能也無需再用到pkt結(jié)構(gòu)體,即接收設(shè)備對報文進行解封裝后,相當于pkt結(jié)構(gòu)體已經(jīng)使用完畢,也就相當于本發(fā)明實施例所定義的用于表征數(shù)據(jù)結(jié)構(gòu)的指示信息已使用完畢,那么為了使得用于表征數(shù)據(jù)結(jié)構(gòu)的指示信息可以復(fù)用,接收設(shè)備可以指示發(fā)送設(shè)備釋放m個pkt結(jié)構(gòu)體,發(fā)送設(shè)備可以重新將m個pkt結(jié)構(gòu)體所指示的內(nèi)存頁放入資源池,這樣發(fā)送 設(shè)備后續(xù)需要向接收設(shè)備發(fā)送報文時可以再次從資源池中獲取內(nèi)存頁,很可能同一頁內(nèi)存頁可以被多次使用,也就實現(xiàn)了內(nèi)存的復(fù)用,提高內(nèi)存的利用率。
可選的,發(fā)送設(shè)備在從資源池中獲取內(nèi)存頁時,可以優(yōu)先從資源池的首地址開始獲取,同樣的,發(fā)送設(shè)備在將釋放的pkt結(jié)構(gòu)體所指示的內(nèi)存頁放回資源池時,也可以優(yōu)先放回資源池的首地址所指向的位置,這樣節(jié)省了查找地址所需的時間,且始終從資源池的頭部獲取內(nèi)存頁和放入內(nèi)存頁,提高了內(nèi)存的復(fù)用率。其中,本發(fā)明實施例中,將內(nèi)存頁放回資源池,可以是指清空內(nèi)存頁中存儲的已傳輸?shù)膱笪牡膬?nèi)容。
例如,若m=1,則發(fā)送設(shè)備可以直接獲取資源池的首地址指向的內(nèi)存頁,那么在接收設(shè)備指示發(fā)送設(shè)備釋放用于指示該內(nèi)存頁的pkt結(jié)構(gòu)體后,發(fā)送設(shè)備可以重新將該內(nèi)存頁放入資源池的首地址所指向的位置,即清空資源池的首地址所指向的內(nèi)存頁中存儲的內(nèi)容,若m>1,則發(fā)送設(shè)備可以獲取資源池的首地址指向的內(nèi)存頁,例如將其稱為第一內(nèi)存頁,且發(fā)送設(shè)備可以在資源池中從第一內(nèi)存頁開始,依次獲取連續(xù)的m-1頁內(nèi)存頁,這樣就獲得了m頁內(nèi)存頁,在接收設(shè)備指示發(fā)送設(shè)備釋放用于指示該m頁內(nèi)存頁的m個pkt結(jié)構(gòu)體后,發(fā)送設(shè)備可以重新將該m頁內(nèi)存頁放入資源池,即清空該m頁內(nèi)存頁中存儲的內(nèi)容,例如,發(fā)送設(shè)備可以從第一內(nèi)存頁開始,依次清空該m頁內(nèi)存頁中存儲的內(nèi)容。
可選的,為了提升內(nèi)存的復(fù)用率以及減少系統(tǒng)的內(nèi)存占用,發(fā)送設(shè)備在預(yù)先申請資源池時,所申請的資源池可以不必過大,以避免占用內(nèi)存過多。而在發(fā)送報文時,如果需發(fā)送的報文的數(shù)量較多,則可能需要獲取的內(nèi)存頁的數(shù)量可能大于等于資源池中包括的內(nèi)存頁的數(shù)量,即可能會出現(xiàn)資源池的資源不足的情況,為解決該問題,本發(fā)明實施例提出,資源池的大小可以在使用過程中根據(jù)需求進行調(diào)整,下面進行介紹。
可選的,在發(fā)送設(shè)備中可以維護隊列(queue),例如稱為發(fā)送隊列,發(fā)送隊列可以用于維護待發(fā)送的報文。如果發(fā)送設(shè)備是本地設(shè)備105,則發(fā)送隊列 可以位于本地設(shè)備105的內(nèi)存中,如果發(fā)送設(shè)備是后端設(shè)備104,則發(fā)送隊列可以位于后端設(shè)備104的線性內(nèi)存中。那么,發(fā)送設(shè)備在初始申請資源池時,所申請的資源池的大小可以大于等于發(fā)送設(shè)備中的發(fā)送隊列的大小,以保證能夠正常發(fā)送報文。
可選的,發(fā)送設(shè)備可以實時對資源池進行監(jiān)控,或者也可以在每次需要從資源池中獲取內(nèi)存頁時對資源池進行監(jiān)控,或者也可以在每次從資源池中獲取內(nèi)存頁后對資源池進行監(jiān)控,等等,對于對資源池的監(jiān)控點本發(fā)明實施例不作限制。
可選的,如果資源池中已被發(fā)送設(shè)備獲取的內(nèi)存頁的數(shù)量大于等于第一門限值,則發(fā)送設(shè)備可以再從內(nèi)存中申請連續(xù)k頁內(nèi)存頁放入資源池,k為正整數(shù)。例如一種可能的計算第一門限值及k的方式如下:
m1=c1*(當前的發(fā)送隊列的大小)-a1*(最近b秒內(nèi)申請的報文個數(shù))(1)
k=a2*(最近b秒內(nèi)申請的報文個數(shù))+c2*(當前的發(fā)送隊列的大小)(2)
其中,公式(1)中的m1為第一門限值,公式(1)和公式(2)中的a1、a2、b、c1、c2為測試獲得的經(jīng)驗值。
可選的,如果資源池中已被發(fā)送設(shè)備獲取的內(nèi)存頁的數(shù)量小于等于第二門限值,則發(fā)送設(shè)備可以從資源池中釋放連續(xù)p頁內(nèi)存頁。其中,p均為正整數(shù)。例如一種可能的計算第二門限值及p的方式如下:
m2=c1*(當前的發(fā)送隊列的大小)-a1*(最近b秒內(nèi)申請的報文個數(shù))(3)
p=c2*(當前的發(fā)送隊列的大小)-a1*(最近b秒內(nèi)申請的報文個數(shù))(4)
其中,公式(3)中的m2為第二門限值,公式(3)和公式(4)中的a1、a2、b、c1、c2為測試獲得的經(jīng)驗值。其中,m2最小可以是0,p最小也可以是0。
根據(jù)公式(1)和公式(3)可以看到,這種計算方式下是以第一門限值和第二門限值相等為例,在實際應(yīng)用中,第一門限值和第二門限值也可以不相等。 可選的,第一門限值可以大于第二門限值。
請參見圖5,基于同一發(fā)明構(gòu)思,提供一種物理機500,該物理機500可以包括發(fā)送設(shè)備501和接收設(shè)備502。
可選的,該物理機500與圖1所示的宿主機102可以是同一設(shè)備。
可選的,發(fā)送設(shè)備501可以是圖1中的本地設(shè)備105,接收設(shè)備502可以是圖1中的后端設(shè)備104??商鎿Q的,發(fā)送設(shè)備501可以是圖1中的后端設(shè)備104,接收設(shè)備502可以是圖1中的本地設(shè)備105。
該物理機500可以實現(xiàn)圖4所示的方法,因此,對于該物理機500中的各功能單元所實現(xiàn)的功能等,可參考如前方法部分的描述,不多贅述。
本發(fā)明實施例中,資源池中可以預(yù)留事先申請好的連續(xù)的內(nèi)存頁,這樣發(fā)送設(shè)備在需發(fā)送報文時,可以直接從資源池中獲取已申請的內(nèi)存頁來存儲報文的內(nèi)容,減少了發(fā)送設(shè)備在發(fā)送報文時所需的準備工作,節(jié)省報文發(fā)送的時間。且m頁內(nèi)存頁是連續(xù)的,那么接收設(shè)備在接收發(fā)送設(shè)備發(fā)送的數(shù)據(jù)結(jié)構(gòu)體后,通過訪問數(shù)據(jù)結(jié)構(gòu)體所指示的連續(xù)的內(nèi)存頁就可以獲取報文的全部內(nèi)容,訪問較為簡單快捷,降低了訪問時的難度,從而提高了訪問效率。
在本發(fā)明中,應(yīng)該理解到,所揭露的設(shè)備和方法,可以通過其它的方式實現(xiàn)。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元或單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本發(fā)明實施例。
在本發(fā)明實施例中的各功能單元可以集成在一個處理單元中,或者各個單元也可以均是獨立的物理模塊。
所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)或處理器(processor)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:通用串行總線閃存盤(universalserialbusflashdrive)、移動硬盤、只讀存儲器(readonlymemory,rom)、隨機存取存儲器(randomaccessmemory,ram)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述,以上實施例僅用以對本發(fā)明的技術(shù)方案進行了詳細介紹,但以上實施例的說明只是用于幫助理解本發(fā)明實施例的方法,不應(yīng)理解為對本發(fā)明實施例的限制。本技術(shù)領(lǐng)域的技術(shù)人員可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明實施例的保護范圍之內(nèi)。