本發(fā)明涉及通信技術領域中隊列管理的相關技術,尤其涉及一種隊列存儲空間管理方法及裝置。
背景技術:
隨著網(wǎng)絡流量的飛速發(fā)展,用戶對數(shù)據(jù)產(chǎn)品的服務質(zhì)量(QoS,Quality of Service)要求越來越高,對QoS需要支持的隊列數(shù)、帶寬和報文存儲時間也提出了更高的要求,這就對隊列管理單元(QM,Queue Manager)的性能要求越來越高。
通常情況下,隊列管理包括入隊、出隊兩個基本操作。報文入隊時,根據(jù)報文包含的隊列號可以將報文存儲到對應的隊列存儲空間中,在報文被調(diào)度出隊時,從隊列存儲空間讀取入隊存儲的報文。
對于大容量的流量管理,一般都是把報文存儲在外部存儲器中,隨著存儲報文的外部存儲器越來越大,如何對外部存儲器進行緩存劃分和管理變得越來越重要。一般情況下,是將外部存儲器按照固定大小進行劃分,每個單元為一個Block塊,一個Block塊可以存儲512B或者其他固定大小的報文分片。每個Block都對應一個地址指針,通過指針指向報文分片存儲的地址。為了節(jié)省隨機存取存儲器RAM(RAM,Random Access Memory)資源,這些指針一般是通過鏈表進行管理的。
現(xiàn)有的隊列管理方法一般是基于鏈表的隊列管理方法。由于地址數(shù)量非常多,通常需要一個RAM來存放。隊列每調(diào)度出隊一個報文,都需要刷新這個隊列的頭指針,先從RAM中讀取隊列的下一個報文的地址,然后再將下一個報文的地址更新為隊列頭指針。這里,由于RAM的讀延遲比較大,因此頭指 針的刷新需要很多個時鐘周期,而在頭指針刷新完成之前,隊列不能發(fā)送下一個報文,這就嚴重影響隊列的出隊報文的速度。
由于當前的隊列存儲空間都比較大,所以鏈表信息一般都是存儲在片外的4倍數(shù)據(jù)比率(QDR,Quad Data Rate)存儲器里面或者2倍數(shù)據(jù)比率(DDR,Double Data Rate)存儲器中,QDR的讀寫延遲有8個時鐘周期左右,DDR的讀寫延遲更大,過高的讀寫延遲極大的限制了隊列管理性能的提升
技術實現(xiàn)要素:
有鑒于此,本發(fā)明實施例期望提供一種隊列存儲空間管理方法,解決了外部存儲器高讀寫延遲問題。
為達到上述目的,本發(fā)明的技術方案是這樣實現(xiàn)的:
本發(fā)明實施例提供了一種隊列存儲空間管理方法,所述方法包括:
創(chuàng)建指針組,所述指針組包括至少一個的報文指針域,每個報文指針域存儲一個報文指針;
通過所述指針組,對隊列存儲空間進行讀寫操作。
上述方案中,所述指針組中的報文指針域之間地址相互獨立。
上述方案中,所述通過所述報文指針組,對隊列存儲空間進行讀寫操作包括:
通過所述報文指針組,對隊列存儲空間進行空閑指針申請、隊列入隊、隊列出隊、空閑指針回收以及空閑指針鏈表存儲和隊列鏈表存儲操作。
上述方案中,所述通過指針組,對隊列存儲空間進行空閑指針申請包括:
判斷當前的指針組內(nèi)是否還有空閑指針;
當前指針組內(nèi)沒有空閑指針時,申請一個新的空閑指針組作為當前指針組,并讀取當前指針組中的空閑指針;
當前指針組內(nèi)有空閑指針時,讀取當前指針組中的空閑指針。
上述方案中,所述通過指針組,對隊列存儲空間進行隊列入隊操作包括:
將需要入隊的指針填充到所述指針組中的空閑指針中;
當所述指針組飽和、或相同隊列的入隊指針等待超時,將所述指針組進行隊列入隊操作。
上述方案中,所述通過指針組,對隊列存儲空間進行隊列出隊操作包括:
將需要出隊的指針寫入預出隊先入先出隊列,將所述預出隊先入先出隊列進行隊列出隊操作。
上述方案中,所述通過指針組,對隊列存儲空間進行空閑指針回收包括:
將隊列出隊操作釋放的出隊指針依次寫入指針組;
當所述指針組飽和時,將所述指針組進行空閑指針回收。
本發(fā)明實施例還提供了一種隊列存儲空間管理裝置,所述裝置包括:指針組創(chuàng)建單元、操作單元,其中,
所述指針組創(chuàng)建單元,用于創(chuàng)建指針組,所述指針組包括至少一個的報文指針域,每個報文指針域存儲一個報文指針;
所述操作單元,用于通過所述指針組,對隊列存儲空間進行讀寫操作。
上述方案中,所述操作單元具體用于:
通過所述報文指針組,對隊列存儲空間進行空閑指針申請、隊列入隊、隊列出隊、空閑指針回收以及空閑指針鏈表存儲和隊列鏈表存儲操作。
上述方案中,所述操作單元具體用于:
判斷當前的指針組內(nèi)是否還有空閑指針;
當前指針組內(nèi)沒有空閑指針時,申請一個新的空閑指針組作為當前指針組,并讀取當前指針組中的空閑指針;
當前指針組內(nèi)有空閑指針時,讀取當前指針組中的空閑指針。
上述方案中,所述操作單元具體用于:
將需要入隊的指針填充到所述指針組中的空閑指針中;
當所述指針組飽和、或相同隊列的入隊指針等待超時,將所述指針組進行隊列入隊操作。
上述方案中,所述操作單元具體用于:
將需要出隊的指針寫入預出隊先入先出隊列,將所述預出隊先入先出隊列 進行隊列出隊操作。
上述方案中,所述操作單元具體用于:
將隊列出隊操作釋放的出隊指針依次寫入指針組;
當所述指針組飽和時,將所述指針組進行空閑指針回收。
本發(fā)明實施例所提供的隊列存儲空間管理方法和裝置,先創(chuàng)建指針組,所述指針組包括至少一個的報文指針域,每個報文指針域存儲一個報文指針;再通過所述指針組,對隊列存儲空間進行讀寫操作。如此,在對隊列存儲空間進行入隊、出隊和空閑指針管理時,一次訪問外部存儲器得到能夠得到N報文指針,可供多次使用,從而能夠減少對外部存儲器的訪問次數(shù),解決了外部存儲器高讀寫延遲問題,提高了隊列管理單元的處理性能,節(jié)省了外部存儲器的讀寫次數(shù),降低了功耗。
附圖說明
圖1為本發(fā)明實施例指針組結(jié)構(gòu)示意圖;
圖2為本發(fā)明實施例隊列存儲空間管理方法流程示意圖;
圖3為本發(fā)明實施例空閑指針鏈表鏈接結(jié)構(gòu)示意圖;
圖4為本發(fā)明實施例隊列鏈表鏈接結(jié)構(gòu)示意圖;
圖5為本發(fā)明實施例對隊列存儲空間進行空閑指針申請方法流程示意圖;
圖6為本發(fā)明實施例對隊列存儲空間進行隊列入隊操作方法流程示意圖;
圖7為本發(fā)明實施例對隊列存儲空間進行隊列出隊操作方法流程示意圖;
圖8為本發(fā)明實施例隊列預出隊方法流程示意圖;
圖9為本發(fā)明實施例對隊列存儲空間進行空閑指針回收方法流程示意圖;
圖10為本發(fā)明實施例出隊指針拼接方法示意圖;
圖11為本發(fā)明實施例隊列存儲空間管理裝置結(jié)構(gòu)示意圖。
具體實施方式
在本發(fā)明實施例中,先創(chuàng)建指針組,其中,所述指針組包括至少一個的報 文指針域,每個報文指針域存儲一個報文指針;再通過所述指針組,對隊列存儲空間進行讀寫操作。
本發(fā)明實施例中,所述指針組結(jié)構(gòu)示意圖如圖1所示,在進行隊列存儲空間管理時,不使用報文真實的指針進行管理,使用指針組進行管理,指針組不作為實際的報文存儲指針,只是作為存儲報文指針的地址。報文存儲的指針按照入隊順序依次存儲在指針組的報文指針域里面。
具體的,所述指針組中包含的報文指針域的數(shù)量在創(chuàng)建指針組時確定,在通過指針組對隊列存儲空間進行讀寫操作時,所述指針組中的報文指針域數(shù)目不變。
本發(fā)明實施例中,一個指針組可以包括N個報文指針域,存儲N個實際的報文描述符,報文描述符包括報文的實際指針、存儲器bank信息等,N個實際的報文指針域地址之間相互獨立,沒有任何地址關聯(lián)關系。對隊列存儲空間進行入隊和出隊寫操作時,以指針組為單位,一次讀出或者寫入一個指針組;由于指針組包括多個實際的包描述符,對應N個實際的報文指針,因此在對隊列存儲空間進行入隊、出隊和空閑指針管理時,一次訪問外部存儲器得到能夠得到N報文指針,可供多次使用,從而能夠減少對外部存儲器的訪問次數(shù)。
下面結(jié)合附圖及具體實施例,對本發(fā)明實施例所述隊列存儲空間管理方法進行進一步詳細說明,圖2為本發(fā)明實施例隊列存儲空間管理方法流程示意圖,如圖2所示本發(fā)明實施例中所述隊列存儲空間管理方法包括以下步驟:
步驟201:創(chuàng)建指針組;
其中,所述指針組包括至少一個的報文指針域,每個報文指針域存儲一個報文指針;所述指針組中的報文指針域之間地址相互獨立,不存在地址關聯(lián)關系。
具體的,在首次進行指針組初始化的時候,指針組里面的內(nèi)容全部是空閑指針,按照順序進行初始化,指針組在經(jīng)過多次出隊回收之后,指針組存儲的實際指針全部打亂,實際指針域中的指針之間不再存在關聯(lián)關系。
步驟202:通過所述指針組,對隊列存儲空間進行讀寫操作;
其中,通過所述報文指針組,對隊列存儲空間進行空閑指針申請、隊列入隊、隊列出隊、空閑指針回收以及空閑指針鏈表存儲和隊列鏈表存儲操作。
本發(fā)明實施例中,所述對隊列存儲空間進行空閑指針鏈表存儲時,空閑指針鏈表通過指針組進行鏈接,一個指針組存儲N個實際的空閑指針,這些實際的空閑指針之間沒有任何關系,指針組只是作為存儲實際空閑指針的地址。空閑指針鏈表的頭尾虛擬指針存儲在芯片內(nèi),空閑指針鏈表頭節(jié)點、尾節(jié)點和中間節(jié)點都存儲在外部存儲器中。每個指針組都存有N個實際的空閑指針,空閑指針鏈表鏈接結(jié)構(gòu)示意圖如圖3所示。
本發(fā)明實施例中,所述對隊列存儲空間進行隊列鏈表存儲操作時,基于隊列的指針鏈表也使用指針組進行鏈接,圖4為本發(fā)明實施例隊列鏈表鏈接結(jié)構(gòu)示意圖;每個隊列都有各自獨立的虛擬鏈表,一個指針組存儲N個實際的隊列指針,指針組只是作為存儲實際隊列指針的地址;隊列狀態(tài)表的頭尾虛擬指針存儲在芯片內(nèi),隊列鏈表頭節(jié)點、尾節(jié)點和中間節(jié)點都存儲在外部存儲器中。每個隊列鏈表都有獨立的非空狀態(tài)信息,存儲在芯片內(nèi),用來指示隊列狀態(tài)是否非空,只有非空才進行隊列狀態(tài)更新。
本發(fā)明實施例中,所述通過指針組,對隊列存儲空間進行空閑指針申請包括:判斷當前的指針組內(nèi)是否還有空閑指針;當前指針組內(nèi)沒有空閑指針時,申請一個新的空閑指針組作為當前指針組,并讀取當前指針組中的空閑指針;當前指針組內(nèi)有空閑指針時,讀取當前指針組中的空閑指針。
圖5為本發(fā)明實施例對隊列存儲空間進行空閑指針申請方法流程示意圖,如圖5所示,本發(fā)明實施例中,所述對隊列存儲空間進行空閑指針申請包括以下步驟:
步驟A1:接收到空閑指針申請請求;
步驟A2:判斷當前的指針組內(nèi)是否還有空閑指針;當前指針組內(nèi)沒有空閑指針時,執(zhí)行步驟A3;否則,執(zhí)行步驟A4;
步驟A3:申請一個新的空閑指針組作為當前指針組,并執(zhí)行步驟A4;
當前指針組內(nèi)沒有空閑指針時,即當前的虛擬指針耗盡時,則申請一個新 的空閑指針組作為當前指針組,重新發(fā)起讀空閑虛擬指針先入先出隊列FIFO;具體的,一次從外部存儲器中讀一個指針組針,使用下一個指針組nextptr更新頭指針headptr,申請到N個實際空閑指針存入先入先出隊列中,以備隊列實際入隊使用。
步驟A4:讀取當前指針組中的空閑指針。
具體的,本步驟中,當前的指針組內(nèi)還有空閑指針時,即當前指針組沒有耗盡,則使用當前虛擬指針中剩余的空閑指針,進行空閑鏈表更新操作;使用當前的指針組的頭指針讀外部存儲器,獲得當前指針組的內(nèi)容和下一個指針組nextptr,使用指針組的nextptr更新空閑隊列狀態(tài)表頭指針headptr,讀取的當前指針組里面的N個實際空閑指針存入指針組FIFO中,作為隊列實際入隊使用。上電初始化時候,先入先出隊列FIFO為空,一直進行虛擬空閑指針的更新,直到將空閑指針先入先出FIFO填到將滿。
本發(fā)明實施例中,所述通過指針組,對隊列存儲空間進行隊列入隊操作包括:將需要入隊的指針填充到所述指針組中的空閑指針中;當所述指針組飽和、或相同隊列的入隊指針等待超時,將所述指針組進行隊列入隊操作。
圖6為本發(fā)明實施例對隊列存儲空間進行隊列入隊操作方法流程示意圖,如圖6所示,本發(fā)明實施例中,所述對隊列存儲空間進行隊列入隊操作包括以下步驟:
步驟B1:接收到入隊指針;
步驟B2:將需要入隊的指針填充到所述指針組中的空閑指針中;
本步驟中,一個指針組中只能存儲一個隊列的入隊指針,存儲的實際的入隊指針之間根據(jù)隊列入隊的順序進行排序,順序不能錯亂,否則會導致報文亂序。
步驟B3:判斷當前指針組是否飽和;當當前指針組沒有飽和時,執(zhí)行步驟B4;否則,執(zhí)行步驟B6;
步驟B4:繼續(xù)等待相同隊列的入隊指針;
步驟B5:判斷相同隊列的入隊指針是否等待超時;當相同隊列的入隊指針 等待超時,執(zhí)行步驟B6;當相同隊列的入隊指針沒有等待超時,即接收到相同隊列的入隊指針時,返回步驟B2;
在步驟B3-B5中,當接收到報文的入隊指針報文進入后,判斷當前虛指針是否還有空閑指針域可用,如果有則進行入隊指針組拼接,然后判斷當前指針組的指針域是否飽和,如果沒有飽和,則繼續(xù)等待下一個相同隊列的指針;預設時間內(nèi),如果沒有收到下一個相同隊列的指針,則認為等到超時,如果達到超時條件,即使指針組沒有拼接飽和,也要進行強制入隊,同時記錄指針組中的指針個數(shù)。
步驟B6:將所述指針組發(fā)起隊列入隊操作;
步驟B7:更新當前節(jié)點鏈表的實際指針和下一個指針組nextptr;
步驟B8:通過所述指針組寫外部存儲器;
步驟B9:更新當前入隊指針組為尾指針tailptr;
步驟B10:更新隊列狀態(tài)表;
其中,步驟B6-B10所述將指針組進行隊列入隊操作的過程中,使用隊列狀態(tài)的尾指針tailptr作為地址寫外部存儲器,同時更新入隊的nextptr為當前隊列的tailptr指針。
本發(fā)明實施例中,當指針組入隊的時候,使用入隊的當前指針組作為地址寫外部存儲器,更新當前節(jié)點鏈表的實際指針和下一個指針組nextptr,每個隊列在入隊進行指針組拼接的時候都需要預取2個指針組,當前指針入隊的時候,需要提供下一個指針組,這樣做的好處是可以減少一次存儲在外部存儲器中的鏈表的讀,鏈表更新同時更新當前入隊虛擬指針為當前隊列的尾指針tailptr。同時更新虛擬隊列狀態(tài)表的非空狀態(tài)為非空。
本發(fā)明實施例中,所述通過指針組,對隊列存儲空間進行隊列出隊操作包括:將需要出隊的指針組成指針組,將所述指針組進行隊列出隊操作。
圖7為本發(fā)明實施例對隊列存儲空間進行隊列出隊操作方法流程示意圖,如圖7所示,本發(fā)明實施例中,所述對隊列存儲空間進行隊列出隊操作包括以下步驟:
步驟C1:將需要出隊的指針寫入預出隊先入先出隊列;
本發(fā)明實施例中,在預出隊過程中,首次按需要進行預出隊處理,將需要出隊的指針寫入預出隊先入先出隊列;圖8為本發(fā)明實施例隊列預出隊方法流程示意圖,如圖8所示,包括一下步驟:
步驟D1:確定開始預出隊過程;
步驟D2:判斷隊列狀態(tài)表狀態(tài)變是否為非空;當隊列狀態(tài)表狀態(tài)不是非空時,即隊列狀態(tài)為空,則執(zhí)行步驟D3;否則,執(zhí)行步驟D4;
本步驟中,當隊列狀態(tài)表狀態(tài)變?yōu)榉强諘r候,且報文描述符(PD,Pack Descriptor)先入先出隊列FIFO沒有寫滿的時候,即可達到隊列Queue預出隊條件。
步驟D3:等待入隊過程,并在報文指針入隊后,返回步驟D1;
本步驟中,當隊列狀態(tài)為空時,無法進行出隊操作。
步驟D4:根據(jù)隊列頭指針headptr讀取外部存儲器;
步驟D5:接收外部存儲器返回的數(shù)據(jù);
步驟D6:更新隊列狀態(tài)表;
步驟D4-D6中,根據(jù)每個隊列Queue頭指針headptr,對外部存儲器進行讀取,得到當前的N個實際的出隊指針;
步驟D7:將報文指針寫入PD/單元描述符(CD,Cell Descriptor)先入先出隊列FIFO中;
本步驟中,如果屬于報文首指針,則寫入預出隊PD FIFO中,如果屬于報文身指針,寫入預出隊CD FIFO中;同時更新下一指針組nextptr為當前隊列的虛擬頭指針。
步驟D8:更新下一個指針組nextptr為當前隊列的頭指針;
如此,完成隊列預出隊過程;
步驟C2:將所述預出隊先入先出隊列進行隊列出隊操作;
當預出隊PD FIFO非空時候,則根據(jù)隊列狀態(tài)調(diào)度出預出隊PD FIFO后,發(fā)起真正的出隊請求。在隊列出隊操作過程中,基于預出隊PD FIFO,獲取到 報文首指針,如果還有報文身信息,則繼續(xù)讀取預出隊CD FIFO,得到隊列的所有指針。同時進行指針的拼接回收,從外部存儲器中讀出真正的報文。
本發(fā)明實施例中,,所述通過指針組,對隊列存儲空間進行空閑指針回收操作包括:將隊列出隊操作釋放的空閑指針依次寫入指針組;當所述指針組飽和時,將所述指針組進行空閑指針回收。
圖9為本發(fā)明實施例對隊列存儲空間進行空閑指針回收方法流程示意圖,如圖9所示,本發(fā)明實施例中,所述對隊列存儲空間進行空閑指針回收包括以下步驟:
步驟E1:將隊列出隊操作釋放的出隊指針依次寫入指針組;
步驟E2:判斷所述指針組是否飽和;當所述指針組飽和時,執(zhí)行步驟E4,否則,執(zhí)行步驟E3;
步驟E3:等待出隊指針;并返回步驟E1;
步驟E1-E3中,將每個Queue出隊釋放的實際出隊指針,依次寫入待回收的指針組各個域,拼滿之后才進行真正的回收;圖10為本發(fā)明實施例出隊指針拼接方法示意圖,如圖10所示,q0、q1、q2分別表示不同的隊列,ptrA、ptrB、ptrC分別表示不同的指針,在隊列出隊操作釋放的出隊指針依次寫入指針組的過程中,不對隊列進行區(qū)分,任意隊列出隊指針都拼接到一個指針組里面,因此指針組里面的實際指針之間沒有任何關聯(lián)性,如此,可以及時回收空閑指針,不用基于隊列的等待拼接。
步驟E4:進行空閑指針回收;
步驟E5:通過空閑隊列狀態(tài)的尾指針tailptr讀取外部存儲器;
步驟E6:通過所述指針組寫外部存儲器的下一個指針組域;
步驟E7:通過所述指針組更新狀態(tài)表尾指針tailptr;
在步驟E4-E7中,出隊的指針是滿一個指針組時,才進行真正的指針回收。
本發(fā)明實施例中,需要一個出隊待釋放指針的先入先出隊列FIFO來存儲實際指針預出隊產(chǎn)生的待釋放的指針組;因為虛擬指針本身沒有任何的空閑指針,因此,指針組釋放還不能進行回收,需要等待出隊的指針釋放后,兩者進 行關聯(lián)才可以真正的回收。出隊指針拼滿一個指針組后,從出隊待釋放指針組先入先出隊列FIFO中讀出一個指針組進行回收;回收過程中,首先使用空閑隊列狀態(tài)表的尾指針tailptr去讀取外部存儲器,獲得當前尾指針節(jié)點的內(nèi)容,然后把待回收的指針組回寫到當前尾部指針組的下一個指針組nextptr域,完成空閑虛擬鏈表的更新,然后用待回收的指針組更新隊列狀態(tài)表的尾部指針tailptr域,至此,指針回收動作全部完成。
本發(fā)明實施例還提供了一種隊列存儲空間管理裝置,圖11為本發(fā)明實施例隊列存儲空間管理裝置結(jié)構(gòu)示意圖,如圖11所示,本發(fā)明實施例隊列存儲空間管理裝置包括:指針組創(chuàng)建單元111、操作單元112,其中,
所述指針組創(chuàng)建單元111,用于創(chuàng)建指針組,所述指針組包括至少一個的報文指針域,每個報文指針域存儲一個報文指針;
本發(fā)明實施例中,所述指針組中的報文指針域之間地址相互獨立,不存在地址關聯(lián)關系。
具體的,在首次進行指針組初始化的時候,指針組里面的內(nèi)容全部是空閑指針,按照順序進行初始化,指針組在經(jīng)過多次出隊回收之后,指針組存儲的實際指針全部打亂,實際指針域中的指針之間不再存在關聯(lián)關系。
所述操作單元112,用于通過所述指針組,對隊列存儲空間進行讀寫操作;
其中,所述操作單元112具體用于:通過所述報文指針組,對隊列存儲空間進行空閑指針申請、隊列入隊、隊列出隊、空閑指針回收以及空閑指針鏈表存儲和隊列鏈表存儲操作。
本發(fā)明實施例中,所述操作單元112對隊列存儲空間進行空閑指針鏈表存儲時,空閑指針鏈表通過指針組進行鏈接,一個指針組存儲N個實際的空閑指針,這些實際的空閑指針之間沒有任何關系,指針組只是作為存儲實際空閑指針的地址??臻e指針鏈表的頭尾虛擬指針存儲在芯片內(nèi),空閑指針鏈表頭節(jié)點、尾節(jié)點和中間節(jié)點都存儲在外部存儲器中。每個指針組都存有N個實際的空閑指針。
本發(fā)明實施例中,所述操作單元112對隊列存儲空間進行隊列鏈表存儲操 作時,基于隊列的指針鏈表也使用指針組進行鏈接,每個隊列都有各自獨立的虛擬鏈表,一個指針組存儲N個實際的隊列指針,指針組只是作為存儲實際隊列指針的地址;隊列狀態(tài)表的頭尾虛擬指針存儲在芯片內(nèi),隊列鏈表頭節(jié)點、尾節(jié)點和中間節(jié)點都存儲在外部存儲器中。每個隊列鏈表都有獨立的非空狀態(tài)信息,存儲在芯片內(nèi),用來指示隊列狀態(tài)是否非空,只有非空才進行隊列狀態(tài)更新。
本發(fā)明實施例中,所述操作單元112具體用于:判斷當前的指針組內(nèi)是否還有空閑指針;當前指針組內(nèi)沒有空閑指針時,申請一個新的空閑指針組作為當前指針組,并讀取當前指針組中的空閑指針;當前指針組內(nèi)有空閑指針時,讀取當前指針組中的空閑指針。
具體的,當前指針組內(nèi)沒有空閑指針時,即當前的虛擬指針耗盡時,則所述操作單元112申請一個新的空閑指針組作為當前指針組,重新發(fā)起讀空閑虛擬指針先入先出隊列FIFO;具體的,所述操作單元112一次從外部存儲器中讀一個指針組針,使用下一個指針組nextptr更新頭指針headptr,申請到N個實際空閑指針存入先入先出隊列中,以備隊列實際入隊使用。
當前的指針組內(nèi)還有空閑指針時,即當前指針組沒有耗盡,則所述操作單元112使用當前虛擬指針中剩余的空閑指針,進行空閑鏈表更新操作;使用當前的指針組的頭指針讀外部存儲器,獲得當前指針組的內(nèi)容和下一個指針組nextptr,使用指針組的nextptr更新空閑隊列狀態(tài)表頭指針headptr,讀取的當前指針組里面的N個實際空閑指針存入指針組FIFO中,作為隊列實際入隊使用。上電初始化時候,先入先出隊列FIFO為空,一直進行虛擬空閑指針的更新,直到將空閑指針先入先出FIFO填到將滿。
本發(fā)明實施例中,所述操作單元112具體用于:將需要入隊的指針填充到所述指針組中的空閑指針中;當所述指針組飽和、或相同隊列的入隊指針等待超時,將所述指針組進行隊列入隊操作。
本發(fā)明實施例中,一個指針組中只能存儲一個隊列的入隊指針,存儲的實際的入隊指針之間根據(jù)隊列入隊的順序進行排序,順序不能錯亂,否則會導致 報文亂序。
在步驟B3-B5中,當接收到報文的入隊指針報文進入后,所述操作單元112判斷當前虛指針是否還有空閑指針域可用,如果有則進行入隊指針組拼接,然后判斷當前指針組的指針域是否飽和,如果沒有飽和,則繼續(xù)等待下一個相同隊列的指針;預設時間內(nèi),如果沒有收到下一個相同隊列的指針,則認為等到超時,如果達到超時條件,即使指針組沒有拼接飽和,也要進行強制入隊,同時記錄指針組中的指針個數(shù)。
在將指針組進行隊列入隊操作的過程中,使用隊列狀態(tài)的尾指針tailptr作為地址寫外部存儲器,同時更新入隊的nextptr為當前隊列的tailptr指針。
本發(fā)明實施例中,所述操作單元112具體用于:將需要出隊的指針寫入預出隊先入先出隊列,將所述預出隊先入先出隊列進行隊列出隊操作。
具體的,當隊列狀態(tài)表狀態(tài)變?yōu)榉强諘r候,且PD先入先出隊列FIFO沒有寫滿的時候,即可達到隊列Queue預出隊條件。
當預出隊PD FIFO非空時候,則根據(jù)隊列狀態(tài)調(diào)度出預出隊PD FIFO后,發(fā)起真正的出隊請求。在隊列出隊操作過程中,基于預出隊PD FIFO,獲取到報文首指針,如果還有報文身信息,則繼續(xù)讀取預出隊CD FIFO,得到隊列的所有指針。同時進行指針的拼接回收,從外部存儲器中讀出真正的報文。
本發(fā)明實施例中所述操作單元112具體用于:將隊列出隊操作釋放的出隊指針依次寫入指針組;當所述指針組飽和時,將所述指針組進行空閑指針回收。
具體的,所述操作單元112將每個Queue出隊釋放的實際出隊指針,依次寫入待回收的指針組各個域,拼滿之后才進行真正的回收;在隊列出隊操作釋放的出隊指針依次寫入指針組的過程中,不對隊列進行區(qū)分,任意隊列出隊指針都拼接到一個指針組里面,因此指針組里面的實際指針之間沒有任何關聯(lián)性,如此,可以及時回收空閑指針,不用基于隊列的等待拼接。
本發(fā)明實施例中,需要一個出隊待釋放指針的先入先出隊列FIFO來存儲實際指針預出隊產(chǎn)生的待釋放的指針組;因為虛擬指針本身沒有任何的空閑指針,因此,指針組釋放還不能進行回收,需要等待出隊的指針釋放后,兩者進 行關聯(lián)才可以真正的回收。出隊指針拼滿一個指針組后,從出隊待釋放指針組先入先出隊列FIFO中讀出一個指針組進行回收;回收過程中,首先使用空閑隊列狀態(tài)表的尾指針tailptr去讀取外部存儲器,獲得當前尾指針節(jié)點的內(nèi)容,然后把待回收的指針組回寫到當前尾部指針組的下一個指針組nextptr域,完成空閑虛擬鏈表的更新,然后用待回收的指針組更新隊列狀態(tài)表的尾部指針tailptr域,至此,指針回收動作全部完成。
圖11中所示的隊列存儲空間管理裝置中的各處理單元的實現(xiàn)功能,可參照前述隊列存儲空間管理方法的相關描述而理解。本領域技術人員應當理解,圖11所示的隊列存儲空間管理裝置中各處理單元的功能可通過運行于處理器上的程序而實現(xiàn),也可通過具體的邏輯電路而實現(xiàn),比如:可由中央處理器(CPU)、微處理器(MPU)、數(shù)字信號處理器(DSP)、或現(xiàn)場可編程門陣列(FPGA)實現(xiàn)。
在本發(fā)明所提供的幾個實施例中,應該理解到,所揭露的方法、裝置及系統(tǒng),可以通過其他的方式實現(xiàn)。以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,如:多個單元或組件可以結(jié)合,或可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另外,所顯示或討論的各組成部分相互之間的通信連接可以是通過一些接口,設備或單元的間接耦合或通信連接,可以是電性的、機械的或其他形式的。
上述作為分離部件說明的單元可以是、或也可以不是物理上分開的,作為單元顯示的部件可以是、或也可以不是物理單元,即可以位于一個地方,也可以分布到多個網(wǎng)絡單元上;可以根據(jù)實際的需要選擇其中的部分或全部單元來實現(xiàn)本實施例方案的目的。
另外,在本發(fā)明各實施例中的各功能單元可以全部集成在一個處理單元中,也可以是各單元分別單獨作為一個單元,也可以兩個或兩個以上單元集成在一個單元中;上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用硬件加軟件功能單元的形式實現(xiàn)。
本領域普通技術人員可以理解:實現(xiàn)上述方法實施例的全部或部分步驟可以通過程序指令相關的硬件來完成,前述的程序可以存儲于計算機可讀取存儲介質(zhì)中,該程序在執(zhí)行時,執(zhí)行包括上述方法實施例的步驟;而前述的存儲介質(zhì)包括:移動存儲設備、只讀存儲器(ROM,Read-Only Memory)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
或者,本發(fā)明實施例上述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,也可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明實施例的技術方案本質(zhì)上或者說對現(xiàn)有技術做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設備(可以是個人計算機、服務器、或者網(wǎng)絡設備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分。而前述的存儲介質(zhì)包括:移動存儲設備、ROM、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
本發(fā)明是實例中記載的隊列存儲空間管理方法、裝置只以上述實施例為例,但不僅限于此,本領域的普通技術人員應當理解:其依然可以對前述各實施例所記載的技術方案進行修改,或者對其中部分或者全部技術特征進行等同替換;而這些修改或者替換,并不使相應技術方案的本質(zhì)脫離本發(fā)明各實施例技術方案的范圍。
以上所述僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。