專利名稱:報(bào)文保序方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信領(lǐng)域,具體而言,涉及一種報(bào)文保序方法及系統(tǒng)。
背景技術(shù):
通訊網(wǎng)絡(luò)設(shè)備的基本功能是轉(zhuǎn)發(fā)報(bào)文,在保證轉(zhuǎn)發(fā)性能的情況下,還必須保證報(bào) 文的轉(zhuǎn)發(fā)質(zhì)量(例如,保證報(bào)文轉(zhuǎn)發(fā)的低時(shí)延、低抖動(dòng)等)。此外,對(duì)于一些用戶業(yè)務(wù)的報(bào)文 (例如用戶語(yǔ)音、視頻等)還必須保證報(bào)文轉(zhuǎn)發(fā)的順序(簡(jiǎn)稱為保序),即同一個(gè)數(shù)據(jù)流的 報(bào)文從進(jìn)入網(wǎng)絡(luò)設(shè)備到離開網(wǎng)絡(luò)設(shè)備的順序應(yīng)該嚴(yán)格相同。目前,為了提高網(wǎng)絡(luò)設(shè)備的報(bào) 文處理能力,多核處理器已經(jīng)被應(yīng)用在網(wǎng)絡(luò)通訊設(shè)備上了。在多核處理器系統(tǒng)中,報(bào)文的保序可以通過硬件和軟件來(lái)實(shí)現(xiàn)。其中,利用硬件實(shí) 現(xiàn)的保序功能(例如,利用硬件保序隊(duì)列來(lái)實(shí)現(xiàn)保序,或者利用報(bào)文標(biāo)簽(tag)值切換等) 對(duì)系統(tǒng)整體性能影響比較小、易于維護(hù)。但是,利用硬件來(lái)實(shí)現(xiàn)保序在不同的硬件架構(gòu)需要 使用不同的硬件機(jī)制來(lái)實(shí)現(xiàn),因而造成了對(duì)硬件依賴性比較大、通用性不夠強(qiáng),需要不同的 專業(yè)人員來(lái)維護(hù)。軟件保序利用軟件保序算法的靈活性和通用性,可以屏蔽硬件結(jié)構(gòu)的差異,具有 移植和維護(hù)方便的特點(diǎn)。目前的軟件保序策略分為以下兩種一、按流分發(fā)按流分發(fā)保序是將同一用戶的報(bào)文分發(fā)到同一個(gè)線程上處理。圖1是根據(jù)相關(guān)技術(shù) 的按流分發(fā)報(bào)文的示意圖,硬件在接收單元接收到報(bào)文之后,首先按照一定規(guī)則將報(bào)文分成不 同的數(shù)據(jù)流。然后將不同的數(shù)據(jù)流分發(fā)到不同的核上處理。這樣可以將同一用戶的報(bào)文被分發(fā) 到同一個(gè)核上進(jìn)行處理,可以保證報(bào)文處理的順序。由于不同流間的報(bào)文相互間沒有聯(lián)系,不 同流的報(bào)文順序是不需要考慮的。按流分發(fā)的實(shí)現(xiàn)過程比較簡(jiǎn)單,但是由于多核處理器的硬件 分類單元對(duì)報(bào)文的分類能力有限,不能解析出所有的用戶報(bào)文。并且由于用戶報(bào)文的隨機(jī)性, 容易出現(xiàn)線程之間負(fù)荷分擔(dān)不均勻,導(dǎo)致有的線程比較空閑,而有的線程負(fù)荷比較大。二、序列號(hào)保序序列號(hào)保序是根據(jù)報(bào)文序列號(hào)和期望序列號(hào)并通過期望序列號(hào)的不斷推進(jìn)來(lái)實(shí) 現(xiàn)報(bào)文的保序。圖2是根據(jù)相關(guān)技術(shù)的序列號(hào)報(bào)文保序的示意圖,硬件接收單元將從同一 端口接收的報(bào)文打上一個(gè)序列號(hào)(Pkt_seq),其中,每接收一個(gè)報(bào)文,pkt_Seq就會(huì)遞增1, 不同端口的報(bào)文序列號(hào)是獨(dú)立編號(hào)、互不影響的。然后,硬件分發(fā)單元按照輪詢的方式將報(bào) 文分擔(dān)到每個(gè)線程進(jìn)行并行處理。在報(bào)文處理完畢之后,將報(bào)文送入保序單元。保序單元預(yù) 先為每個(gè)接收端口分配一個(gè)期望序列號(hào)(eXp_seq)和保序隊(duì)列(order_qUe),期望序列號(hào) 和保序隊(duì)列為每個(gè)線程都能共同訪問的共享變量。圖3是根據(jù)相關(guān)技術(shù)的保序隊(duì)列結(jié)構(gòu)示 意圖,保序隊(duì)列不同于一般的先入先出隊(duì)列,報(bào)文根據(jù)自身序列號(hào)在保序隊(duì)列中有一個(gè)對(duì) 應(yīng)位置,期望序列號(hào)指向保序隊(duì)列中當(dāng)前的保序位置。保序隊(duì)列節(jié)點(diǎn)有兩個(gè)特性一是節(jié)點(diǎn) 狀態(tài),包括有效和無(wú)效,其中,“有效”表示線程可以處理當(dāng)前節(jié)點(diǎn)的報(bào)文;二是節(jié)點(diǎn)動(dòng)作,根 據(jù)業(yè)務(wù)要求可以將用戶報(bào)文分為保序和非保序,區(qū)別在于是否需要保序單元發(fā)送該報(bào)文。
報(bào)文在進(jìn)入保序單元之后,線程判斷當(dāng)前處理報(bào)文的序列號(hào)與期望序列號(hào)是否相 同,如果相同則通過原子鎖(spirulock)的方式(即,線程通過原子鎖的方式來(lái)操作期望序 列號(hào)eXp_Seq和保序隊(duì)列)鎖住當(dāng)前報(bào)文在保序隊(duì)列中的位置,處理該報(bào)文,并將期望序列 號(hào)遞增1,然后繼續(xù)判斷保序隊(duì)列下一個(gè)節(jié)點(diǎn)的狀態(tài),直到隊(duì)列下一個(gè)節(jié)點(diǎn)狀態(tài)無(wú)效;否則 將報(bào)文緩存到保序隊(duì)列中,并返回接收新的報(bào)文。上述的在報(bào)文進(jìn)入保序單元之后,線程是根據(jù)spirulock的方式來(lái)鎖住當(dāng)前報(bào)文 在保序隊(duì)列中的位置。發(fā)明人發(fā)現(xiàn),在網(wǎng)絡(luò)流量比較大的情況下,這樣的處理方式,會(huì)使獲 得鎖的線程一直處于保序發(fā)送狀態(tài),如果這個(gè)線程還要執(zhí)行其他功能,那么由于該線程一 直處于保序發(fā)送狀態(tài)而無(wú)法執(zhí)行其應(yīng)該執(zhí)行的功能。從而有可能導(dǎo)致影響單板性能或流控 機(jī)制,引起流量抖動(dòng)。
發(fā)明內(nèi)容
本發(fā)明的主要目的在于提供一種報(bào)文保序方案,以至少解決上述問題。根據(jù)本發(fā)明的一個(gè)方面,提供了 一種報(bào)文保序方法,包括以下步驟多個(gè)線程競(jìng)爭(zhēng) 原子鎖;得到所述原子鎖的線程對(duì)保序隊(duì)列中的預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理,并在處理之后, 釋放所述原子鎖。根據(jù)本發(fā)明的另一個(gè)方面,提供了一種報(bào)文保序系統(tǒng),包括競(jìng)爭(zhēng)模塊,用于使多 個(gè)線程競(jìng)爭(zhēng)原子鎖;處理模塊,用于使得到所述原子鎖的線程對(duì)保序隊(duì)列中的預(yù)定個(gè)數(shù)的 報(bào)文進(jìn)行處理,并在處理之后,釋放所述原子鎖。通過本發(fā)明,采用多個(gè)線程競(jìng)爭(zhēng)原子鎖;得到該原子鎖的線程對(duì)保序隊(duì)列中的預(yù) 定個(gè)數(shù)的報(bào)文進(jìn)行處理,并在處理之后,釋放該原子鎖。解決了獲取到原子鎖的線程一直處 于保序發(fā)送狀態(tài)而無(wú)法執(zhí)行其應(yīng)該執(zhí)行的功能而導(dǎo)致影響單板性能或流控機(jī)制的問題,進(jìn) 而完善了保序處理。
此處所說明的附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā) 明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中圖1是根據(jù)相關(guān)技術(shù)的在多核處理器系統(tǒng)中按流分發(fā)報(bào)文的示意圖;圖2是根據(jù)相關(guān)技術(shù)的在多核處理器系統(tǒng)中采用序列號(hào)報(bào)文保序的示意圖;圖3是根據(jù)相關(guān)技術(shù)的保序隊(duì)列結(jié)構(gòu)示意圖;圖4是根據(jù)本發(fā)明實(shí)施例的報(bào)文保序方法的流程圖;圖5是根據(jù)本發(fā)明實(shí)施例軟件序列號(hào)報(bào)文保序策略報(bào)文動(dòng)作類型示意圖;圖6是根據(jù)本發(fā)明實(shí)施例的報(bào)文保序策略過程結(jié)構(gòu)示意圖;圖7是根據(jù)本發(fā)明實(shí)施例的保序單元多線程保序示意圖;圖8是根據(jù)本發(fā)明實(shí)施例五的軟件序列號(hào)報(bào)文保序策略流程圖;圖9是根據(jù)本發(fā)明實(shí)施例六的軟件序列號(hào)報(bào)文保序策略異常保護(hù)機(jī)制流程圖。
具體實(shí)施例方式下文中將參考附圖并結(jié)合實(shí)施例來(lái)詳細(xì)說明本發(fā)明。需要說明的是,在不沖突的
5情況下,本申請(qǐng)中的實(shí)施例及實(shí)施例中的特征可以相互組合。實(shí)施例一圖4是根據(jù)本發(fā)明實(shí)施例的報(bào)文保序方法的流程圖,該流程包括以下步驟步驟S402,多個(gè)線程競(jìng)爭(zhēng)原子鎖;步驟S404,得到該原子鎖的線程對(duì)保序隊(duì)列中的預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理,并在處理之后,釋放該原子鎖。由于在現(xiàn)有技術(shù)中,一個(gè)線程在獲取到原子鎖之后,只要保序隊(duì)列中有報(bào)文需要 處理,那么該線程就會(huì)一直進(jìn)行報(bào)文保序的處理,那么該線程就無(wú)法執(zhí)行其應(yīng)該執(zhí)行的功 能,從而就會(huì)產(chǎn)生相應(yīng)的問題。通過上述步驟S404,得到該原子鎖的線程在對(duì)一定數(shù)量(例 如,一個(gè)報(bào)文或者設(shè)置一個(gè)閾值)的報(bào)文進(jìn)行保序處理之后,釋放該原子鎖,這樣該線程就 不會(huì)一直處理報(bào)文保序的處理,從而可以解決現(xiàn)有技術(shù)中的問題。獲取原子鎖的方式可以包括兩種一種是線程在獲取不到原子鎖的情況下會(huì)一直 等待,直到該線程獲取到原子鎖(例如,spinjock);另一種是獲取原子鎖失敗的線程直接 返回(例如,spinjrylock)。如果在本實(shí)施例中采用第一種方式,雖然可以在一定程度上 解決現(xiàn)有技術(shù)中的問題,但是,如果一個(gè)線程一直未獲得原子鎖,也會(huì)影響該線程功能的執(zhí) 行。因此,采用第二種處理方式可以最大程度解決現(xiàn)有技術(shù)中的問題。優(yōu)選地,在獲取原子鎖之前,可以對(duì)節(jié)點(diǎn)的狀態(tài)是否有效和序列號(hào)與期望序列號(hào) 是否相等進(jìn)行判斷。其中,如果判斷保序隊(duì)列中的當(dāng)前節(jié)點(diǎn)的狀態(tài),則在當(dāng)前節(jié)點(diǎn)的狀態(tài)為 有效的情況下,并且,當(dāng)前報(bào)文序列號(hào)和期望序列號(hào)相同的情況下,多個(gè)線程嘗試獲取原子 鎖。優(yōu)選地,在線程得到原子鎖之后,進(jìn)行保序處理時(shí),對(duì)保序隊(duì)列中的當(dāng)前節(jié)點(diǎn)的狀 態(tài)和/或當(dāng)前報(bào)文的序列號(hào)和期望序列號(hào)是否相同進(jìn)行判斷。其中,如果獲取原子鎖的線 程判斷保序隊(duì)列中的當(dāng)前節(jié)點(diǎn)的狀態(tài),在所述當(dāng)前節(jié)點(diǎn)的狀態(tài)為有效的情況下,得到所述 原子鎖的線程對(duì)所述一個(gè)或多個(gè)報(bào)文進(jìn)行處理;如果獲取所述原子鎖的線程比較當(dāng)前報(bào)文 的序列號(hào)和期望序列號(hào),則在兩者相同的情況下,將所述當(dāng)前報(bào)文發(fā)送至對(duì)應(yīng)的端口。如果 在嘗試獲取原子鎖之前和進(jìn)行保序處理時(shí)均采用了上述的判斷,則可以提高安全性。優(yōu)選地,在將當(dāng)前報(bào)文發(fā)送至對(duì)應(yīng)的端口之后,獲取所述原子鎖的線程進(jìn)行下一 個(gè)報(bào)文的處理或者釋放所述原子鎖。如果在處理完一個(gè)報(bào)文之后就釋放原子鎖,可以使其 他的線程增加進(jìn)行保序處理的機(jī)會(huì),如果在處理完多個(gè)報(bào)文之后再釋放原子鎖,可以在一 定程度上提高保序處理的速度,因此,可以根據(jù)實(shí)際的需要進(jìn)行試驗(yàn)以選擇一個(gè)最佳的閾 值。在現(xiàn)有的保序處理中,由于是采用的一個(gè)線程在獲取到原子鎖之后一直進(jìn)行保序 處理,這樣,在用戶報(bào)文序列號(hào)出現(xiàn)丟失等異常情況下,缺乏異常保護(hù)機(jī)制,導(dǎo)致保序模塊 死鎖。在本實(shí)施例中采用以下的手段來(lái)解決這個(gè)問題為每一個(gè)線程均申請(qǐng)一個(gè)共享變量(即,每個(gè)線程均對(duì)應(yīng)一個(gè)共享變量),這樣, 線程在接收?qǐng)?bào)文之前,判斷該線程的共享變量的值,在該線程的共享變量的值不是初始值 的情況下,確定上一個(gè)報(bào)文的序列號(hào)丟失,并將丟失的報(bào)文序列號(hào)送入保序單元釋放該丟 失的報(bào)文序列號(hào);在該線程的共享變量的值是初始值的情況下,接收?qǐng)?bào)文,并將接收到的報(bào) 文的序列號(hào)賦給該線程的共享變量,在接收到的報(bào)文進(jìn)入所述保序單元之后,將共享變量的值恢復(fù)為初始值。通過上述的異常保護(hù)機(jī)制,在序列號(hào)出現(xiàn)丟失的情況下對(duì)保序單元起到了保護(hù)作用。在本實(shí)施例中,還提供了一種報(bào)文保序系統(tǒng),包括競(jìng)爭(zhēng)模塊、處理模塊,其中,競(jìng)爭(zhēng)模塊,用于使多個(gè)線程競(jìng)爭(zhēng)原子鎖;處理模塊,用于使得到該原子鎖的線程對(duì)保序隊(duì)列中 的預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理,并在處理之后,釋放該原子鎖。優(yōu)選地,處理模塊用于使得到原子鎖的線程比較當(dāng)前報(bào)文的序列號(hào)和期望序列 號(hào),在兩者相同的情況下,將當(dāng)前報(bào)文發(fā)送至對(duì)應(yīng)的端口 ;在將當(dāng)前報(bào)文發(fā)送至對(duì)應(yīng)的端口 之后,獲取原子鎖的線程進(jìn)行下一個(gè)報(bào)文的處理或者釋放該原子鎖。優(yōu)選地,該系統(tǒng)還可以包括異常處理模塊,該異常處理模塊用于使多個(gè)線程中的 每個(gè)線程在接收?qǐng)?bào)文之前,判斷該線程的共享變量的值,在該線程的共享變量的值不是初 始值的情況下,確定上一個(gè)報(bào)文的序列號(hào)丟失,并將丟失的報(bào)文序列號(hào)送入保序單元釋放 該丟失的報(bào)文序列號(hào);其中,每個(gè)線程均對(duì)應(yīng)一個(gè)共享變量;在該線程的共享變量的值是 初始值的情況下,接收?qǐng)?bào)文,并將接收到的所述報(bào)文的序列號(hào)賦給該線程的共享變量,在接 收到的報(bào)文進(jìn)入保序單元之后,將共享變量的值恢復(fù)為初始值。實(shí)施例二本實(shí)施包括了實(shí)施例一及其變型實(shí)施例的實(shí)施方式,提供了一種報(bào)文保序方法, 包括如下步驟步驟S2,為每個(gè)硬件接收端口配置一個(gè)保序緩存隊(duì)列和期望序列號(hào);步驟S4,保序定義點(diǎn)(報(bào)文序列號(hào)的分配與提取),為每個(gè)端口的接收?qǐng)?bào)文分配一 個(gè)遞增的保序序列號(hào),并將報(bào)文按一定規(guī)則分發(fā)到并行運(yùn)行的不同線程上處理;步驟S6,多核處理單元中各個(gè)線程接收到報(bào)文后提取報(bào)文序列號(hào),按照業(yè)務(wù)用戶 需要將報(bào)文分為保序和非保序兩種,在報(bào)文處理終結(jié)點(diǎn)將報(bào)文送入保序單元。例如,可以根 據(jù)用戶報(bào)文的類型及需求將報(bào)文分為兩種類型保序和非保序。保序報(bào)文需要在保序單元 做發(fā)送處理,非保序報(bào)文不需要保序發(fā)送,只需要“釋放序列號(hào)”。在報(bào)文處理終結(jié)點(diǎn)需要向 保序單元傳遞報(bào)文接收端口號(hào)、報(bào)文序列號(hào)及報(bào)文類型;步驟S8,保序恢復(fù)點(diǎn)(即,保序單元入口),保序單元采用先緩存再保序發(fā)送的方 法對(duì)報(bào)文做保序發(fā)送,例如,報(bào)文被緩存到保序緩存隊(duì)列之前可以判斷隊(duì)列是否已滿,判斷 條件為報(bào)文序列號(hào)與期望序列號(hào)的差值絕對(duì)值是否大于保序隊(duì)列長(zhǎng)度,如果大于則進(jìn)入等 待狀態(tài),否則執(zhí)行緩存操作。然后,利用spirutrylock機(jī)制訪問當(dāng)前期望序列號(hào)在保序緩 存隊(duì)列指示的位置,trylock成功后判斷節(jié)點(diǎn)狀態(tài)是否有效及節(jié)點(diǎn)序列號(hào)是否與期望序列 號(hào)相等,如果滿足條件,則發(fā)送該報(bào)文,節(jié)點(diǎn)狀態(tài)置為無(wú)效并“預(yù)取”該節(jié)點(diǎn)的下一個(gè)位置, 期望序列號(hào)遞增1,釋放該節(jié)點(diǎn)原子鎖,然后繼續(xù)spirutrylock “預(yù)取”的下一個(gè)節(jié)點(diǎn),其 中,“預(yù)取”下一個(gè)節(jié)點(diǎn)操作要放在期望序列號(hào)遞增1之前。優(yōu)選地,線程在先緩存再保序發(fā)送的過程中,根據(jù)報(bào)文接收端口號(hào)和報(bào)文序列號(hào) 將報(bào)文緩存到保序隊(duì)列相應(yīng)節(jié)點(diǎn)位置,鎖住該節(jié)點(diǎn)后記錄下報(bào)文的發(fā)送信息、報(bào)文序列號(hào) 及報(bào)文類型,將該節(jié)點(diǎn)標(biāo)記為有效并釋放節(jié)點(diǎn)原子鎖。優(yōu)選地,在該步驟中,線程可以在spirutrylock前后兩次判斷保序條件節(jié)點(diǎn)狀 態(tài)是否有效和節(jié)點(diǎn)序列號(hào)是否與期望序列號(hào)相等。如果不滿足條件,則該線程直接返回。
在本實(shí)施例中,spirutrylock機(jī)制保證了多線程做保序發(fā)送,避免了大流量下單 線程做保序發(fā)送。實(shí)施例三 在本實(shí)施例中提供了一種異常保序機(jī)制,異常保護(hù)機(jī)制需要每個(gè)線程維護(hù)一個(gè)線 程序列號(hào),并初始化為-1。線程序列號(hào)記錄當(dāng)前報(bào)文序列號(hào),在報(bào)文進(jìn)入保序單元之后線程 序列號(hào)被置為-1。線程在接收下一個(gè)報(bào)文之前判斷線程序列號(hào)是否為-1,如果不是則需要 將該序列號(hào)送入保序單元做“釋放序列號(hào)”操作,其中,“釋放序列號(hào)”表示報(bào)文不需要保序 發(fā)送,只需要在Spin_tryl0Ck成功后將期望序列號(hào)遞增1。通過上述異常保序機(jī)制,如果中 間出現(xiàn)流程錯(cuò)誤導(dǎo)致序列號(hào)丟失,則序列號(hào)丟失的報(bào)文會(huì)被檢測(cè)出來(lái),能夠保證不影響其 它報(bào)文的順序。在本實(shí)施例中保序恢復(fù)點(diǎn)是協(xié)同操作的多個(gè)實(shí)體,由多個(gè)保序恢復(fù)點(diǎn)實(shí)體共同完 成序列號(hào)的恢復(fù)操作,實(shí)現(xiàn)保序的高效性。實(shí)施例四本實(shí)施例包括了實(shí)施例一及其變型實(shí)施例的實(shí)施方式,提供了一種報(bào)文保序方 法,首先對(duì)保序定義點(diǎn)、報(bào)文處理單元、保序恢復(fù)點(diǎn)進(jìn)行說明保序定義點(diǎn)為物理端口接收 的每個(gè)報(bào)文分配一個(gè)序列號(hào);報(bào)文處理單元多個(gè)核并行處理報(bào)文,并在報(bào)文處理終結(jié)處 向保序單元傳遞報(bào)文的“動(dòng)作類型”。圖5是根據(jù)本發(fā)明實(shí)施例軟件序列號(hào)報(bào)文保序策略報(bào) 文動(dòng)作類型示意圖,如圖5所示,動(dòng)作類型包括保序和非保序,其中,保序報(bào)文的動(dòng)作是保 序發(fā)送并釋放序列號(hào),非保序報(bào)文的動(dòng)作是釋放序列號(hào);保序恢復(fù)點(diǎn)在使用保序隊(duì)列和 期望序列號(hào)的基礎(chǔ)上,利用多核處理器的spirutrylock機(jī)制實(shí)現(xiàn)多線程保序。該方法包括如下步驟步驟S22,作為保序定義點(diǎn),包含報(bào)文序列號(hào)的分配及提取,其中,保序定義點(diǎn)為接 收?qǐng)?bào)文分配序列號(hào),并將報(bào)文輪詢到各個(gè)線程;各個(gè)線程提取并記錄接收?qǐng)?bào)文序列號(hào);步驟S24,多核并行處理過程的差異性可能導(dǎo)致報(bào)文出現(xiàn)“亂序”,在報(bào)文處理終結(jié) 處調(diào)用保序單元接口,向保序單元傳遞報(bào)文信息、接收端口及“動(dòng)作類型”等;步驟S26,實(shí)現(xiàn)報(bào)文保序發(fā)送,可以分為四個(gè)環(huán)節(jié)(1)存儲(chǔ)(store),線程根據(jù)接 收端口號(hào)和序列號(hào)計(jì)算報(bào)文在保序隊(duì)列中的位置,報(bào)文在store之前判斷保序隊(duì)列是否已 滿未滿,則利用原子鎖spinjock鎖住該節(jié)點(diǎn),將報(bào)文緩存到保序隊(duì)列并置該隊(duì)列節(jié)點(diǎn) 為有效,然后釋放原子鎖進(jìn)入下一個(gè)環(huán)節(jié);如果已滿,則進(jìn)入等待狀態(tài),如果等待時(shí)間超過 閾值后,需要將窗口向前推動(dòng)并發(fā)送當(dāng)前處理報(bào)文;(2) spin_trylock,獲取當(dāng)前期望序列 號(hào)eXp_Seq,并計(jì)算其在保序隊(duì)列中的位置,如果該位置節(jié)點(diǎn)有效,則多個(gè)線程同時(shí)spin_ trylock “爭(zhēng)搶”該節(jié)點(diǎn)原子鎖,spirutrylock的效果是每次有且僅有一個(gè)線程會(huì)獲取原子 鎖成功,而spin_tryl0Ck失敗的線程則直接返回;spin_tryloCk成功后還需要判斷另外兩 個(gè)條件節(jié)點(diǎn)狀態(tài)有效、節(jié)點(diǎn)序列號(hào)與期望序列號(hào)相等,條件同時(shí)滿足則進(jìn)入下一個(gè)環(huán)節(jié), 否則釋放原子鎖后,直接返回。(3)執(zhí)行(Do_Job),首先線程判斷節(jié)點(diǎn)的“動(dòng)作類型”,保序 報(bào)文被發(fā)送至端口,非保序報(bào)文則只需要“釋放序列號(hào)”,然后“預(yù)取”當(dāng)前節(jié)點(diǎn)的下一個(gè)位 置,并將期望序列號(hào)遞增1并釋放該節(jié)點(diǎn)原子鎖,最后spirutrylock“預(yù)取”節(jié)點(diǎn)的原子鎖, 重復(fù)環(huán)節(jié)⑵和⑶。下面通過實(shí)施例五和實(shí)施例六并結(jié)合附圖進(jìn)行說明。圖6是根據(jù)本發(fā)明實(shí)施例的報(bào)文保序策略過程結(jié)構(gòu)示意圖,如圖6所示,在保序定義點(diǎn)處,每個(gè)接收?qǐng)?bào)文被分配一個(gè)序 列號(hào),當(dāng)報(bào)文被輪詢分發(fā)到各個(gè)線程后會(huì)導(dǎo)致同一數(shù)據(jù)流的報(bào)文被輪詢到各個(gè)線程,報(bào)文 經(jīng)過多線程并行處理后必須要經(jīng)過保序恢復(fù)點(diǎn),按照接收序列號(hào)和期望序列號(hào)來(lái)實(shí)現(xiàn)報(bào)文 的保序發(fā)送。圖7是根據(jù)本發(fā)明實(shí)施例的保序單元多線程保序示意圖,如圖7所示,保序單 元在實(shí)現(xiàn)保序算法過程中采用了 spirutrylock機(jī)制,保證線程參與保序的均勻性和負(fù)荷 分擔(dān),避免大流量下個(gè)別線程的負(fù)荷過重。實(shí)施例五 圖8是根據(jù)本發(fā)明實(shí)施例五的軟件序列號(hào)報(bào)文保序策略流程圖,如圖8所示,該流 程包括如下步驟步驟S801 為保序單元?jiǎng)?chuàng)建保序隊(duì)列及期望序列號(hào)。為每個(gè)接收端口創(chuàng)建一個(gè)保序隊(duì)列,隊(duì)列長(zhǎng)度為2的整數(shù)次冪,長(zhǎng)度大小可以預(yù) 先設(shè)置。每個(gè)接收端口對(duì)應(yīng)一個(gè)期望序列號(hào),期望序列號(hào)與接收?qǐng)?bào)文序列號(hào)長(zhǎng)度大小相同,
并一一對(duì)應(yīng)。步驟S802 保序定義點(diǎn),保序定義點(diǎn)為接收到的報(bào)文分配一個(gè)連續(xù)遞增的序列 號(hào),并按照一定的規(guī)則分發(fā)到并行運(yùn)行的線程上。步驟S803 多線程處理單元提取保序定義點(diǎn)為報(bào)文分配的序列號(hào),保存在報(bào)文描 述符中,并完成對(duì)報(bào)文的處理。由于是多個(gè)核并行處理,報(bào)文在處理過程中可能發(fā)生“亂序”。在報(bào)文處理的終結(jié) 點(diǎn),線程將報(bào)文送入保序單元,需要向保序單元傳遞以下信息報(bào)文接收序列號(hào)、接收端口 號(hào)、保序動(dòng)作類型。步驟S804 保序恢復(fù)點(diǎn),從接口單元接收的報(bào)文被送入保序單元進(jìn)行順序恢復(fù)。步驟S805 判斷保序隊(duì)列狀態(tài),報(bào)文緩存到保序隊(duì)列。在報(bào)文被緩存到保序窗口之前需要判斷保序窗口是否已滿,如果保序窗口不滿, 則可以繼續(xù)向保序窗口中緩存報(bào)文,如果保序窗口滿,需要等待一段時(shí)間,如果在等待的一 段時(shí)間內(nèi),窗口依然還處于滿的狀態(tài),則向前滑動(dòng)窗口,將窗口中處于最前面的報(bào)文發(fā)送出 去。判斷條件為當(dāng)前序列號(hào)(cur_seq)與期望序列號(hào)(expectseq)差值絕對(duì)值是否小于 “保序窗口”的大小(0Q_WIND0W_SIZE),即cur_seq-expect_seq >= 0Q_WIND0ff_SIZE“保序窗口”的大小可以自由配置,最大長(zhǎng)度為保序隊(duì)列長(zhǎng)度-1。步驟S806 報(bào)文節(jié)點(diǎn)store過程。通過報(bào)文接收序列號(hào)和接收端口號(hào)計(jì)算出該報(bào)文在保序隊(duì)列中的位置,并獲取該 節(jié)點(diǎn)的原子鎖。通過判斷報(bào)文的保序動(dòng)作類型,將報(bào)文分為保序與不保序兩種。這兩種報(bào) 文向保序隊(duì)列緩存的共同信息為報(bào)文序列號(hào)、保序動(dòng)作類型;不同點(diǎn)是保序報(bào)文需要傳 遞的報(bào)文的發(fā)送信息,例如,報(bào)文數(shù)據(jù)地址,發(fā)送端口等,而不保序報(bào)文不需要。最后將保序 隊(duì)列節(jié)點(diǎn)置為有效,并釋放該節(jié)點(diǎn)原子鎖。步驟S807 :spin_trylock,多個(gè)線程“競(jìng)爭(zhēng)”期望序列號(hào)。計(jì)算當(dāng)前期望序列號(hào)在保序隊(duì)列中的對(duì)應(yīng)位置,獲取該位置節(jié)點(diǎn)的原子鎖。如果 該節(jié)點(diǎn)有效,則多個(gè)線程同時(shí)spirutrylock “爭(zhēng)搶”該原子鎖,spir^trylock的效果是最后 有且僅有一個(gè)線程會(huì)獲取該原子鎖成功,其他線程獲取原子鎖失敗后則直接返回;獲取原子鎖成功后還需要繼續(xù)判斷該節(jié)點(diǎn)是否滿足兩個(gè)條件節(jié)點(diǎn)狀態(tài)有效、節(jié)點(diǎn)序列號(hào)與期望 序列號(hào)相等。條件滿足則進(jìn)入下一個(gè)環(huán)節(jié),否則釋放原子鎖后,直接返回。 步驟S808 :Do_Job, spin_trylock 成功后的線程操作。線程獲取該節(jié)點(diǎn)對(duì)應(yīng)的原子鎖之后,判斷節(jié)點(diǎn)的“保序動(dòng)作”來(lái)Do_Job 需要保序 發(fā)送的報(bào)文被發(fā)送至端口,不需要保序的報(bào)文則只需要“釋放序列號(hào)”。Do_Job完成后,該 節(jié)點(diǎn)被置位無(wú)效,并“預(yù)取”期望序列號(hào)對(duì)應(yīng)的下一個(gè)節(jié)點(diǎn),最后將期望序列號(hào)加1并釋放 該節(jié)點(diǎn)原子鎖。獲取“預(yù)取”節(jié)點(diǎn)的原子鎖,重復(fù)步驟S807。實(shí)施例六圖9是根據(jù)本發(fā)明實(shí)施例六的軟件序列號(hào)報(bào)文保序策略異常保護(hù)機(jī)制流程圖,該 流程包括如下步驟步驟S901 每個(gè)線程維護(hù)一個(gè)自己的線程序列號(hào)thrd_seq ;為每個(gè)線程申請(qǐng)一個(gè) 共享變量,初始化值設(shè)置為-1。步驟S902 線程序列號(hào)thrd_Seq記錄當(dāng)前處理報(bào)文的序列號(hào);在線程提取接收?qǐng)?bào) 文序列號(hào)的地方,將接收?qǐng)?bào)文序列號(hào)賦給線程序列號(hào)thrd_seq。步驟S903 保序恢復(fù)點(diǎn)處將線程序列號(hào)thrd_seq置為_1,表示該報(bào)文序列號(hào)已經(jīng) 被正?!搬尫拧?。步驟S904 線程在每次接收下一個(gè)報(bào)文之前判斷線程序列號(hào)的有效性。判斷線程序列號(hào)thrd_Seq是否等于-1,相等說明線程處理的上一個(gè)報(bào)文的序列 號(hào)已經(jīng)被正?!搬尫拧?,重復(fù)步驟S902 ;否則說明上一個(gè)報(bào)文的序列號(hào)“丟失”,需要將thrd_ seq送入保序單元來(lái)“釋放”報(bào)文序列號(hào),進(jìn)入保序單元。本發(fā)明的上述實(shí)施例實(shí)現(xiàn)過程簡(jiǎn)單,能夠克服大流量情況下出現(xiàn)的單線程保序現(xiàn) 象,避免個(gè)別線程負(fù)荷過重,能很好的解決流控失效問題。異常保護(hù)機(jī)制使保序單元在序列 號(hào)丟失及錯(cuò)誤的情況下也能正常工作,因此,保序策略更加完善,保序功能更加穩(wěn)定有效。 通過本發(fā)明的上述實(shí)施例,克服了現(xiàn)有軟件保序的不足,實(shí)現(xiàn)一種更加完善、穩(wěn)定的軟件保 序方法。顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用 的計(jì)算裝置來(lái)實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算裝置上,或者分布在多個(gè)計(jì)算裝置所組成 的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來(lái)實(shí)現(xiàn),從而,可以將它們存儲(chǔ) 在存儲(chǔ)裝置中由計(jì)算裝置來(lái)執(zhí)行,并且在某些情況下,可以以不同于此處的順序執(zhí)行所示 出或描述的步驟,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或 步驟制作成單個(gè)集成電路模塊來(lái)實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技 術(shù)人員來(lái)說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修 改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
一種報(bào)文保序方法,其特征在于,包括以下步驟多個(gè)線程競(jìng)爭(zhēng)原子鎖;得到所述原子鎖的線程對(duì)保序隊(duì)列中的預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理,并在處理之后,釋放所述原子鎖。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,判斷所述保序隊(duì)列中的當(dāng)前節(jié)點(diǎn)的狀態(tài);在所述當(dāng)前節(jié)點(diǎn)的狀態(tài)為有效的情況下,所述多個(gè)線程競(jìng)爭(zhēng)所述原子鎖。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,判斷當(dāng)前報(bào)文的序列號(hào)和期望序列號(hào)是否相同;在相同的情況下,得到所述原子鎖的線程對(duì)所述當(dāng)前節(jié)點(diǎn)的報(bào)文進(jìn)行保序處理。
4.根據(jù)權(quán)利要求1至3中任一項(xiàng)所述的方法,其特征在于,得到所述原子鎖的線程對(duì)所 述預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理包括獲取所述原子鎖的線程判斷所述保序隊(duì)列中的當(dāng)前節(jié)點(diǎn)的狀態(tài),在所述當(dāng)前節(jié)點(diǎn)的狀 態(tài)為有效的情況下,得到所述原子鎖的線程對(duì)所述預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理。
5.根據(jù)權(quán)利要求1至3中任一項(xiàng)所述的方法,其特征在于,得到所述原子鎖的線程對(duì)所 述預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理包括得到所述原子鎖的線程比較當(dāng)前報(bào)文的序列號(hào)和期望序列號(hào),在兩者相同的情況下, 將所述當(dāng)前報(bào)文發(fā)送至對(duì)應(yīng)的端口;在將所述當(dāng)前報(bào)文發(fā)送至對(duì)應(yīng)的端口之后,得到所述原子鎖的線程進(jìn)行下一個(gè)報(bào)文的 處理或者釋放所述原子鎖。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于,還包括每個(gè)線程在接收?qǐng)?bào)文之前,判斷該線程的共享變量的值,在該線程的共享變量的值不 是初始值的情況下,確定上一個(gè)報(bào)文的序列號(hào)丟失,并將丟失的報(bào)文序列號(hào)送入保序單元 釋放所述丟失的報(bào)文序列號(hào);其中,所述每個(gè)線程均對(duì)應(yīng)一個(gè)共享變量;在該線程的共享變量的值是初始值的情況下,接收?qǐng)?bào)文,并將接收到的所述報(bào)文的序 列號(hào)賦給該線程的共享變量,在接收到的所述報(bào)文進(jìn)入所述保序單元之后,將所述共享變 量的值恢復(fù)為初始值。
7.根據(jù)權(quán)利要求1所述的方法,其特征在于,未得到所述原子鎖的線程返回。
8.一種報(bào)文保序系統(tǒng),其特征在于,包括競(jìng)爭(zhēng)模塊,用于使多個(gè)線程競(jìng)爭(zhēng)原子鎖;處理模塊,用于使得到所述原子鎖的線程對(duì)保序隊(duì)列中的預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理, 并在處理之后,釋放所述原子鎖。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述處理模塊,還用于使得到所述原子鎖的線程比較當(dāng)前報(bào)文的序列號(hào)和期望序列 號(hào),在兩者相同的情況下,將所述當(dāng)前報(bào)文發(fā)送至對(duì)應(yīng)的端口 ;并在將所述當(dāng)前報(bào)文發(fā)送至 對(duì)應(yīng)的端口之后,獲取所述原子鎖的線程進(jìn)行下一個(gè)報(bào)文的處理或者釋放所述原子鎖。
10.根據(jù)權(quán)利要求8或9所述的系統(tǒng),其特征在于,還包括異常處理模塊,用于使所述多個(gè)線程中的每個(gè)線程在接收?qǐng)?bào)文之前,判斷該線程的共 享變量的值,在該線程的共享變量的值不是初始值的情況下,確定上一個(gè)報(bào)文的序列號(hào)丟失,并將丟失的報(bào)文序列號(hào)送入保序單元釋放所述丟失的報(bào)文序列號(hào);其中,所述每個(gè)線程 均對(duì)應(yīng)一個(gè)共享變量;在該線程的共享變量的值是初始值的情況下,接收?qǐng)?bào)文,并將接收 到的所述報(bào)文的序列號(hào)賦給該線程的共享變量,在接收到的所述報(bào)文進(jìn)入所述保序單元之 后,將所述共享變量的值恢復(fù)為初始值。
全文摘要
本發(fā)明公開了一種報(bào)文保序方法及系統(tǒng),該方法包括以下步驟多個(gè)線程競(jìng)爭(zhēng)原子鎖;得到該原子鎖的線程對(duì)保序隊(duì)列中的預(yù)定個(gè)數(shù)的報(bào)文進(jìn)行處理,并在處理之后,釋放該原子鎖。通過本發(fā)明完善了保序處理。
文檔編號(hào)H04L12/56GK101854302SQ201010190599
公開日2010年10月6日 申請(qǐng)日期2010年5月27日 優(yōu)先權(quán)日2010年5月27日
發(fā)明者劉志遠(yuǎn), 曹彪, 趙豐收 申請(qǐng)人:中興通訊股份有限公司