基于鏈表的索引分配方法和裝置制造方法
【專利摘要】本發(fā)明揭示了一種基于鏈表的索引分配方法及裝置,其通過(guò)在以太網(wǎng)中創(chuàng)建保存所有可用索引的鏈表,在鏈表中將每一段連續(xù)的索引段保存一個(gè)結(jié)點(diǎn),相連的索引段之間通過(guò)指針串聯(lián)起來(lái);分配索引時(shí),從鏈表的頭開(kāi)始,如果第一個(gè)結(jié)點(diǎn)的索引長(zhǎng)度大于1,則把所述結(jié)點(diǎn)的索引長(zhǎng)度減1,起始索引加1,并把原來(lái)的起始索引返回;如果第一個(gè)結(jié)點(diǎn)的索引長(zhǎng)度等于1,則這個(gè)結(jié)點(diǎn)變?yōu)榭眨⑵溽尫?。在索引回收時(shí),遍歷鏈表進(jìn)行查找,并找到第一個(gè)起始索引大于回收目標(biāo)索引的結(jié)點(diǎn),回收目標(biāo)索引即在這個(gè)結(jié)點(diǎn)和它的前一個(gè)結(jié)點(diǎn)之間。本發(fā)明索引分配的方法不僅能保證索引分配的正確性,有效節(jié)省內(nèi)存,而且大大提升了索引分配的效率。
【專利說(shuō)明】基于鏈表的索引分配方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及網(wǎng)絡(luò)通信領(lǐng)域,尤其是涉及在以太網(wǎng)中通過(guò)創(chuàng)建鏈表進(jìn)行表項(xiàng)索引分配的方法及裝置。
【背景技術(shù)】
[0002]在以太網(wǎng)交換機(jī)中需要保存各種各樣的表,比如FDB(Forwarding Database,轉(zhuǎn)發(fā)數(shù)據(jù))表,路由表等等。這些表中保存了數(shù)目不等的表項(xiàng),比如FDB表中的表項(xiàng)可以達(dá)到幾千條,幾萬(wàn)條甚至更多,而這些表項(xiàng)都有一個(gè)唯一索引,用戶在配置一條FDB表項(xiàng)時(shí),要從這成千上萬(wàn)條的表項(xiàng)中分配一個(gè)索引給它。而分配索引的快慢直接影響到交換機(jī)的性能,所以索引分配是一項(xiàng)很重要的技術(shù)。
[0003]在分配索引時(shí),傳統(tǒng)的做法是使用位圖(BITMAP),即將每個(gè)BIT位表示一個(gè)索引,如O表示這個(gè)索引還未被占,I表示已經(jīng)被占。分配索引時(shí),傳統(tǒng)的做法是遍歷這個(gè)位圖,找到第一個(gè)為O的BIT,它的下標(biāo)就是分配到的索引,然后將該BIT改成I。在回收索引時(shí),直接根據(jù)索引找到對(duì)應(yīng)的BIT,將該BIT改為0,下次又可以分配給其他的表項(xiàng)使用。
[0004]用BITMAP分配索引的做法實(shí)現(xiàn)簡(jiǎn)單,而且由于是用BIT來(lái)表示索引,其能保證索引分配的正確性,且不會(huì)占用太多內(nèi)存。但是,這種方案的不足之處在于分配索引時(shí)效率較低。每次在申請(qǐng)一個(gè)新的索引時(shí),它都要從頭開(kāi)始遍歷每個(gè)BIT,直到找到第一個(gè)為O的BIT,在存在大量索引的時(shí)候,可能要遍歷很多個(gè)BIT才找到一個(gè)有用的,而且每次都是如此;加上因?yàn)楣?jié)省內(nèi)存而使用效率較低的位操作,現(xiàn)有的技術(shù)方案在分配大量索引時(shí)效率會(huì)變得越來(lái)越低。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于克服現(xiàn)有技術(shù)的缺陷,提供一種基于鏈表的索引分配方法及裝置,其不僅能保證索引分配時(shí)的正確性,而且能大大提供索引分配的效率。
[0006]為達(dá)到上述發(fā)明目的,本發(fā)明提出如下技術(shù)方案:一種基于鏈表的索引分配方法,在以太網(wǎng)中創(chuàng)建一張保存所有可用索引的鏈表;鏈表中包括至少一段索引連續(xù)的索引段,每一索引段形成一個(gè)結(jié)點(diǎn),分配索引時(shí),從鏈表的頭開(kāi)始,如果第一個(gè)結(jié)點(diǎn)的索引長(zhǎng)度大于1,則把所述結(jié)點(diǎn)的索引長(zhǎng)度減1,起始索引加1,并把原來(lái)的起始索引返回;如果第一個(gè)結(jié)點(diǎn)的索引長(zhǎng)度等于1,則這個(gè)結(jié)點(diǎn)變?yōu)榭眨⑵溽尫拧?br>
[0007]其中,所述可用索引的結(jié)點(diǎn)通過(guò)所述雙向鏈表相串聯(lián)。
[0008]所述索引連續(xù)的索引段包括索引長(zhǎng)度為I的索引段。
[0009]本發(fā)明還提出另一種基于鏈表的索引分配方法,在以太網(wǎng)中建立一張保存所有可用索引的鏈表;鏈表中包括至少一段索引連續(xù)的索引段,每一段索引段形成一個(gè)結(jié)點(diǎn);在回收目標(biāo)索引時(shí),遍歷鏈表,找到第一個(gè)起始索引大于回收目標(biāo)索引的結(jié)點(diǎn),回收目標(biāo)索引即在所述結(jié)點(diǎn)及其前一個(gè)結(jié)點(diǎn)間。
[0010]更進(jìn)一步地,在回收索引時(shí),包括以下處理方法:[0011]a)如目標(biāo)索引只與前結(jié)點(diǎn)相連,則將前結(jié)點(diǎn)的索引長(zhǎng)度加I ;
[0012]b)如目標(biāo)索引只與后結(jié)點(diǎn)相連,則將后結(jié)點(diǎn)起始索引減I ;
[0013]c)如目標(biāo)索引與前后結(jié)點(diǎn)都不相連,則創(chuàng)建一個(gè)新的結(jié)點(diǎn),該結(jié)點(diǎn)的起始索引為目標(biāo)索引,索引長(zhǎng)度為I,同時(shí)將該新結(jié)點(diǎn)的前后指針與前后結(jié)點(diǎn)進(jìn)行雙向指向;
[0014]d)如目標(biāo)索引與前后結(jié)點(diǎn)都相連,則將后結(jié)點(diǎn)釋放,將前結(jié)點(diǎn)的索引長(zhǎng)度加I再加上后結(jié)點(diǎn)的索引長(zhǎng)度,并將指針雙向指向。
[0015]本發(fā)明還提出一種基于鏈表的索引分配裝置,包括鏈表,所述鏈表中包括以太網(wǎng)中所有的可用索引,所述可用索引包括至少一段索引連續(xù)的索引段,每一索引段形成一個(gè)結(jié)點(diǎn);所述每個(gè)結(jié)點(diǎn)包括指向前一個(gè)結(jié)點(diǎn)的前向指針和指向后一個(gè)非空結(jié)點(diǎn)的后向指針,以及本段索引的起始索引和索引長(zhǎng)度。
[0016]其中,所述起始索引是本段索引的第一個(gè)索引,所述索引長(zhǎng)度為本段索引的個(gè)數(shù)。
[0017]所述索引連續(xù)的索引段包括索引長(zhǎng)度為I的索引段。
[0018]與現(xiàn)有技術(shù)相比,本發(fā)明提出基于鏈表的索引分配,將一段連續(xù)可用的索引保存為一個(gè)結(jié)點(diǎn),相連的連續(xù)索引之間通過(guò)指針串聯(lián)起來(lái)。在分配索引時(shí)大大提升了索引分配的效率,并且能有效節(jié)省內(nèi)存。
【專利附圖】
【附圖說(shuō)明】
[0019]圖1是本發(fā)明鏈表中一索引段結(jié)構(gòu)的方框圖;
[0020]圖2是本發(fā)明分配索引時(shí)的流程圖;
[0021]圖3A、3B是本發(fā)明第一實(shí)施例中索引分配前及分配后鏈表的方框圖;
[0022]圖4A、4B是本發(fā)明第二實(shí)施例中索引分配前及分配后鏈表的方框圖;
[0023]圖5A、5B是本發(fā)明第三實(shí)施例中索引分配前及分配后鏈表的方框圖;
[0024]圖6A、6B是本發(fā)明第四實(shí)施例在索引回收前及回收后鏈表的方框圖;
[0025]圖7A、7B是本發(fā)明第五實(shí)施例中索引回收前及回收后鏈表的方框圖;
[0026]圖8A、8B是本發(fā)明第六實(shí)施例中索引回收前及回收后鏈表的方框圖;
[0027]圖9A、9B是本發(fā)明第七實(shí)施例中索引回收前及回收后鏈表的方框圖。
【具體實(shí)施方式】
[0028]下面將結(jié)合本發(fā)明的附圖,對(duì)本發(fā)明實(shí)施例的技術(shù)方案進(jìn)行清楚、完整的描述。
[0029]本發(fā)明所揭示的基于鏈表的索引分配方法,其通過(guò)將FDB表、路由表等這些表項(xiàng)中的可用索引和不可用索引區(qū)分開(kāi)來(lái),將所有可用的索引保存在一張鏈表中,然后在進(jìn)行索引分配及索引回收時(shí),通過(guò)在這張鏈表中查找到索引位置即可進(jìn)行索引的分配及回收。
[0030]在一開(kāi)始,所有的索引都是可用的,即只有一整塊且連續(xù)的索引。隨著索引會(huì)不斷地分配回收,可用的索引會(huì)變得越來(lái)越離散,即一整塊的索引變成了一段一段的索引,每一連續(xù)索引組成一個(gè)索引段,每一索引段上形成一個(gè)結(jié)點(diǎn)。把這一段一段的索引串起來(lái),就形成了一個(gè)鏈表。分配索引時(shí),這個(gè)鏈表的頭就是下一次分配出去的索引;回收索引時(shí),遍歷鏈表找到回收索引的目標(biāo)位置,將其回收。
[0031]本發(fā)明使用雙向鏈表來(lái)保存可用索引,如圖1所示的鏈表中的一段索引中,包括了指向前個(gè)結(jié)點(diǎn)的前向指針和指向后個(gè)結(jié)點(diǎn)的后向指針,以及本段可用索引的起始索引offset和索引長(zhǎng)度size。其中,前向指針指向了前結(jié)點(diǎn),起始索引表示本段索引的第一個(gè)索引,索引長(zhǎng)度表示本段索引的個(gè)數(shù)。
[0032]當(dāng)后向指針指向的后結(jié)點(diǎn)為空結(jié)點(diǎn)(也就是說(shuō)沒(méi)有后結(jié)點(diǎn)時(shí)),所述的后向指針為空指針。
[0033]如圖2所示,分配索引時(shí),從鏈表的頭開(kāi)始。如果第一個(gè)結(jié)點(diǎn)所在的索引段的索引長(zhǎng)度大于1,在分配時(shí)只需要把索引長(zhǎng)度減1,起始索引加1,然后把原來(lái)的起始索引返回即可;如果第一個(gè)結(jié)點(diǎn)的索引長(zhǎng)度等于1,這個(gè)結(jié)點(diǎn)就變成空了,所以要將其釋放。
[0034]如顯示本發(fā)明第一實(shí)施例的圖3A所示的鏈表中,最初,整個(gè)鏈表有100個(gè)索引可供分配使用,且這100個(gè)索引是連續(xù)的索引。經(jīng)過(guò)不斷的分配回收,形成如圖3B所示的鏈表,其可用的索引有3段,分別為:0-9,20-69,90-99。頭結(jié)點(diǎn)指向第一個(gè)結(jié)點(diǎn),最后一個(gè)結(jié)點(diǎn)沒(méi)有下一個(gè)結(jié)點(diǎn)。
[0035]在分配索引時(shí),如顯示本發(fā)明第二實(shí)施例的4A所示,第一個(gè)結(jié)點(diǎn)所在的索引段的索引長(zhǎng)度為10大于1,因此只要把索引長(zhǎng)度減1,起始索引加1,然后把原來(lái)的起始索引返回即可,形成如圖4B所示的鏈表結(jié)構(gòu)。
[0036]當(dāng)?shù)谝粋€(gè)結(jié)點(diǎn)所在的索引段的索引長(zhǎng)度等于I時(shí),如顯示本發(fā)明第三實(shí)施例的圖5A所示,索引分配后,這個(gè)結(jié)點(diǎn)就變成空了,所以要將其釋放,形成如圖5B所示的鏈表結(jié)構(gòu)。
[0037]在回收索引時(shí),遍歷鏈表進(jìn)行查找,并找到第一個(gè)起始索引大于回收目標(biāo)索引的結(jié)點(diǎn),回收目標(biāo)索引即在這個(gè)結(jié)點(diǎn)和它的前一個(gè)結(jié)點(diǎn)之間。具體回收時(shí),一共存在以下幾種情況:
[0038]I)、回收目標(biāo)索引只與前結(jié)點(diǎn)相連。在回收索引時(shí),當(dāng)回收目標(biāo)索引與前結(jié)點(diǎn)相連時(shí),將前結(jié)點(diǎn)索引長(zhǎng)度加I即可。
[0039]2)、回收目標(biāo)索引只與后結(jié)點(diǎn)相連。在回收索引時(shí),當(dāng)目標(biāo)索引與后結(jié)點(diǎn)相連時(shí),將后結(jié)點(diǎn)起始索引減I即可。
[0040]3)、回收目標(biāo)索引與前后結(jié)點(diǎn)都不相連。在回收索引時(shí),當(dāng)回收目標(biāo)索引和前后結(jié)點(diǎn)都不相連時(shí),則需要?jiǎng)?chuàng)建一個(gè)新的結(jié)點(diǎn),該新結(jié)點(diǎn)的起始索引即為回收目標(biāo)索引,索引長(zhǎng)度為I ;同時(shí)所述結(jié)點(diǎn)與前后結(jié)點(diǎn)的指針?lè)謩e雙向指向,即將前結(jié)點(diǎn)的后向指針指向新結(jié)點(diǎn),新結(jié)點(diǎn)的前向指針指向前結(jié)點(diǎn),新結(jié)點(diǎn)的后向指針指向后結(jié)點(diǎn),后結(jié)點(diǎn)的前向指針指向新結(jié)點(diǎn)。
[0041]4)、回收目標(biāo)索引與前后結(jié)點(diǎn)都相連。在回收索引時(shí),當(dāng)回收目標(biāo)索引和前后結(jié)點(diǎn)都相連時(shí),將后結(jié)點(diǎn)釋放,前結(jié)點(diǎn)的索引長(zhǎng)度加上I再加上后結(jié)點(diǎn)的索引長(zhǎng)度,前結(jié)點(diǎn)的后向指針等于后結(jié)點(diǎn)的后向指針。
[0042]當(dāng)然,這種情況下,也可以將前結(jié)點(diǎn)釋放,將后結(jié)點(diǎn)的索引長(zhǎng)度加上I再加上前結(jié)點(diǎn)的索引長(zhǎng)度,后結(jié)點(diǎn)的前向指針等于前結(jié)點(diǎn)的前向指針,其結(jié)果與釋放后結(jié)點(diǎn)的相同的。
[0043]如圖6A、6B至圖9A、9B所示,分別表示本發(fā)明第四至第七實(shí)施例中回收目標(biāo)索引時(shí)與上述I)至4)所對(duì)應(yīng)的鏈表結(jié)構(gòu)的示意圖,如圖6A所示,回收目標(biāo)索引為10,前結(jié)點(diǎn)可用索引為0-9,后結(jié)點(diǎn)可用索引為20-69,目標(biāo)索引只與前結(jié)點(diǎn)相連,則將前結(jié)點(diǎn)索引長(zhǎng)度加I即可,得到圖6B所示的鏈表結(jié)構(gòu)。
[0044]圖7A中,目標(biāo)索引為19,前結(jié)點(diǎn)的可用索引為0-9,后結(jié)點(diǎn)可用索引為20-69,目前索引只與后結(jié)點(diǎn)相連,在索引回收時(shí)只需將后結(jié)點(diǎn)起始索引減I即可,得到圖7B所示的鏈表結(jié)構(gòu)。
[0045]圖8A中,目標(biāo)索引為15,前結(jié)點(diǎn)的可用索引為0-9,后結(jié)點(diǎn)的可用索引為20-69,目標(biāo)索引與前后結(jié)點(diǎn)都不相連,在索引回收時(shí),倉(cāng)Il建一個(gè)新的結(jié)點(diǎn),這個(gè)新結(jié)點(diǎn)的起始索引即為15,索引長(zhǎng)度為I ;同時(shí)將前結(jié)點(diǎn)的后向指針指向新結(jié)點(diǎn),新結(jié)點(diǎn)的前向指針指向前結(jié)點(diǎn),新結(jié)點(diǎn)的后向指針指向后結(jié)點(diǎn),后結(jié)點(diǎn)的前向指針指向新結(jié)點(diǎn),得到如圖8B所示的鏈表結(jié)構(gòu)。
[0046]圖9A中,目標(biāo)索引50,前結(jié)點(diǎn)可用索引為0-49,后結(jié)點(diǎn)可用索引為51-80,目標(biāo)索引與前后結(jié)點(diǎn)都相連?;厥账饕龝r(shí),將后結(jié)點(diǎn)釋放,前結(jié)點(diǎn)的索引長(zhǎng)度加上I再加上后結(jié)點(diǎn)的索引長(zhǎng)度得到結(jié)果81,前結(jié)點(diǎn)的后向指針等于后結(jié)點(diǎn)的后向指針,得到如圖9B所示的鏈表結(jié)構(gòu)。
[0047]當(dāng)然,圖9A中在回收索引時(shí),也可采用釋放前結(jié)點(diǎn)的方法,其結(jié)果與釋放后結(jié)點(diǎn)的相同。
[0048]本發(fā)明的技術(shù)內(nèi)容及技術(shù)特征已揭示如上,然而熟悉本領(lǐng)域的技術(shù)人員仍可能基于本發(fā)明的教示及揭示而作種種不背離本發(fā)明精神的替換及修飾,因此,本發(fā)明保護(hù)范圍應(yīng)不限于實(shí)施例所揭示的內(nèi)容,而應(yīng)包括各種不背離本發(fā)明的替換及修飾,并為本專利申請(qǐng)權(quán)利要求所涵蓋。
【權(quán)利要求】
1.一種基于鏈表的索引分配方法,其特征在于:在以太網(wǎng)中創(chuàng)建保存所有可用索引的鏈表;鏈表中包括至少一段索引連續(xù)的索引段,每一索引段形成一個(gè)結(jié)點(diǎn),分配索引時(shí),從鏈表的頭開(kāi)始,如果第一個(gè)結(jié)點(diǎn)的索引長(zhǎng)度大于1,則把所述結(jié)點(diǎn)的索引長(zhǎng)度減1,起始索引加1,并把原來(lái)的起始索引返回;如果第一個(gè)結(jié)點(diǎn)的索引長(zhǎng)度等于1,則這個(gè)結(jié)點(diǎn)變?yōu)榭?,并將其釋放?br>
2.根據(jù)權(quán)利要求1所述的基于鏈表的索引分配方法,其特征在于:所述可用索引的結(jié)點(diǎn)通過(guò)所述雙向鏈表相串聯(lián)。
3.根據(jù)權(quán)利要求1所述的基于鏈表的索引分配方法,其特征在于:所述索引連續(xù)的索引段包括索引長(zhǎng)度為I的索引段。
4.一種基于鏈表管理的索引分配方法,其特征在于:在以太網(wǎng)中建立一張保存所有可用索引的鏈表;鏈表中包括至少一段索引連續(xù)的索引段,每一段索引段形成一個(gè)結(jié)點(diǎn);在回收目標(biāo)索引時(shí),遍歷鏈表,找到第一個(gè)起始索引大于回收目標(biāo)索引的結(jié)點(diǎn),回收目標(biāo)索引即在所述結(jié)點(diǎn)及其前一個(gè)結(jié)點(diǎn)間。
5.根據(jù)權(quán)利要求4所述的基于鏈表管理的索引分配方法,其特征在于:在回收索引時(shí), a)如目標(biāo)索引只與前結(jié)點(diǎn)相連,則將前結(jié)點(diǎn)的索引長(zhǎng)度加I; b)如目標(biāo)索引只與后結(jié)點(diǎn)相連,則將后結(jié)點(diǎn)起始索引減I; c)如目標(biāo)索引與前后結(jié)點(diǎn)都不相連,則創(chuàng)建一個(gè)新的結(jié)點(diǎn),該結(jié)點(diǎn)的起始索引為目標(biāo)索引,索引長(zhǎng)度為1,同時(shí)將該新結(jié)點(diǎn)的前后指針與前后結(jié)點(diǎn)進(jìn)行雙向指向; d)如目標(biāo)索引與前后結(jié)點(diǎn)都相連,則將后結(jié)點(diǎn)釋放,將前結(jié)點(diǎn)的索引長(zhǎng)度加I再加上后結(jié)點(diǎn)的索引長(zhǎng)度,并將指針雙向指向。
6.根據(jù)權(quán)利要求5所述的基于鏈表管理的索引分配方法,其特征在于:所述d)中,如目標(biāo)索引與前后結(jié)點(diǎn)都相連,也可將前結(jié)點(diǎn)釋放,將后結(jié)點(diǎn)的索引長(zhǎng)度加I再加上前結(jié)點(diǎn)的索引長(zhǎng)度,并將起始索引設(shè)為前結(jié)點(diǎn)的起始索引,并將指針雙向指向。
7.一種基于鏈表的索引分配裝置,其特征在于:包括鏈表,所述鏈表中包括以太網(wǎng)中所有的可用索引,所述可用索引包括至少一段索引連續(xù)的索引段,每一索引段形成一個(gè)結(jié)點(diǎn);所述每個(gè)結(jié)點(diǎn)包括指向前一個(gè)結(jié)點(diǎn)的前向指針和指向后一個(gè)非空結(jié)點(diǎn)的后向指針,以及本段索引的起始索引和索引長(zhǎng)度。
8.根據(jù)權(quán)利要求7所述的基于鏈表的索引分配裝置,其特征在于:所述起始索引是本段索引的第一個(gè)索引,所述索引長(zhǎng)度為本段索引的個(gè)數(shù)。
9.根據(jù)權(quán)利要求7所述的基于鏈表的索引分配裝置,其特征在于:所述索引連續(xù)的索引段包括索引長(zhǎng)度為I的索引段。
10.根據(jù)權(quán)利要求7所述的基于鏈表的索引分配裝置,其特征在于:當(dāng)所述后向指針指向的后一個(gè)結(jié)點(diǎn)為空時(shí),所述后向指針為空指針。
【文檔編號(hào)】G06F17/30GK103544203SQ201310290108
【公開(kāi)日】2014年1月29日 申請(qǐng)日期:2013年7月11日 優(yōu)先權(quán)日:2013年7月11日
【發(fā)明者】陶秋平, 周志洪, 何志川, 趙茂聰 申請(qǐng)人:盛科網(wǎng)絡(luò)(蘇州)有限公司