專利名稱:組播地址分配方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機分布式虛擬環(huán)境領(lǐng)域,尤指一種應(yīng)用在該領(lǐng)域中的組播地址分配方法。
背景技術(shù):
組播是一種一對多的通信機制,發(fā)送一次信息即可將該信息發(fā)送至需要相同數(shù)據(jù)的同一組用戶。由于組播的這一特性,使得組播技術(shù)成為大規(guī)模分布式虛擬環(huán)境所需要依賴的主要通訊手段,組播地址分配也就成為建立通道的關(guān)鍵所在。由于路由器所能支持的組播地址數(shù)目是有限的,可同時加入主機的組播地址數(shù)目也是有限的,然而分布式虛擬環(huán)境所需求的組播地址數(shù)目卻是巨大的,因而組播地址分配方法成為分布式虛擬環(huán)境中的重要問題之一。
分布式虛擬環(huán)境發(fā)展至今,主要有四類組播地址分配方法 一、基于數(shù)據(jù)本身的內(nèi)容進行的組播地址分配方法,典型例子就是各種形式的網(wǎng)格分配方法,即預(yù)先將組播地址分配給網(wǎng)格單元。該方法的優(yōu)點是計算量小,發(fā)送方和接收方之間不需要進行匹配,缺點是隨著虛擬空間的規(guī)模增大,組播地址需求增加極其迅速,而且組播地址浪費嚴(yán)重。
二、基于數(shù)據(jù)發(fā)送方的組播地址分配方法。該方法在數(shù)據(jù)的發(fā)送方為每個數(shù)據(jù)源分配組播組,數(shù)據(jù)發(fā)送方根據(jù)所有的發(fā)布/訂購包括區(qū)域相關(guān)信息進行匹配計算,并指導(dǎo)接收方加入相應(yīng)的組播組。這種方法一般采用一個對象實例分配一個組播地址的方法,對仿真節(jié)點進行分配的粒度過高,不符合普通的應(yīng)用需求。同時這種方法需要仿真節(jié)點知道虛擬環(huán)境中周圍的實體以及這些實體所使用的組播地址,從而給網(wǎng)絡(luò)帶來了額外的數(shù)據(jù)傳輸。
三、基于數(shù)據(jù)接收方的組播地址分配方法。該方法基于數(shù)據(jù)接收目標(biāo),為每種目的節(jié)點的組合分配組播組。一旦發(fā)送方知道了目標(biāo)節(jié)點列表,它就可以把數(shù)據(jù)向代表這些目標(biāo)的組播地址發(fā)送。這種方法的優(yōu)點是仿真節(jié)點不會收到不想接收的數(shù)據(jù),并且接收方(目標(biāo)節(jié)點)不需要知道發(fā)送方的信息,沒有額外的數(shù)據(jù)傳輸。然而,對于一個全連接的仿真來說,如果有N臺主機,這種機制需要的組播組數(shù)量將是2N-1。
四、從全局通訊連接信息出發(fā),把組播地址分配問題轉(zhuǎn)化為最優(yōu)問題求解,根據(jù)算法求解進行組播地址分配。
綜上所述,無論上述哪種組播地址分配方法都是采用組播地址的預(yù)分配,即預(yù)先把組播地址分配好,不能隨著某處通訊量的加大或者減少來隨時調(diào)整所分配的組播地址,從而不能有效利用組播地址資源。
發(fā)明內(nèi)容
本發(fā)明要解決的問題是提供一種能夠充分利用組播地址資源的組播地址分配方法。
為了解決上述問題,本發(fā)明組播地址分配方法的技術(shù)方案包括下述步驟 10)組播地址靜態(tài)預(yù)分配,該步驟又進一步分為, 11)將路徑空間劃分為多個網(wǎng)格單元和12)為網(wǎng)格單元分配組播地址; 20)若網(wǎng)格單元中的對象數(shù)超過網(wǎng)格單元對象數(shù)的上限,則對該網(wǎng)格單元進一步劃分,并為新形成的網(wǎng)格單元分配組播地址,所述對象指仿真實體; 30)若網(wǎng)格單元中的對象數(shù)低于網(wǎng)格單元對象數(shù)的下限,則刪除該網(wǎng)格單元,回收分配給其的組播地址。
所述步驟11)又進一步分為 步驟110)若占用路徑空間中的區(qū)域的對象少,則該區(qū)域的網(wǎng)格單元密度??; 步驟111)若占用路徑空間中的區(qū)域的對象多,則該區(qū)域的網(wǎng)格單元密度大。
所述步驟12)又進一步分為 步驟120)若對象不可能或者不應(yīng)該加入該網(wǎng)格單元所對應(yīng)的路徑空間,則不為其分配組播地址,或者為所有這些網(wǎng)格單元分配一個組播地址; 步驟121)若對象可能加入該網(wǎng)格單元所對應(yīng)的路徑空間,則為其分配一個組播地址,并以二維點陣的形式來表示組播地址在網(wǎng)格單元的分配,每一個網(wǎng)格單元作為二維點陣的一個結(jié)點,其中, handle_mapping[m-1][n-1],表示第m行第n列的結(jié)點的組播地址; 結(jié)點以組播地址句柄減去一個基準(zhǔn)值作為標(biāo)識結(jié)點的索引,組播地址句柄是組播地址的唯一標(biāo)識,而基準(zhǔn)值的大小是所有組播地址的句柄的最小值。
所述步驟20)中對網(wǎng)格單元進一步劃分指以點-區(qū)域四分樹的形式劃分,所述點-區(qū)域四分樹是完全四叉樹,指每次將一個結(jié)點劃分成四個子結(jié)點,其所包含的結(jié)點中要么是葉結(jié)點要么是父結(jié)點。
所述結(jié)點由下列屬性表示 層數(shù),用于表示該結(jié)點生長的層數(shù),其中,組播地址靜態(tài)預(yù)分配時建立的結(jié)點的層數(shù)為0,每生長一次層數(shù)加1,所述生長指該結(jié)點的進一步劃分; 三個子結(jié)點的索引,用于表示該結(jié)點的三個子結(jié)點的位置,其中,0表示空; 葉結(jié)點,用于表示該結(jié)點是否是葉結(jié)點; 組播地址句柄,是組播地址的唯一標(biāo)識。
所述步驟20)又進一步分為 21)若結(jié)點中的對象數(shù)超過結(jié)點對象數(shù)的上限,則從組播地址句柄獲得結(jié)點的索引; 22)若該結(jié)點是內(nèi)部結(jié)點,則退出,所述內(nèi)部結(jié)點指父結(jié)點; 23)若該結(jié)點是未分配結(jié)點,則退出,所述未分配結(jié)點指未為該結(jié)點分配組播地址; 24)找出三個未用的組播地址句柄; 25)根據(jù)這三個組播地址句柄分別創(chuàng)建三個子結(jié)點并為每一個子結(jié)點分配一個組播地址; 26)將該結(jié)點設(shè)置為內(nèi)部結(jié)點。
所述步驟24)進一步分為 241)判斷當(dāng)前空組播地址句柄索引是否合法; 242)若不正確,重新設(shè)置,否則步驟243)根據(jù)當(dāng)前空組播地址句柄索引查找空組播地址句柄; 244)若所有組播地址已分配完一遍,再從頭開始查找組播地址句柄。
所述步驟30)進一步分為 31)若結(jié)點中的對象數(shù)低于結(jié)點對象數(shù)的下限,通過組播地址句柄得到該結(jié)點的索引并對其進行合法性檢查,否則退出; 32)若該結(jié)點是葉結(jié)點,銷毀該結(jié)點,釋放組播地址句柄并退出; 33)遞歸刪除第一子結(jié)點,第二子結(jié)點,第三子結(jié)點; 34)重新設(shè)置原內(nèi)部結(jié)點為葉結(jié)點或者還原為組播地址靜態(tài)預(yù)分配時建立的結(jié)點。
與現(xiàn)有技術(shù)相比,本發(fā)明組播地址分配方法的有益效果是 由于若網(wǎng)格單元中的對象數(shù)超過網(wǎng)格單元對象數(shù)的上限,就對該網(wǎng)格單元進一步劃分,并為新形成的網(wǎng)格單元分配組播地址,換句話說,若某處的對象數(shù)過多,也就表明其需要更多的組播地址來進行通訊,那么就給它分配更多的組播地址。若網(wǎng)格單元中的對象數(shù)低于網(wǎng)格單元對象數(shù)的下限,就回收為該網(wǎng)格單元分配的組播地址,換句話說,若某處的對象數(shù)過少,也就表明其不再需要那么多的組播地址進行通訊,此時就將分配給其的組播地址回收,以便于將組播地址分配給需要的區(qū)域。因而本發(fā)明組播地址分配方法能夠隨著某處對象數(shù)的多少來隨時調(diào)整組播地址的分配,即實現(xiàn)了分配組播地址的動態(tài)分配,從而能夠充分利用組播地址資源。
圖1是按傳統(tǒng)網(wǎng)格單元劃分方法劃分的網(wǎng)格單元示意圖; 圖2是本發(fā)明組播地址分配方法的流程圖; 圖3是以三國鼎立的地形圖為例劃分的網(wǎng)格單元示意圖; 圖4是組播地址分配的一例的示意圖; 圖5是結(jié)點生長的流程圖; 圖6是結(jié)點回收的流程圖; 圖7(a)和(b)是PR四分樹生長的示意圖; 圖8是退化的PR四分樹的示意圖。
具體實施例方式 IP(Internet Proctocol,網(wǎng)絡(luò)協(xié)議)協(xié)議采用D類地址來支持組播,每個D類地址代表一組主機,故組播地址范圍從224.0.0.0到239.255.255.255。一些組播地址被指定為永久地址,在RFC(Request For Comments,請求注解)最新分配列表中列出,例如224.0.0.1代表該子網(wǎng)內(nèi)所有系統(tǒng)組,224.0.0.3代表該子網(wǎng)內(nèi)所有路由器組等。故組播地址的資源是有限的。
維是屬性值變化的坐標(biāo)軸,以名稱標(biāo)識。路徑空間是維的一個命名序列,該序列形成的多維坐標(biāo)系統(tǒng)是仿真中屬性值的數(shù)據(jù)空間。組播地址分配也就是將一定數(shù)量的組播地址“點”按照一定的規(guī)律放置到路徑空間的一些小單元中。
傳統(tǒng)的網(wǎng)格分配法按照預(yù)定義的規(guī)則將路徑空間劃分成固定大小的網(wǎng)格單元(Cell),為每一個網(wǎng)格單元分配一個組播地址。將區(qū)域和劃分的網(wǎng)格單元進行重疊匹配,就可以確定區(qū)域所覆蓋的網(wǎng)格單元。所述區(qū)域指對象(即仿真實體)的感知范圍,對象只對該范圍內(nèi)的信息感興趣而忽略該范圍以外的信息,或者對象只向該范圍發(fā)布信息。訂購該區(qū)域的接收方應(yīng)加入這些網(wǎng)格單元對應(yīng)的組播地址,發(fā)布更新區(qū)域的發(fā)送方則向網(wǎng)格單元所對應(yīng)的組播地址發(fā)送數(shù)據(jù),這樣接收方就能夠接收到發(fā)送方發(fā)送的數(shù)據(jù)。
如圖1所示,路徑空間被劃分為A1至A5、B1至B5、C1至C5、D1至D5共20個網(wǎng)格單元,接收方a的訂購區(qū)域S1,與其關(guān)聯(lián)的網(wǎng)格單元為B3、B4、B5、C3、C4和C5,也就是說接收方a加入了網(wǎng)格單元B3、B4、B5、C3、C4和C5所對應(yīng)的組播地址;發(fā)送方b的更新區(qū)域U1,與其關(guān)聯(lián)的網(wǎng)格單元為A2、A3、B2和B3,也就是說發(fā)送方b向A2、A3、B2和B3所對應(yīng)的組播地址發(fā)送數(shù)據(jù);發(fā)送方c的更新區(qū)域U2,與其關(guān)聯(lián)的網(wǎng)格單元為C2、C3、D2和D3,也就是說發(fā)送方c向網(wǎng)格單元C2、C3、D2和D3所對應(yīng)的組播地址發(fā)送數(shù)據(jù)。
由于對象,即仿真實體,也指網(wǎng)格單元所對應(yīng)的路徑空間的組播地址的使用者,在路徑空間中的分布密度是不均勻的,這樣會出現(xiàn)有些網(wǎng)格單元所對應(yīng)的組播地址沒有被使用,因而造成大量組播地址的浪費。
如圖2所示,本發(fā)明組播地址分配方法,包括下述步驟 10)組播地址靜態(tài)預(yù)分配,該步驟又進一步分為, 11)將路徑空間劃分為多個網(wǎng)格單元和12)為網(wǎng)格單元分配組播地址; 20)若網(wǎng)格單元中的對象數(shù)超過網(wǎng)格單元對象數(shù)的上限,則對該網(wǎng)格單元進一步劃分,并為新形成的網(wǎng)格單元分配組播地址,所述對象指網(wǎng)格單元所對應(yīng)的路徑空間的組播地址的使用者,即仿真實體; 30)若網(wǎng)格單元中的對象數(shù)低于網(wǎng)格單元對象數(shù)的下限,則將刪除該網(wǎng)格單元,回收分配給其的組播地址。
所述步驟11)又進一步分為 步驟110)若占用路徑空間中的區(qū)域的對象少,則該區(qū)域的網(wǎng)格單元密度?。? 步驟111)若占用路徑空間中的區(qū)域的對象多,則該區(qū)域的網(wǎng)格單元密度大。
所述步驟12)又進一步分為 步驟120)若對象不可能或者不應(yīng)該加入該網(wǎng)格單元所對應(yīng)的路徑空間,則不為其分配組播地址,或者為所有這些網(wǎng)格單元分配一個組播地址; 步驟121)若對象可能加入該網(wǎng)格單元所對應(yīng)的路徑空間,則為其分配一個組播地址,并以二維點陣的形式來表示組播地址在網(wǎng)格單元的分配,每一個網(wǎng)格單元作為二維點陣的一個結(jié)點,其中, handle_mapping[m-1][n-1],表示第m行第n列的結(jié)點的組播地址; 結(jié)點以組播地址句柄減去一個基準(zhǔn)值作為標(biāo)識結(jié)點的索引,組播地址句柄是組播地址的唯一標(biāo)識,而基準(zhǔn)值的大小是所有組播地址的句柄的最小值。
所述步驟20)中對網(wǎng)格單元進一步劃分指以點-區(qū)域四分樹(PR四分樹,Point-Region Quadtree)的形式劃分,所述PR四分樹是完全四叉樹,指每次將一個結(jié)點劃分成四個子結(jié)點,其所包含的結(jié)點中要么是葉結(jié)點要么是包含4個葉結(jié)點的父結(jié)點。
如圖4所示,將路徑空間劃分為9個不均勻的網(wǎng)格單元,1、2、3、4、5、6分別代表組播地址分配到相應(yīng)的網(wǎng)格空間中。組播地址1所在的網(wǎng)格單元中的黑點表示加入該網(wǎng)格單元所對應(yīng)的組播地址的對象。當(dāng)某個區(qū)域(譬如組播地址1所在的網(wǎng)格單元)的對象數(shù)量增多時,需要為該區(qū)域分配更多的組播地址,這時將組播地址1所在的網(wǎng)格單元進行四等分,四等分后形成的四個小網(wǎng)格單元的組播地址分別為1、7、8和9,如圖7(a)所示。如果組播地址7所在的網(wǎng)格單元的對象仍然密集,則將組播地址7所在的網(wǎng)格單元再次生長。如圖7(b)所示,組播地址1生長兩次后的PR四分樹結(jié)構(gòu)。
由于PR四分樹的內(nèi)部結(jié)點也需要分配組播地址,如圖7中的組播地址句柄1和7不能重復(fù)使用,因而這種分配存在一定的組播地址浪費。不考慮內(nèi)部結(jié)點的第一子結(jié)點的二次生長,可以將內(nèi)部結(jié)點的第一個子女退化到內(nèi)部結(jié)點中,這樣,PR四分樹就可以從完全四叉樹退化到完全三叉樹。如圖8所示,退化的PR四分樹使每個結(jié)點與已用的組播地址句柄一一對應(yīng),故使用退化的PR四分樹來表示結(jié)點,結(jié)點的數(shù)據(jù)結(jié)構(gòu)為 //退化的PR四分樹結(jié)點結(jié)構(gòu) typedef struct{int level;//結(jié)點生長的層數(shù)(0表示組播地址靜態(tài)預(yù)分配時 建立的結(jié)點)int split_node[3];//01,10,11三個子結(jié)點索引.0表示空.3=2**2-1.bool is_leaf; //是否葉結(jié)點int groupHandle;//組播地址句柄 }tree_node; 其中 所述結(jié)點由下列屬性表示 層數(shù),用于表示該結(jié)點生長的層數(shù),其中,組播地址靜態(tài)預(yù)分配時建立的結(jié)點的層數(shù)為0,每生長一次層數(shù)加1,所述生長指該結(jié)點的進一步劃分; 三個子結(jié)點的索引,用于表示該結(jié)點的三個子結(jié)點的位置,其中,0表示空; 葉結(jié)點,用于表示該結(jié)點是否是葉結(jié)點; 組播地址句柄,是組播地址的唯一標(biāo)識。
本發(fā)明組播地址分配方法通過判斷網(wǎng)格單元中對象的數(shù)目來決定是將該網(wǎng)格單元所對應(yīng)的組播地址回收以待分配給其它網(wǎng)格單元,還是為該網(wǎng)格單元再分配些組播地址,從而實現(xiàn)組播地址的動態(tài)分配。
對于對象多的區(qū)域,表明其需要更多的組播地址以進行通訊,故在對象多的區(qū)域劃分的網(wǎng)格單元的密度要大些;相應(yīng)地,對于對象小的區(qū)域,劃分的網(wǎng)格單元的密度要小些。如圖3所示,以三國鼎立的二維地形為例,在三方戰(zhàn)端頻繁的地點,可以將網(wǎng)格線的距離減小,增加網(wǎng)格單元的密度,其它地點可以適當(dāng)放寬網(wǎng)格線的距離,如邊荒地區(qū)、遠海等地點。
對于對象不可能或不應(yīng)該進入的網(wǎng)格單元,不分配組播地址,或者考慮可能有少數(shù)對象進入,可為所有這些網(wǎng)格單元分配一個組播地址。如圖3所示,將邊荒地區(qū)、遠海等地點設(shè)置為反選狀態(tài),不分配組播地址,該例中一共劃分了400個網(wǎng)格單元,實際分配了146個網(wǎng)格單元,所分配的組播地址數(shù)目大大降低,組播地址占用率降到36.5%。
二維點陣Grid用來表示組播地址在網(wǎng)格單元中的分配,其結(jié)構(gòu)為 //m,nint //dimension X上的劃分value_of_X[m]int(已歸一化) //dimension Y上的劃分value_of_Y[n]int(已歸一化) //組播地址數(shù)組handle_mapping[m-1][n-1]int typedef struct{ //X軸點的個數(shù) int num_of_X; //Y軸點的個數(shù) int num_of_Y; //X軸點的值,int[num_of_X] U32*value_of_X; //Y軸點的值,int[num_of_Y] U32*value_of_Y; //二維網(wǎng)格單元數(shù)組,記錄組播地址句柄編號. int[num_of_X-1][num_of_Y-1] int**handle_mapping; }Grid; 如圖5所示,所述步驟20)又進一步分為 21)若結(jié)點中的對象數(shù)超過結(jié)點對象數(shù)的上限,則從組播地址句柄獲得結(jié)點的索引; 22)若該結(jié)點是內(nèi)部結(jié)點,則退出,所述內(nèi)部結(jié)點指父結(jié)點; 23)若該結(jié)點是未分配結(jié)點,則退出,所述未分配結(jié)點指未為該結(jié)點分配組播地址; 24)找出三個未用的組播地址句柄; 25)根據(jù)這三個組播地址句柄分別創(chuàng)建三個子結(jié)點并為每一個子結(jié)點分配一個組播地址; 26)將該結(jié)點設(shè)置為內(nèi)部結(jié)點。
所述步驟24)進一步分為 241)判斷當(dāng)前空組播地址句柄索引是否合法; 242)若不正確,重新設(shè)置,否則步驟243)根據(jù)當(dāng)前空組播地址句柄索引查找空組播地址句柄; 244)若所有組播地址已分配完一遍,再從頭開始查找組播地址句柄。
上述步驟中,若結(jié)點中的對象數(shù)目超過節(jié)點對象數(shù)的上限,表明在該結(jié)點處的對象數(shù)目過多,其需要更多的組播地址來進行通訊,故應(yīng)對該結(jié)點再分配些組播地址。首先從組播句柄獲得結(jié)點的索引,若該結(jié)點是內(nèi)部結(jié)點,因為內(nèi)部結(jié)點不能再次生長,故退出,否則表示是葉結(jié)點或未分配結(jié)點。若該結(jié)點是未分配結(jié)點,表明該結(jié)點未分配組播地址,不能生長,故退出,否則表示該結(jié)點為已分配結(jié)點(組播地址靜態(tài)預(yù)分配時建立的結(jié)點或者各退化的PR四分樹上的結(jié)點)。該結(jié)點為已分配結(jié)點,找出三個未用的組播地址句柄。
找出3個未用的組播地址句柄的偽代碼為 //查找空組播地址句柄,其中空組播地址句柄索引min_null_index用以指示開始尋找空組播地址句柄的起始位置,group_count_static表示組播地址靜態(tài)預(yù)分配時分配的組播地址數(shù)目,group_count表示組播地址的總數(shù)目。
//查找空組播地址句柄函數(shù)int findNullNode(){ int temp=min_null_index; //(1)對當(dāng)前空組播地址句柄進行合法性檢查,這里的合法性是指空組播<br/>地址句柄應(yīng)該從下標(biāo)為group_count_static的元素開始 if((min_null_index<group_count_static) ‖(min_null_index>=group_count)) min_null_index=group_count_static; //(2)根據(jù)當(dāng)前空組播地址句柄記錄查找 //min_null_index指在第一個空節(jié)點處,空結(jié)點以其level屬性為0作為標(biāo)<!-- SIPO <DP n="7"> --><dp n="d7"/>識 if(quadtree[min_null_index].level==0){ min_null_index=findNextNullNode(min_null_index); return temp; } //(3)如地址已分配完一遍,從頭重新開始 //min_null_index無效,從頭開始重新找被釋放的組播地址空間 temp=findNextNullNode(group_count_static); //再找下一個并記錄 min_null_index=findNextNullNode(temp); return temp;}//查找下一個空組播地址句柄int findNextNullNode(int index){ int i=index+1; while(i<group_count){ //空結(jié)點以其level屬性為0作為標(biāo)識 if(quadtree[i].level==0) //找到空組播地址句柄并返回 return i; } //沒有空組播地址句柄返回-1 return-1;} 為每一個新的組播地址句柄創(chuàng)建一個結(jié)點,將原結(jié)點設(shè)置為內(nèi)部結(jié)點,新創(chuàng)建的結(jié)點為該結(jié)點的子結(jié)點,這樣,該結(jié)點實現(xiàn)了生長。
結(jié)點生長算法的偽代碼如下所示,其中g(shù)roup_index是結(jié)點的索引,group_handle是組播地址句柄,base_group_handle是為從組播地址句柄獲得結(jié)點的索引而設(shè)置的基準(zhǔn)值,其大小是組播地址句柄中的最小值。
//生長一層(包括子結(jié)點)int grow(int group_handle){ //(1)由組播地址句柄得到結(jié)點的索引; int group_index=group_handle-base_group_handle; //(2)檢查該結(jié)點是否已是樹,樹不能再次生長; if(quadtree[group_index].is_leaf=false) //已是樹,不能再生長 return 0; //(3)檢查該結(jié)點是否是種子,未在某棵樹上的非種子結(jié)點不能生長;<!-- SIPO <DP n="8"> --><dp n="d8"/> if((quadtree[group_index].level==0) &&(group_index>group_count_static-1)) //動態(tài)組播地址,但尚未在某棵樹上 return-1; if(group_count-group_count_used<3) //組播地址不夠了 return-2; //(4)找出3個未用的組播地址句柄; //找出3個空的組播地址 int a0,a1,a2; a0=findNullNode(); a1=findNullNode(); a2=findNullNode(); //(5)分別生成子結(jié)點并進行設(shè)置; int level=quadtree[group_index].level; if(a0) quadtree[a0].level=level+1; if(a1) quadtree[a1].level=level+1; if(a2) quadtree[a2].level=level+1; //(6)將子結(jié)點分配給新的位置?! ?/分配給新的位置&設(shè)置新的3+1個節(jié)點信息 quadtree[group_index].is_leaf=false; quadtree[group_index].split_node
=a0; quadtree[group_index].split_node[1]=a1; quadtree[group_index].split_node[2]=a2; quadtree[a0].is_leaf=true; quadtree[a1].is_leaf=true; quadtree[a2].is_leaf=true; group_count_used+=3; return 1;} 在路徑空間中檢索出需要組播地址生長的網(wǎng)格單元,也就是結(jié)點,檢索的關(guān)鍵碼是空間屬性。所述空間屬性是指空間坐標(biāo)的值。檢索包括下述步驟 ●檢索二維點陣,找出組播地址靜態(tài)預(yù)分配時建立的結(jié)點。該步驟根據(jù)空間屬性在二維點陣中確定橫縱坐標(biāo),并在該結(jié)點所屬的網(wǎng)格中確定相對位置; ●若該結(jié)點已經(jīng)生長成具有子結(jié)點的PR四分樹,以該結(jié)點為樹的根結(jié)點(或稱為內(nèi)部結(jié)點),在這棵退化的PR四分樹中檢索所需的葉結(jié)點。
實現(xiàn)上述檢索的偽代碼為 INT SEARCH(U32x,U32y){ //(1)查找森林中該空間位置在組播地址靜態(tài)預(yù)分配時建立的結(jié)點 //根據(jù)grid計算橫坐標(biāo)值 INTi=COLUMN(y); //根據(jù)grid計算縱坐標(biāo)值 INTj=ROW(x); IF(Grid.handle_mapping[i][j]==0) //此處未分配組播地址 RETURN 0; //(2)檢索該位置的樹 FLOAT fx=(x-Grid.value_of_X[j-1])*1.0/(Grid.value_of_X[j]-Grid.value_of_[j-1]); FLOAT fy=(y-Grid.value_of_Y[i-1])*1.0/(Grid.value_of_Y[i]-Grid.value_of_Y[i-1]); RETURN SearchInTree(fx,fy,mapping_grid.handle_mapping[i]j]); } 在二維點陣中查找組播地址靜態(tài)預(yù)分配時建立的結(jié)點以二分法方法分別在橫縱軸上進行檢索。所述橫縱軸分別指路徑空間的第一維和第二維,其坐標(biāo)的劃分分別按照從小到大的順序記錄在Grid.value_of_X[]與Grid.value_of_Y[]中。
采用二分法計算組播地址靜態(tài)預(yù)分配時建立的結(jié)點的橫坐標(biāo)的偽代碼為 //根據(jù)grid計算橫坐標(biāo)值 INT COLUMN(U32x){ //二分法查找的起點 INT i=0; //二分法查找的終點 INT j=Grid.num_of_X-1; //初始化二分法查找的中點m為零 INT m=0; //邊界情況 IF(x<=Grid.value_of_X[1]) //左邊界 RETURN i; IF(x>=Grid.value_of_X[j-1])<!-- SIPO <DP n="10"> --><dp n="d10"/> //右邊界 RETURN j-1; //二分法搜索 j--; WHILE(i<=j(luò)){ //設(shè)置二分法查找的中點 m=(i+j)/2; IF(x<Grid.value_of_X[m]) j=m-1; ELSE i=m+1; } RETURN i;} 采用二分法計算組播地址靜態(tài)預(yù)分配時建立的結(jié)點的縱坐標(biāo)與上述同理,不再贅述。
通過空間屬性與根結(jié)點的相對坐標(biāo)(fx,fx)來比較確定進一步要搜索的子結(jié)點,對原空間屬性乘2求余以確定在子結(jié)點中新的空間屬性,進行深度搜索,直至查找到葉結(jié)點。由于每一個網(wǎng)格單元(結(jié)點)采用退化的PR四分樹表示,每一結(jié)點又可稱為一棵樹,多個結(jié)點也就構(gòu)成了森林。對退化的PR四分樹檢索的偽代碼為 //在PR四分樹中進行結(jié)點的搜索//在樹中進行結(jié)點的搜索int search_in_tree(float x,float y,int d_group_index){ //葉結(jié)點,檢索成功 if(quadtree[d_group_index].is_leaf==true) return d_group_index; //內(nèi)部結(jié)點,需要進一步確定子結(jié)點 int num=0; //第一子結(jié)點已退化 if((x>0.5)&&(y<=0.5)) //第二子結(jié)點(對應(yīng)退化的PR四分樹的第一子結(jié)點) num=0; else if((x<=0.5)&&(y>0.5)) //第三子結(jié)點(對應(yīng)退化的PR四分樹的第二子結(jié)點) num=1; else if((x>0.5)&&(y>0.5)) //第四子結(jié)點(對應(yīng)退化的PR四分樹的第三子結(jié)點)<!-- SIPO <DP n="11"> --><dp n="d11"/> num=2; //x,y進行1的模運算,確定在子結(jié)點中的空間屬性 x*=2; y*=2; if(x>=1) x=x-1; if(y>=1) y=y(tǒng)-1; //搜索子結(jié)點 return search_in_tree(x,y,quadtree[d_group_index].split_node[num]);} 如圖6所示,所述步驟30)進一步分為 31)若結(jié)點中的對象數(shù)低于結(jié)點對象數(shù)的下限,通過組播地址句柄得到該結(jié)點的索引并對其進行合法性檢查,否則退出;所述合法性是指結(jié)點的索引值應(yīng)該是大于0并且小于或等于組播地址總數(shù)目的整數(shù); 32)若該結(jié)點是葉結(jié)點,銷毀該結(jié)點,釋放組播地址句柄并退出; 33)遞歸刪除第一子結(jié)點,第二子結(jié)點,第三子結(jié)點; 34)重新設(shè)置原內(nèi)部結(jié)點為葉結(jié)點或者還原為組播地址靜態(tài)預(yù)分配時建立的結(jié)點。
實現(xiàn)步驟30)的偽代碼如下 其中g(shù)roup_index表示結(jié)點的索引,group_handle表示組播地址句柄,base_group_handle表示組播地址句柄的起始值; //回收組播地址函數(shù)int prune(int group_handle){ //(1)由組播地址句柄得到結(jié)點的索引,并對索引進行合法性檢查; int group_index=group_handle-base_group_handle; if(group_index<0‖group_index>group_count) return-1; //(2)如果該結(jié)點是葉結(jié)點,釋放組播地址并返回; if(quadtree[group_index].is_leaf){ quadtree[group_index].level=0; return 1; } //(3)遞歸刪除所有子結(jié)點; int a0,a1,a2; //a0,a1,a2分別是該結(jié)點的第一、二、三個子結(jié)點(退化的PR四分樹) a0=quadtree[group_index].split_node
;<!-- SIPO <DP n="12"> --><dp n="d12"/> a1=quadtree[group_index].split_node[1]; a2=quadtree[group_index].split_node[2]; //刪除該結(jié)點的第一、二、三個子結(jié)點(退化的PR四分樹) quadtree[group_index].split_node
=0; quadtree[group_index].splii_node[1]=0; quadtree[group_index].split_node[2]=0; if(a0){ //考慮到a0可能有子結(jié)點,遞規(guī)刪除 prune(a0); group_count_used--; } if(a1){ //考慮到a1可能有子結(jié)點,遞規(guī)刪除 prune(a1); group_count_used--; } if(a2){ //考慮到a2可能有子結(jié)點,遞規(guī)刪除 prune(a2); group_count_used--; } //(4)重新設(shè)置有關(guān)組播地址句柄?! ?/如果該結(jié)點不是組播地址靜態(tài)預(yù)分配時分配的結(jié)點,則設(shè)為葉子結(jié)點,否則設(shè)為非葉子結(jié)點 if(group_index<group_count_static) quadtree[group_index].is_leaf=true; else quadtree[group_index].is_leaf=false; return 0;} 若結(jié)點中的對象數(shù)低于結(jié)點對象數(shù)的下限,表明該結(jié)點中的對象數(shù)過少,其不再需要那么多的組播地址進行通訊,故回收分配給其的組播地址。若該結(jié)點是葉結(jié)點,釋放該結(jié)點的組播地址句柄,否則該結(jié)點為內(nèi)部結(jié)點,則遞歸刪除該內(nèi)部結(jié)點的三個子結(jié)點。該內(nèi)部結(jié)點的子結(jié)點都刪除后,將該結(jié)點重新設(shè)置為葉結(jié)點或者還原為組播地址靜態(tài)預(yù)分配時建立的結(jié)點。
下面以實例來描述采用本發(fā)明組播地址分配方法動態(tài)分配組播地址的過程。
由于組播地址的動態(tài)分配方法與具體的組播地址值無關(guān),因此,本發(fā)明的前提是仿真用戶已經(jīng)根據(jù)自己的需要確定了在仿真過程中所使用的組播地址集合。
如圖4所示,將路徑空間劃分為9個不均勻的網(wǎng)格單元,為網(wǎng)格單元1、2、3、4、5、6分別分配組播地址,比如分配的組播地址分別是225.0.0.3,225.0.0.4,225.0.0.5,225.0.0.6,225.0.0.7,225.0.0.8,而其余的三個網(wǎng)格由于對象不可能或者不應(yīng)該加入該網(wǎng)格單元所對應(yīng)的路徑空間,從而不為其分配組播地址(或者為所有這些網(wǎng)格單元分配一個組播地址,本實例采取不為其分配組播地址的方法)。這樣完成了組播地址的靜態(tài)預(yù)分配過程。
當(dāng)組播地址225.0.0.3所在的網(wǎng)格單元的對象數(shù)量增多并需要為該區(qū)域分配更多的組播地址時,這時將組播地址225.0.0.3所在的網(wǎng)格單元進行四等分,四等分后形成的四個小網(wǎng)格單元分別為1、7、8和9,如圖7(a)所示。這時找出三個未用的組播地址,比如225.0.0.9,225.0.0.10,225.0.0.11,并分別作為小網(wǎng)格單元7、8、9的組播地址,這樣實現(xiàn)了網(wǎng)格單元的生長。如果組播地址225.0.0.9所在的網(wǎng)格單元的對象仍然密集,則將組播地址225.0.0.9所在的網(wǎng)格單元再次生長。隨著仿真過程的推進,如果1、7、8和9四個小網(wǎng)格單元的對象數(shù)減少到一定數(shù)目,則釋放網(wǎng)格單元7、8和9的組播地址225.0.0.9,225.0.0.10和225.0.0.11,并將1、7、8和9四個小網(wǎng)格單元合并成一個大的網(wǎng)格單元1,該大的網(wǎng)格單元的組播地址是225.0.0.3。釋放的組播地址225.0.0.9,225.0.0.10和225.0.0.11作為空閑組播地址可以再次使用。通過上述過程實現(xiàn)了組播地址的動態(tài)分配。
以上所述僅是本發(fā)明組播地址分配方法的優(yōu)選實施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明組播地址分配方法原理的前提下,還可以作出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明組播地址分配方法的保護范圍。
權(quán)利要求
1、一種組播地址分配方法,包括下述步驟
10)組播地址靜態(tài)預(yù)分配,該步驟又進一步分為,
11)將路徑空間劃分為多個網(wǎng)格單元和12)為網(wǎng)格單元分配組播地址;
20)若網(wǎng)格單元中的對象數(shù)超過網(wǎng)格單元對象數(shù)的上限,則對該網(wǎng)格單元進一步劃分,并為新形成的網(wǎng)格單元分配組播地址,所述對象指仿真實體;
30)若網(wǎng)格單元中的對象數(shù)低于網(wǎng)格單元對象數(shù)的下限,則刪除該網(wǎng)格單元,回收分配給其的組播地址。
2、如權(quán)利要求1所述的組播地址分配方法,其特征在于,所述步驟11)又進一步分為
步驟110)若占用路徑空間中的區(qū)域的對象少,則該區(qū)域的網(wǎng)格單元密度??;
步驟111)若占用路徑空間中的區(qū)域的對象多,則該區(qū)域的網(wǎng)格單元密度大。
3、如權(quán)利要求2所述的組播地址分配方法,其特征在于,所述步驟12)又進一步分為
步驟120)若對象不可能或者不應(yīng)該加入該網(wǎng)格單元所對應(yīng)的路徑空間,則不為其分配組播地址,或者為所有這些網(wǎng)格單元分配一個組播地址;
步驟121)若對象可能加入該網(wǎng)格單元所對應(yīng)的路徑空間,則為其分配一個組播地址,并以二維點陣的形式來表示組播地址在網(wǎng)格單元的分配,每一個網(wǎng)格單元作為二維點陣的一個結(jié)點,其中,
handle_mapping[m-1][n-1],表示第m行第n列的結(jié)點的組播地址。
4、如權(quán)利要求3所述的組播地址分配方法,其特征在于,所述步驟20)中對網(wǎng)格單元進一步劃分指以點-區(qū)域四分樹的形式劃分,所述點-區(qū)域四分樹是完全四叉樹,指每次將一個結(jié)點劃分成四個子結(jié)點,其所包含的結(jié)點中要么是葉結(jié)點要么是父結(jié)點。為了進一步減少組播地址資源的浪費,完全四叉樹退化成完全三叉樹。
5、如權(quán)利要求4所述的組播地址分配方法,其特征在于,所述結(jié)點由下列屬性表示
層數(shù),用于表示該結(jié)點生長的層數(shù),其中,組播地址靜態(tài)預(yù)分配時建立的結(jié)點的層數(shù)為0,每生長一次層數(shù)加1,所述生長指該結(jié)點的進一步劃分;
三個子結(jié)點的索引,用于表示該結(jié)點的三個子結(jié)點的位置,其中,0表示空;
葉結(jié)點,用于表示該結(jié)點是否是葉結(jié)點;
組播地址句柄,是組播地址的唯一標(biāo)識。
6、如權(quán)利要求5所述的組播地址分配方法,其特征在于,所述步驟20)又進一步分為
21)若結(jié)點中的對象數(shù)超過結(jié)點對象數(shù)的上限,則從組播地址句柄獲得結(jié)點的索引;
22)若該結(jié)點是內(nèi)部結(jié)點,則退出,所述內(nèi)部結(jié)點指父結(jié)點;
23)若該結(jié)點是未分配結(jié)點,則退出,所述未分配結(jié)點指未為該結(jié)點分配組播地址;
24)找出三個未用的組播地址句柄;
25)根據(jù)這三個組播地址句柄分別創(chuàng)建三個子結(jié)點并為每一個子結(jié)點分配一個組播地址;
26)將該結(jié)點設(shè)置為內(nèi)部結(jié)點。
7、如權(quán)利要求6所述的組播地址分配方法,其特征在于,所述步驟24)進一步分為
241)判斷當(dāng)前空組播地址句柄索引是否合法;
242)若不正確,重新設(shè)置,否則步驟243)根據(jù)當(dāng)前空組播地址句柄索引查找空組播地址句柄;
244)若所有組播地址已分配完一遍,再從頭開始查找組播地址句柄。
8、如權(quán)利要求5所述的組播地址分配方法,其特征在于,所述步驟30)進一步分為
31)若結(jié)點中的對象數(shù)低于結(jié)點對象數(shù)的下限,通過組播地址句柄得到該結(jié)點的索引并對其進行合法性檢查,否則退出;
32)若該結(jié)點是葉結(jié)點,銷毀該結(jié)點,釋放組播地址句柄并退出;
33)遞歸刪除第一子結(jié)點,第二子結(jié)點,第三子結(jié)點;
34)重新設(shè)置原內(nèi)部結(jié)點為葉結(jié)點或者還原為組播地址靜態(tài)預(yù)分配時建立的結(jié)點。
全文摘要
本發(fā)明公開了一種組播地址分配方法,包括步驟10)組播地址靜態(tài)預(yù)分配,該步驟又進一步分為,11)將路徑空間劃分為多個網(wǎng)格單元和12)為網(wǎng)格單元分配組播地址;20)若網(wǎng)格單元中的對象數(shù)超過網(wǎng)格單元對象數(shù)的上限,則對該網(wǎng)格單元進一步劃分,并為新形成的網(wǎng)格單元分配組播地址,所述對象指仿真實體;30)若網(wǎng)格單元中的對象數(shù)低于網(wǎng)格單元對象數(shù)的下限,則刪除該網(wǎng)格單元,回收分配給其的組播地址。本發(fā)明組播地址分配方法能夠隨著某處對象數(shù)的多少來隨時調(diào)整組播地址的分配,即實現(xiàn)了分配組播地址的動態(tài)分配,從而能夠充分利用組播地址資源。
文檔編號H04L29/12GK1610326SQ200410091190
公開日2005年4月27日 申請日期2004年11月23日 優(yōu)先權(quán)日2004年11月23日
發(fā)明者周忠, 吳威, 黃海 申請人:北京航空航天大學(xué)