專利名稱:隊列調度系統及方法
技術領域:
本發明涉及流量管理技術領域,具體涉及隊列調度系統及方法。
背景技術:
隨著IP網絡上新應用的不斷出現,對IP網絡的服務質量也提出了新的 要求,例如IP語音(VoTP, Voice over IP)等實時業務就對報文的傳輸延遲 提出了較高要求,如果報文傳送延時太長,將是用戶所不能接受的。為了支 持具有不同服務需求的語音、視頻以及數據等業務,要求網絡能夠區分出不 同的業務,進而為之提供相應的服務。為此,服務質量(QoS, Quality of Service )技術應運而生。而在高端交換機和路由器中,QoS特性可以通過流 識別分類、流策略、隊列管理和優先級映射等處理實現。隨著網絡帶寬的不 斷增長以及多業務承載的運營級需求,高端交換機和路由器在QOS處理中 都采用硬件分布式處理。
圖1為基本的高端交換機和路由器的硬件架構圖,如圖l所示,其中, Framer/MAC/PHY模塊完成出接口的適配;PE模塊完成流查找轉發和流分 類識別處理;流量管理(TM, Traffic Management)才莫塊完成流量管理,即 QoS處理中隊列調度和流量監控等操作;交換網適配(FA)模塊完成內部 交換網的適配,如內部報文切片、板間流量管理等;FABRIC即為交換網架 構,完成報文交換。
圖2為現有的TM模塊的內部通用架構,如圖2所示,其中,IIF模塊 用于接收并緩存報文,同時將PE模塊的報文解析結果送給入隊模塊進行處 理。入隊模塊根據選擇的隊列向隊列管理模塊(QM, Queue Management) 申請入隊,并完成入隊的隊列擁塞控制檢查;如果為多播處理則完成多播入隊復制。出隊模塊則根據端口發送狀態向QM模塊申請某個隊列的報文出 隊,同時完成出隊的隊列調度和各個隊列的流量整形或流量監管。
圖3為現有的TM模塊進行隊列調度的框圖,如圖3所示,出口調度往 往基于流、優先級和端口進行三級調度。調度一般采用前向隊列狀態判斷, 后向隊列調度的方式,即隊列狀態逐級向前提供,各級判斷是否有報文允許 調度;同時輪詢本級隊列以決定哪個隊列輸出,并逐級向后申請調度。 圖4為現有的入隊處理的流程圖,如圖4所示,其具體步驟如下 步驟401:入隊模塊為每個流設置一個隊列,保存流ID與隊列號的對 應關系。
步驟402:入隊模塊接收報文,根據報文中的流ID,找到流ID對應的 隊列m。
步驟403:入隊模塊從入隊參數表中讀取隊列m的參數,如入隊算法等。
步驟404:入隊模塊采用入隊算法如加權隨機早期檢測(WRED, Weighted Random Early Detection ) /尾丟棄(TD, Tail Drop )算法進行計算。 步驟405:入隊模塊根據計算結果,判斷是否允許報文入隊列m,若是, 執行步驟407;否則,執行步驟406。
步驟406:入隊模塊丟棄該報文,本流程結束。 步驟407:入隊模塊向QM模塊發送攜帶隊列號m的入隊請求。 步驟408: QM模塊接收入隊請求,將報文放入隊列m中,并更新自身 保存的隊列m的參數,如隊列m的長度、空滿狀態等。
QM模塊維護各隊列的地址管理、長度管理、空滿狀態管理等,并根據 入隊、出隊請求更新隊列參數。
圖5為現有的出隊列調度的流程圖,如圖5所示,其具體步驟如下 步驟501:預先根據優先級將隊列劃分成多個調度組,對于每個調度組, QM模塊將每個調度組內各個隊列的空滿狀態通知第一級調度器;根據每個 調度組內的各個隊列的空滿狀態得到每個調度組的空滿狀態,將每個調度組的空滿狀態通知第二級調度器,根據每個調度組的空滿狀態確定整個調度隊 列的空滿狀態,將整個調度隊列的空滿狀態通知第三級調度器。 每個優先級對應 一 個調度組。
若一個調度組內的所有隊列都為空,則該調度組為空;只要一個調度組 內有任意一個隊列不為空,則該調度組為滿。若所有調度組都為空,則整個 調度隊列為空,只要有一個調度組不為空,則整個調度隊列為滿。
步驟502:出隊模塊的第三級調度器對端口進行輪詢,設輪詢結果為端 口 p,將輪詢結果發送給第二級調度器。
步驟503:出隊模塊的第二級調度器接收第三級調度器發來的輪詢結果, 根據QM模塊發來的各調度組的空滿狀態,對各調度組進行基于優先級的輪 詢,設輪詢結果為調度組q,將輪詢結果發送給第一級調度器。
步驟504:第一級調度器接收第二級調度器發來的輪詢結果,根據QM 模塊發來的調度組q中的各隊列的空滿狀態,對調度組q中的所有隊列進行 輪詢,設輪詢結果為隊列r,從出隊參數表中讀取調度算法,采用該調度算 法如修正的差額循環(MDRR, Modified Deficit Round Robin )和/或嚴格 優先級(SP, Strict Priority)算法對隊列r進行調度,將調度結果發送給流 量監管才莫塊如約定訪問速率(CAR, Committed Access Rate)模塊。
步驟505:流量監管模塊判斷是否允許包發送,若是,執行步驟507; 否則,執行步驟506。
步驟506:出隊模塊更新隊列r的調度參數,如已調度長度等,本流 程結束。
步驟507:流量監管模塊向出隊模塊發送允許指示,出隊模塊向QM模 塊發送攜帶隊列號r的出隊請求。
步驟508: QM模塊接收出隊請求,從隊列r中讀取一個包,將該包發 送給出隊模塊,同時更新自身保存的隊列r的參數,如隊列r的長度、空 滿狀態等。
步驟509:出隊模塊將包從端口 p發送出去。從圖5所示流程可以看出出隊模塊在進行完基于優先級的輪詢得到輪 詢結果調度組q后,需要對調度組q進行輪詢。當調度組q中的隊列越多, 實現輪詢處理所需的硬件邏輯的級數越深,邏輯資源開銷越大。而,高端路 由器和交換機的某些應用對業務處理能力要求較高,例如作為匯聚設備的 交換機要求提供高性能多業務處理能力的流量監管,對帶寬要求較高,如需 要支持單向IOG甚至40G的處理能力,同時對業務接入QoS要求也較高, 如要求對1K個甚至以上用戶的多業務如IP語音(VOIP, Voice Over IP )、 虛擬專網(VPN, Virtual Private Network)的調度等,這樣,會導致隊列的 數量較多,邏輯資源開銷較大,甚至,當隊列過多時,會無法完成輪詢。
發明內容
本發明提供隊列調度系統及方法,以減少硬件邏輯資源開銷。
本發明的技術方案是這樣實現的
一種隊列調度系統,包括
入隊模塊,接收報文,找到報文的流ID對應的隊列,若允許報文入該隊列, 向入口調度模塊發送攜帶隊列標識的入隊通知;
入口調度模塊,接收入隊通知,若發現所述隊列標識對應的隊列為空,則 將該隊列放入所屬調度組的備份隊列尾;
出隊模塊,進行基于端口的輪詢和基于優先級的輪詢,若發現輪詢到的調 度組的工作隊列為空,將該調度組的備份隊列轉為工作隊列;對輪詢到的調度 組的工作隊列中的第一個隊列進行調度,調度完畢,判斷是否需要結束該隊列 的本輪調度,若是,將該隊列放入所屬調度組的備份隊列尾;否則,將該隊列 重載入所屬調度組的工作隊列尾。
所述系統進一步包括調度寄存器設置模塊,用于為每個調度組設置一個 調度寄存器;
且,所述出隊模塊進一步用于,在判定不需要結束該隊列的本輪調度之后, 若發現該隊列為所屬調度組的工作隊列中的最后一個隊列,則將該隊列放入所屬調度組的調度寄存器;在進行基于端口的輪詢和基于優先級的輪詢之后若發 現輪詢到的調度組的調度寄存器中存在隊列,則對該調度寄存器中的隊列進行 調度。
所述調度寄存器設置模塊進一步用于,為每個調度寄存器設置一個有效標
志,并初始化該標志指示"無效',;
所述出隊模塊進一步用于,在將該隊列放入所屬調度組的調度寄存器之后, 將該調度組寄存器的有效標志設置為指示"有效";若發現輪詢到的調度組的調 度寄存器的有效標志指示"有效",則確定輪詢到的調度組的調度寄存器中存在 隊列;在對該調度寄存器中的隊列進行調度之前,從調度寄存器中取出隊列, 將調度寄存器的有效標志更改為指示"無效"。
所述出隊模塊進一步用于,在調度完畢時,發現調度完畢的隊列為空,則 不將該隊列放入工作隊列,也不將該隊列放入備份隊列。
所述系統進一步包括
流量管理QM模塊,用于維護每個隊列的包總數;當接收到入隊請求時, 將該請求中攜帶的隊列標識對應隊列的包總數加1;當接收到出隊請求時,將 該請求中的隊列標識對應隊列的包總數減1;
且,所述入口調度模塊進一步用于,在將該隊列放入所屬調度組的備份隊 列尾時,向QM模塊發送攜帶隊列標識的入隊請求;在接收入隊通知后,從QM 模塊獲取該通知中的隊列標識對應的包總數,以用于判斷該隊列是否為空;
且,所述出隊模塊進一步用于,在調度完畢時,向QM模塊發送攜帶隊列 標識的出隊請求。
一種隊列調度方法,將每個調度組的隊列劃分為工作隊列和備份隊列兩類, 該方法包4舌
接收報文,找到報文的流ID對應的隊列,若發現該隊列為空,則將該隊列 放入該隊列所屬調度組的備盼隊列尾;
進行基于端口的輪詢和基于優先級的輪詢,若發現輪詢到的調度組的工作 隊列為空,將該調度組的備份隊列轉為工作隊列;對輪詢到的調度組的工作隊列中的第一個隊列進行調度,調度完畢,判斷是否需要結束該隊列的本輪調度, 若是,將該隊列放入所屬調度組的備份隊列尾;否則,將該隊列重載入所屬調 度組的工作隊列尾。
所述方法進一步包括預先為每個調度組設置一個調度寄存器, 所述判定需要結束該隊列的本輪調度之后進一步包括判斷該隊列是否為
所屬調度組的工作隊列中的最后一個隊列,若是,將該隊列放入所屬調度組的
調度寄存器;
且,所述進行基于端口的輪詢和基于優先級的輪詢之后進一步包括判斷 輪詢到的調度組的調度寄存器中是否存在隊列,若是,對該調度寄存器中的隊 列進行調度;否則,執行所述對輪詢到的調度組的工作隊列中的第 一個隊列進 行調度的動作。
所述預先為每個調度組設置一個調度寄存器進一步包括為每個調度寄存 器設置一個有效標志,并初始化該標志指示"無效";
所述將該隊列放入所屬調度組的調度寄存器之后進一步包括將該調度組 寄存器的有效標志設置為指示"有效";
且,所述判斷輪詢到的調度組的調度寄存器中是否存在隊列為判斷輪詢 到的調度組的調度寄存器的有效標志是否指示"有效",若是,確定輪詢到的調 度組的調度寄存器中存在隊列;
且,所述對該調度寄存器中的隊列進行調度之前進一步包括從調度寄存 器中取出隊列,將調度寄存器的有效標志更改為指示"無效"。
所述將該隊列放入該隊列所屬調度組的備份隊列尾之后進一步包括將隊 列的包總l丈加1;
所述調度完畢之后進一步包括將調度完畢的隊列的包總數減1; 所述發現該隊列為空為發現隊列的包總數為0。
所述調度完畢之后進一步包括判斷該隊列是否為空,若是,不將該隊 列放入工作隊列,也不將該隊列放入備份隊列;否則,執行所述判斷是否需 要結束該隊列的本輪調度的動作。與現有技術相比,本發明中,將每個調度組的隊列劃分為工作隊列和備 份隊列兩類,當接收到報文時,找到報文的流ID對應的隊列,若發現該隊
列為空,則將該隊列放入該隊列所屬調度組的備份隊列尾;當發現調度組的 工作隊列為空時,將該調度組的備份隊列轉為工作隊列;當進行基于端口的 輪詢和基于優先級的輪詢時,對輪詢到的調度組的工作隊列中的第一個隊列 進行調度,調度完畢,判斷該隊列是否完成本輪調度,若是,將該隊列放入 所屬調度組的備份隊列尾;否則,將該隊列重載入所屬調度組的工作隊列尾。 本發明無需進行大規模的輪詢,減少了硬件邏輯資源開銷。
圖1為基本的高端交換機和路由器的硬件架構圖2為現有的TM模塊的內部通用架構圖3為現有的TM模塊進行隊列調度的框圖4為現有的入隊處理的流程圖5為現有的出隊列調度的流程圖6為本發明實施例一提供的隊列調度系統組成圖;
圖7為本發明實施例二提供的隊列調度系統組成圖8為本發明實施例提供的入隊處理的流程圖9為本發明實施例一提供的出隊列調度的流程圖IO為本發明實施例二提供的出隊列調度的流程圖。
具體實施例方式
本發明的基本思想為將每個調度組內的非空隊列劃分為工作隊列和備 份隊列,工作隊列用于存放本輪調度的隊列,備份隊列用于存放等待下一輪 調度的隊列。當一個隊列內存入第一個報文時,將該報文放入備份隊列尾, 當工作隊列中的一個隊列完成本輪調度后進入備份隊列尾,當發現工作隊列 為空即本輪調度完成時,將所有備份隊列轉為工作隊列進行下一輪調逸。
ii在進行出隊列調度時,在進行完基于端口的輪詢和基于優先級的輪詢得 到輪詢結果端口p、調度組q時,直接從調度組q的工作隊列中取出第一 個隊列,從該隊列中調度出一個包即可,無需對調度組q進行輪詢。 下面結合附圖及具體實施例對本發明再作進一 步詳細的說明。 圖6為本發明實施例提供的隊列調度系統框圖,如圖6所示,其主要包 括入隊模塊61 、入口調度(ISCH )模塊62、 QM模塊63和出隊模塊64, 其中
入隊模塊61:保存流ID與隊列號的對應關系;接收報文,根據報文的 流ID找到該流ID對應的隊列號m,從自身的入隊參數表中取出隊列m的 入隊算法,采用入隊算法對隊列m的參數進行計算,根據計算結果,判斷 是否允許報文入隊列m,若是,向ISCH模塊62發送攜帶隊列號m的入隊 通知;否則,丟棄該報文。
ISCH模塊62:接收入隊模塊61發來的攜帶隊列號m的入隊通知,從 QM模塊63獲取隊列m的包總數,判斷該包總數是否為0,若是,確定隊 列m還未入工作隊列和備份隊列,將隊列m放入備份隊列尾,向QM模塊 63發送攜帶隊列號m的入隊請求;否則,確定隊列m已存在于工作隊列或 備份隊列中,直接向QM模塊63發送攜帶隊列號m的入隊請求。
QM模塊63:接收ISCH模塊62發來的攜帶隊列號m的入隊請求,將 報文放入隊列m中,更新自身保存的隊列m的包總數;接收出隊模塊64發 來的攜帶隊列號r的出隊請求,從隊列r取出一個包發送給出隊模塊64,更 新自身保存的隊列r的包總數,將每個調度組的空滿狀態和整個調度隊列的 空滿狀態發送給出隊模塊64。。
出隊模塊64可包括調度模塊641和重載處理模塊642,其中
調度模塊641:根據QM模塊63發來的整個工作隊列的空滿狀態,進 行基于端口的輪詢,根據QM模塊63發來的每個調度組的空滿狀態,進行 基于優先級的輪詢,設輪詢結果為端口p、調度組q,判斷調度組q的工作 隊列是否為空,若為空,將調度組q的備份隊列轉為工作隊列,從調度組q的工作隊列中取出第一個隊列r;若不為空,直接從調度組q的工作隊列中 取出第一個隊列r;從出隊參數表中讀取調度算法,采用調度算法對隊列r 進行調度,判斷是否允許包發送,若允許,向QM模塊63發送攜帶隊列號 r的出隊請求,接收QM模塊63發來的包,將該包發送到端口p上,向重載 處理模塊642發送攜帶隊列號r的重載指示。
重載處理模塊642:接收調度模塊641發來的攜帶調度組q和隊列號r 的重載指示;從QM模塊63讀取隊列r的參數,判斷隊列r是否為空,若 為空,出隊模塊不將隊列r放入工作隊列,也不放入備份隊列;若不為空, 判斷是否需要結束對隊列r的本輪調度,若是,將隊列r放入調度組q的備 份隊列尾;否則,將隊列r放入調度組q的工作隊列尾。
在實際應用中,如圖7所示,出隊模塊64還可包括
調度寄存器設置模塊640:用于為每個調度組設置一個調度寄存器,并 為每個調度寄存器設置一個有效標志,初始化該標志為"無效",保存調度 寄存器地址與調度組標識的對應關系。
且,調度模塊641在確定輪詢結果為端口 p、調度組q時,要先從調度 寄存器設置模塊640讀取調度組q的調度寄存器的地址,再判斷調度組q的 調度寄存器的有效標志是否為"有效",若是,從該調度寄存器中讀取隊列 r,并將調度組q的調度寄存器的有效標志更改為"無效,';否則,再執行 所述判斷調度組q的工作隊列是否為空的動作。
且,重載處理模塊642在確定隊列r未完成本輪調度時,要先從調度寄 存器設置模塊640讀取調度組q的調度寄存器的地址,再判斷調度q的工作 隊列是否為空,若是,將隊列r放入調度組q的調度寄存器,并設置該調度 寄存器的有效標志為"有效";否則,執行所述將隊列r重載入調度組q的 工作隊列尾的動作。
圖8為本發明實施例提供入隊處理的流程圖,如圖8所示,其具體步驟 如下
步驟801:入隊模塊為每個流設置一個隊列,保存流ID與隊列號的對應關系;ISCH模塊分別為每個調度組設置工作隊列和備份隊列。
步驟802:入隊模塊接收報文,根據報文的流ID,找到該流ID對應的 隊列號m。
步驟803:入隊模塊從入隊參數表中讀取隊列m的入隊算法。 步驟804:入隊模塊采用入隊算法如WRED/TD算法進行計算。 步驟805:入隊模塊根據計算結果,判斷是否允許報文入隊列m,若是,
執行步驟807;否則,執行步驟806。
步驟806:入隊模塊丟棄該報文,本流程結束。 步驟807:入隊模塊向ISCH模塊發送攜帶隊列號m的入隊通知。 步驟808: ISCH模塊接收入隊通知,向QM模塊獲取隊列m的包總數。 步驟809: ISCH模塊判斷隊列m的包總數是否為0,若是,執行步驟
810;否則,執行步驟811。
步驟810: ISCH模塊確定隊列m還未入工作隊列和備份隊列,將隊列
m放入備份隊列尾,執行步驟811。
這里,ISCH模塊將隊列m放入備份隊列尾,在實際操作時,只需將隊
列m的地址信息放入備份隊列即可。
步驟Sll: ISCH模塊向QM模塊發送攜帶隊列號m的入隊請求。
若ISCH模塊發現隊列m的包總數大于0,則可確定隊列m已入工作隊
列或備份隊列中,直接向QM模塊發起入隊請求即可。
步驟812: QM模塊接收該入隊請求,將報文放入隊列m中,更新自身
保存的隊列m的參數,如包總數等。
本發明實施例中,QM模塊保存的隊列參數表與現有的隊列參數表不 同,QM模塊要保存隊列的包總數,即本發明實施例中QM模塊要對每個 隊列中的包數目進行統計。
圖9為本發明實施例一提供的出隊列調度的流程圖,如圖9所示,其具 體步驟如下
步驟卯0: QM模塊將每個調度組的空滿狀態和整個調度隊列的空滿狀態發送給出隊模塊。
QM模塊可根據隊列的包總數得知隊列的空滿狀態,若隊列的包總數為
0,則可知隊列為空;否則,得知隊列為滿。
步驟901:出隊模塊根據整個調度隊列的空滿狀態,進行基于端口的輪 詢,設輪詢結果為端口 p。
步驟902:出隊模塊根據每個調度組的空滿狀態,進行基于優先級的輪 詢,設輪詢結果為調度組q。
步驟903:出隊模塊判斷調度組q的工作隊列是否為空,若是,執行步 驟904;否則,執行步驟905。
步驟卯4:出隊模塊將調度組q的所有備份隊列轉為工作隊列。
步驟卯5:出隊模塊從調度組q的工作隊列中取出第一個隊列r,從出 隊參數表中讀取調度算法,采用該調度算法如MDRR算法對隊列r進行調 度。
步驟906:出隊模塊判斷是否允許包發送,若是,執行步驟908;否則, 執行步驟卯7。
步驟907:出隊模塊更新隊列r的調度參數如更新已調度長度,轉至 步驟912。
本步驟中,當隊列r被調度后,即使不允許調度出的包發送,也要更新 隊列r的調度參數如更新已調度長度。
步驟908:出隊模塊向QM模塊發送攜帶隊列號r的出隊請求,并更新 隊列r的調度參數。
步驟卯9: QM模塊接收出隊請求,更新自身保存的隊列參數表中隊列 r的參數,如包總數等,從隊列r中取出一個包,將該包發送給出隊模塊。
步驟910:出隊模塊接收包,將包發送到端口p上,從QM模塊獲取隊 列r的包總數。
步驟911:出隊模塊判斷隊列r的包總數是否為0,若是,返回步驟901; 否則,執行步驟912。若隊列r為空,則出隊模塊不將隊列r放入工作隊列,也不放入備份隊 列。此后,當有包進入隊列r時,ISCH模塊會將隊列r放入調度組q的備份隊列。
步驟912:出隊模塊判斷是否需要結束對隊列r的本輪調度,若是,執 行步驟913;否則,執行步驟914。
例如若出隊模塊對隊列的調度采用MDRR算法,則出隊模塊在檢測 到本輪調度中隊列r已調度出的包長度第一次等于或大于預設的隊列r的 調度閾值時,則可結束對隊列r的本輪調度。
一輪調度是指完成對工作隊列中所有隊列的調度。
步驟913:出隊模塊將隊列r放入調度組q的備份隊列尾,返回步驟901。 步驟914:出隊模塊將隊列r重載入調度組q的工作隊列尾,返回步驟
901。
本實施例中,出隊模塊對工作隊列中的隊列的讀取和重載操作,在實際 應用中,都是通過對隊列的地址進行操作實現的,例如出隊模塊從工作隊 列中取出第一個隊列,實際上是取出第一個隊列的地址;將調度完畢的隊列 放入備份隊列尾或工作隊列尾,實際上是將該隊列的地址放入備份隊列尾或 工作隊列尾。同樣,當判斷工作隊列是否為空時,若發現工作隊列中沒有任 何隊列的地址,則可確定工作隊列為空。
由圖8、 9所示流程可以看出在報文入隊前,若ISCH模塊發現該隊 列為空,則將該隊列放入備份隊列尾;在報文出隊時,若基于優先級的輪詢 結果為調度組q,當出隊模塊發現調度組q的工作隊列為空時,會將備份隊 列轉為工作隊列,直接對調度組q的工作隊列中的第一個隊列進行調度即 可,在調度完畢時,若發現不需要結束對該隊列的本輪調度,則將該隊列放 入工作隊列尾,繼續等待本輪調度的后續調度;否則,將該隊列放入備^f分隊 列尾,等待下一輪調度。可見,在報文入隊時,先入報文的隊列會在工作隊 列的前面,從而使得在第一次調度時,隊列能夠按照入報文的先后順序凈皮調 度,且在一個隊列調度完一次后,會將該隊列放入工作隊列尾或備份隊列尾,這樣不僅保證了該隊列在一輪調度中調度到概率的大小(如若采用MDRR 算法,某隊列的調度閾值越高,則對該隊列進行完一次調度后放入工作隊列 尾的可能越大, 一輪調度中該隊列被調度到的次數也就越多),也保證了在 后續調度過程中隊列調度的先后順序,這樣就無需進行基于流的輪詢,大大 減少了邏輯資源的開銷。
在圖9所示流程中,為了保證整個處理流程能夠一直保持流水線處理, 入隊模塊和ISCH模塊需要在一個流水線周期內完成一次入隊處理,出隊模 塊需要在一個流水線周期內完成一次出隊處理包括出隊列調度和重栽處 理,QM模塊需要在一個流水線周期內處理完一次入隊請求、出隊請求。而 由于入隊模塊和出隊模塊之間涉及到重載處理,即出隊模塊在取出 一個工 作隊列并完成出隊列調度后,若發現該取出的隊列未結束本輪調度,還需將 該取出的隊列重載入工作隊列,該重栽過程是有延遲的,當工作隊列中有足 夠的隊列時可調度時,可抵消該延遲,流水線不會中斷,而當工作隊列中只 有一個隊列時,那么,在該隊列被重載的過程中,就會由于工作隊列中沒有 任何隊列可調度,而使得流水線中斷。為了解決該問題,本發明實施例提出 以下解決方案
圖IO本發明實施例二提供的出隊列調度的流程圖,如圖IO所示,其具 體步驟如下
步驟1000: QM模塊將每個調度組的空滿狀態和整個調度隊列的空滿狀 態發送給出隊模塊。
步驟1001:出隊模塊為每個調度組設置一個調度寄存器,并為每個調 度寄存器設置一個有效標志位,初始化該標志位為"0"。
一個調度組的調度寄存器的有效標志位為"0",則表示該調度寄存器 內無隊列,這可能由兩種原因引起 一、該調度組的工作隊列中至少還有兩 個隊列;二、該調度組的工作隊列中的隊列都結束了本輪調度,正在等待下 一輪調度,此時,工作隊列為空。此,就可大大減少因隊列重載帶來延遲,避免流水線中斷。
步驟1002:出隊模塊進行基于端口的輪詢,設輪詢結果為端口p。 步驟1003:出隊模塊進行基于優先級的輪詢,設輪詢結果為調度組q。 步驟1004:出隊模塊判斷調度組q的調度寄存器的有效標志位是否為 'T,,若是,執行步驟1005;否則,執行步驟1006。
步驟1005:出隊模塊從調度組q的調度寄存器中取出隊列r,并將調度
組q的調度寄存器的有效標志位更改為"0",轉至步驟1009。
調度組q的調度寄存器的有效標志位為'T',表示該調度寄存器內有
隊列,該隊列為本輪調度中的最后一個隊列。
步驟1006:出隊模塊判斷調度組q的工作隊列是否為空,若是,執行
步驟1007;否則,執行步驟1008。
步驟1007:出隊模塊將調度組q的所有備份隊列轉為工作隊列。 步驟1008:出隊模塊從調度組q的工作隊列中取出第一個隊列r。 步驟1009:出隊模塊對隊列r采用預設調度算法進行調度。 步驟1010:出隊模塊判斷是否允許包發送,若是,執行步驟1012;否
則,執行步驟1011。
步驟1011:出隊模塊更新隊列r的調度參數,轉至步驟1016。
步驟1012:出隊模塊向QM模塊發送攜帶隊列號r的出隊請求。
步驟1013: QM模塊接收出隊請求,從隊列r中取出一個包,將該包發
送給出隊模塊,同時更新隊列r的參數,如包總數等。
步驟1014:出隊模塊接收包,將該包發送到端口p上,從QM模塊獲
取隊列r的包總數。
步驟1015:出隊模塊判斷隊列r的包總數是否為O,若是,返回步驟1002;
否則,執行步驟1016。
若隊列r的包總數為0,則出隊模塊不將隊列r放入工作隊列,也不放
入備份隊列。
步驟1016:出隊模塊判斷是否需要結束對隊列r的本輪調度,若是,執行步驟1017;否則,執行步驟1018。
步驟1017:出隊模塊將隊列r放入調度組q的備份隊列尾,返回步驟 1002。
步驟1018:出隊模塊判斷調度組q的工作隊列是否為空,若是,執行 步驟1019;否則,執行步驟1020。
步驟1019:出隊模塊將隊列r放入調度組q的調度寄存器,并設置調度 寄存器的有效標志位為"1",返回步驟1002。
步驟1020:出隊模塊將隊列r重載入調度組q的工作隊列尾,返回步驟 1002。
從上述本發明實施例可以看出在報文入隊時,完成工作隊列和備份隊 列的劃分,在調度時,只需從工作隊列中取出第一個隊列直接調度即可,從 而無需進行大規模輪詢,大大節省了硬件邏輯資源。
以上所述僅為本發明的過程及方法實施例,并不用以限制本發明,凡在 本發明的精神和原則之內所做的任何修改、等同替換、改進等,均應包含在 本發明的保護范圍之內。
權利要求
1、一種隊列調度系統,其特征在于,該系統包括入隊模塊,接收報文,找到報文的流ID對應的隊列,若允許報文入該隊列,向入口調度模塊發送攜帶隊列標識的入隊通知;入口調度模塊,接收入隊通知,若發現所述隊列標識對應的隊列為空,則將該隊列放入所屬調度組的備份隊列尾;出隊模塊,進行基于端口的輪詢和基于優先級的輪詢,若發現輪詢到的調度組的工作隊列為空,將該調度組的備份隊列轉為工作隊列;對輪詢到的調度組的工作隊列中的第一個隊列進行調度,調度完畢,判斷是否需要結束該隊列的本輪調度,若是,將該隊列放入所屬調度組的備份隊列尾;否則,將該隊列重載入所屬調度組的工作隊列尾。
2、 如權利要求l所述的系統,其特征在于,所述系統進一步包括調度寄 存器設置模塊,用于為每個調度組設置一個調度寄存器;且,所述出隊模塊進一步用于,在判定不需要結束該隊列的本輪調度之后, 若發現該隊列為所屬調度組的工作隊列中的最后一個隊列,則將該隊列放入所 屬調度組的調度寄存器;在進行基于端口的輪詢和基于優先級的輪詢之后若發 現輪詢到的調度組的調度寄存器中存在隊列,則對該調度寄存器中的隊列進行 調度。
3、 如權利要求2所述的系銃,其特征在于,所述調度寄存器設置模塊進一 步用于,為每個調度寄存器設置一個有效標志,并初始化該標志指示"無效";所述出隊模塊進一步用于,在將該隊列放入所屬調度組的調度寄存器之后, 將該調度組寄存器的有效標志設置為指示"有效',;若發現輪詢到的調度組的調 度寄存器的有效標志指示"有效",則確定輪詢到的調度組的調度寄存器中存在 隊列;在對該調度寄存器中的隊列進行調度之前,從調度寄存器中取出隊列, 將調度寄存器的有效標志更改為指示"無效"。
4、 如權利要求1至3任一所述的系統,其特征在于,所述出隊模塊進一步用于,在調度完畢時,發現調度完畢的隊列為空,則不將該隊列放入工作隊列, 也不將該隊列放入備份隊列。
5、 如權利要求1至3任一所述的系統,其特征在于,所述系統進一步包括 流量管理QM模塊,用于維護每個隊列的包總數;當接收到入隊請求時,將該請求中攜帶的隊列標識對應隊列的包總數加1;當接收到出隊請求時,將 該請求中的隊列標識對應隊列的包總凄l減1;且,所述入口調度模塊進一步用于,在將該隊列放入所屬調度組的備份隊 列尾時,向QM才莫塊發送攜帶隊列標識的入隊請求;在接收入隊通知后,從QM 模塊獲取該通知中的隊列標識對應的包總數,以用于判斷該隊列是否為空;且,所述出隊模塊進一步用于,在調度完畢時,向QM模塊發送攜帶隊列 標識的出隊請求。
6、 一種隊列調度方法,其特征在于,將每個調度組的隊列劃分為工作隊列 和備份隊列兩類,該方法包括接收報文,找到報文的流ID對應的隊列,若發現該隊列為空,則將該隊列 放入該隊列所屬調度組的備份隊列尾;進行基于端口的輪詢和基于優先級的輪詢,若發現輪詢到的調度組的工作 隊列為空,將該調度組的備份隊列轉為工作隊列;對輪詢到的調度組的工作隊 列中的第一個隊列進行調度,調度完畢,判斷是否需要結束該隊列的本輪調度, 若是,將該隊列放入所屬調度組的備份隊列尾;否則,將該隊列重載入所屬調 度組的工作隊列尾。
7、 如權利要求6所述的方法,其特征在于,所述方法進一步包括預先為 每個調度組設置一個調度寄存器,所述判定需要結束該隊列的本輪調度之后進一步包括判斷該隊列是否為 所屬調度組的工作隊列中的最后一個隊列,若是,將該隊列放入所屬調度組的 調度寄存器;且,所述進行基于端口的輪詢和基于優先級的輪詢之后進一步包括判斷 輪詢到的調度組的調度寄存器中是否存在隊列,若是,對該調度寄存器中的隊列進行調度;否則,執行所述對輪詢到的調度組的工作隊列中的第一個隊列進 行調度的動作。
8、 如權利要求7所述的方法,其特征在于,所述預先為每個調度組設置一 個調度寄存器進一步包括為每個調度寄存器設置一個有效標志,并初始化該標志指示"無步文";所述將該隊列放入所屬調度組的調度寄存器之后進一步包括將該調度組 寄存器的有效標志設置為指示"有效";且,所述判斷輪詢到的調度組的調度寄存器中是否存在隊列為判斷輪詢 到的調度組的調度寄存器的有效標志是否指示"有效",若是,確定輪詢到的調 度組的調度寄存器中存在隊列;且,所述對該調度寄存器中的隊列進行調度之前進一步包括從調度寄存 器中取出隊列,將調度寄存器的有效標志更改為指示"無效"。
9、 如權利要6至8任一所述的方法,其特征在于,所述將該隊列放入該隊 列所屬調度組的備份隊列尾之后進一步包括將隊列的包總數加1;所述調度完畢之后進一步包括將調度完畢的隊列的包總數減1; 所述發現該隊列為空為發現隊列的包總數為0。
10、 如權利要求6至8任一所述的方法,其特征在于,所述調度完畢之后 進一步包括判斷該隊列是否為空,若是,不將該隊列放入工作隊列,也不將 該隊列放入備份隊列;否則,執行所述判斷是否需要結束該隊列的本輪調度的 動作。
全文摘要
本發明公開了隊列調度系統及方法。方法包括將每個調度組的隊列劃分為工作隊列和備份隊列兩類,接收報文,找到報文的流ID對應的隊列,若發現該隊列為空,則將該隊列放入該隊列所屬調度組的備份隊列尾;進行基于端口的輪詢和基于優先級的輪詢,若發現調度組的工作隊列為空,將該調度組的備份隊列轉為工作隊列;對輪詢到的調度組的工作隊列中的第一個隊列進行調度,調度完畢,判斷是否需要結束對該隊列的本輪調度,若是,將該隊列放入所屬調度組的備份隊列尾;否則,將該隊列重載入所屬調度組的工作隊列尾。本發明無需進行大規格的輪詢,節省了硬件邏輯資源開銷。
文檔編號H04L12/56GK101447943SQ200810241148
公開日2009年6月3日 申請日期2008年12月26日 優先權日2008年12月26日
發明者暉 林 申請人:杭州華三通信技術有限公司