一種先入先出隊(duì)列調(diào)度方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種先入先出隊(duì)列調(diào)度方法和裝置,本發(fā)明方案未使用自旋鎖,以原子操作讀取FIFO隊(duì)列的當(dāng)前頭計(jì)數(shù)H和尾計(jì)數(shù)T,在原子比較交換函數(shù)中完成判斷是否有其它核執(zhí)行入隊(duì)或出隊(duì)操作及實(shí)際入隊(duì)或出隊(duì)計(jì)數(shù)的計(jì)數(shù)操作。本發(fā)明中,需要多核互斥操作的保護(hù)代碼段的范圍很小,沒有多核加鎖和解鎖的開銷,能夠提高多核設(shè)備對FIFO隊(duì)列的調(diào)度效率。
【專利說明】一種先入先出隊(duì)列調(diào)度方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)通信領(lǐng)域,特別涉及一種先入先出(First In First Out, FIFO)隊(duì)列調(diào)度方法及裝置。
【背景技術(shù)】
[0002]FIFO隊(duì)列是數(shù)據(jù)通信設(shè)備支持的最基本的一種隊(duì)列形式,采用單獨(dú)隊(duì)列的形式,可以緩存多個(gè)數(shù)據(jù)報(bào)文,隊(duì)列長度通??膳渲?,數(shù)據(jù)報(bào)文以先進(jìn)先出的方式完成隊(duì)列調(diào)度。
[0003]目前,在現(xiàn)有多核系統(tǒng)中實(shí)現(xiàn)FIFO隊(duì)列,通常以自旋鎖(spinlock)的方式完成入、出隊(duì)的調(diào)度,以自旋鎖方式實(shí)現(xiàn)FIFO隊(duì)列的調(diào)度時(shí),多個(gè)核心以搶占模式互斥執(zhí)行隊(duì)列入隊(duì)和出隊(duì),以入隊(duì)為例,當(dāng)某個(gè)核執(zhí)行入隊(duì)操作時(shí),會(huì)嘗試對入隊(duì)操作加鎖,如果加鎖成功,則在加鎖成功到報(bào)文入隊(duì)完成的整個(gè)過程中,其他核不能并發(fā)執(zhí)行入隊(duì)操作,只能等待入隊(duì)操作解鎖后,其它的核心才能通過搶奪入隊(duì)鎖的方式執(zhí)行入隊(duì)操作,因此在自旋鎖模式下,入隊(duì)出隊(duì)操作仍然類似于單線程模式,其本質(zhì)仍然是一個(gè)生產(chǎn)者,一個(gè)消費(fèi)者的模型,入隊(duì)和出隊(duì)的過程不能并發(fā)。并且,由于多核自旋鎖自身加鎖、解鎖的CPU開銷較大,降低了 CPU處理性能。
[0004]另外,多核自旋鎖以自旋的方式等待,隊(duì)列入隊(duì)、出隊(duì)的過程都在臨界區(qū)中,執(zhí)行互斥保護(hù)的程序代碼段范圍較大,無法充分發(fā)揮多核并發(fā)的優(yōu)勢。
[0005]可見,多核系統(tǒng)中以自旋鎖方式實(shí)現(xiàn)FIFO隊(duì)列,對隊(duì)列的調(diào)度性能有較大影響。
【發(fā)明內(nèi)容】
[0006]有鑒于此,本發(fā)明實(shí)施例的目的之一在于提出一種隊(duì)列調(diào)度方法,用于解決多核設(shè)備采用自旋鎖實(shí)現(xiàn)FIFO隊(duì)列調(diào)度時(shí),加解鎖開銷大,多核并發(fā)處理性能較差的計(jì)數(shù)問題。
[0007]進(jìn)一步來講,該方法包括:
[0008]在報(bào)文入隊(duì)時(shí):以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur,當(dāng)判定當(dāng)前隊(duì)列未滿時(shí),在原子比較交換函數(shù)中判斷當(dāng)前的隊(duì)列尾計(jì)數(shù)T是否等于所述緩存變量Tcur,若相等,則在所述原子比較交換函數(shù)中將當(dāng)前隊(duì)列尾計(jì)數(shù)T指向下一待入隊(duì)位置,若不相等,則所述原子比較交換函數(shù)直接返回當(dāng)前的隊(duì)列尾計(jì)數(shù)T的值;判斷函數(shù)返回值與所述緩存變量Tcur值是否相等,若相等則以所述緩存變量Tcur對隊(duì)列總長度S取余所得值作為入隊(duì)位置執(zhí)行報(bào)文入隊(duì)操作;若不相等則返回所述以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur的步驟,再次執(zhí)行上述入隊(duì)步驟;
[0009]在報(bào)文出隊(duì)時(shí):以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur,當(dāng)判定當(dāng)前隊(duì)列不為空時(shí),在原子比較交換函數(shù)中判斷當(dāng)前隊(duì)列頭計(jì)數(shù)H是否等于所述緩存變量Hcur,若相等,則在所述原子比較交換函數(shù)中將當(dāng)前隊(duì)列頭計(jì)數(shù)H指向下一待出隊(duì)位置,若不相等,則所述原子比較交換函數(shù)直接返回當(dāng)前隊(duì)列頭計(jì)數(shù)H的值;判斷函數(shù)返回值與所述緩存變量Hcur,若相等則以所述緩存變量Hcur對隊(duì)列總長度S取余所得值作為出隊(duì)位置執(zhí)行報(bào)文出隊(duì)操作;若不相等則返回到所述以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur的步驟,再次執(zhí)行上述出隊(duì)步驟;
[0010]其中,所述隊(duì)列尾計(jì)數(shù)T和隊(duì)列頭計(jì)數(shù)H為原子變量。
[0011 ] 在一些實(shí)施例中,所述隊(duì)列總長度S大于等于隊(duì)列配置長度L與核數(shù)N之和,所述隊(duì)列配置長度L為預(yù)配置的隊(duì)列緩存報(bào)文的最大數(shù)目,所述核數(shù)N為多核設(shè)備的處理器核心數(shù)目。
[0012]在一些實(shí)施例中,所述在報(bào)文入隊(duì)時(shí),判斷當(dāng)前隊(duì)列未滿的方法為:判斷緩存變量Tcur減去所述變量隊(duì)列頭計(jì)數(shù)H與隊(duì)列配置長度L之和是否小于0,小于O表示隊(duì)列未滿,否則表示隊(duì)列已滿。
[0013]在一些實(shí)施例中,所述在報(bào)文出隊(duì)時(shí),判斷當(dāng)前隊(duì)列不為空的方法為:以Hcur減去隊(duì)列尾計(jì)數(shù)T,當(dāng)差值小于O時(shí)表示隊(duì)列不為空,否則表示隊(duì)列為空。
[0014]在一些實(shí)施例中,所述隊(duì)列通過隊(duì)列頭計(jì)數(shù)H和隊(duì)列尾計(jì)數(shù)T在達(dá)到其表達(dá)范圍上限后的回繞實(shí)現(xiàn)隊(duì)列存儲(chǔ)空間的循環(huán)使用。
[0015]本發(fā)明實(shí)施例的另一目的在于提出一種先入先出隊(duì)列調(diào)度裝置,該裝置包括入隊(duì)模塊和出隊(duì)模塊;
[0016]所述入隊(duì)模塊包括:
[0017]入隊(duì)預(yù)處理單元,用于以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur,及判斷當(dāng)前隊(duì)列是否已滿,在隊(duì)列未滿時(shí)指令原子比較交換單元執(zhí)行;
[0018]入隊(duì)原子比較交換單元,用于執(zhí)行入隊(duì)原子比較交換函數(shù),在入隊(duì)原子比較交換函數(shù)中判斷當(dāng)前的隊(duì)列尾計(jì)數(shù)T是否等于所述緩存變量Tcur,若相等,則在所述入隊(duì)原子比較交換函數(shù)中將當(dāng)前隊(duì)列尾計(jì)數(shù)T指向下一待入隊(duì)位置,若不相等,則所述入隊(duì)原子比較交換函數(shù)直接返回當(dāng)前的隊(duì)列尾計(jì)數(shù)T的值;
[0019]入隊(duì)判斷單元,用于判斷所述入隊(duì)原子比較交換函數(shù)的返回值與所述緩存變量Tcur值是否相等,若相等則指令入隊(duì)單元執(zhí)行,否則指令預(yù)處理單元再次執(zhí)行;
[0020]入隊(duì)單元,用于以所述緩存變量Tcur對隊(duì)列總長度S取余所得值作為入隊(duì)位置執(zhí)行報(bào)文入隊(duì)操作;
[0021]所述出隊(duì)模塊包括:
[0022]出隊(duì)預(yù)處理單元,用于以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur,以及判斷當(dāng)前隊(duì)列是否為空,若不為空則指令出隊(duì)原子比較交換單元執(zhí)行;
[0023]出隊(duì)原子比較交換單元,用于執(zhí)行出隊(duì)原子比較交換函數(shù),在出隊(duì)原子比較交換函數(shù)中判斷當(dāng)前隊(duì)列頭計(jì)數(shù)H是否等于所述緩存變量Hcur,若相等,則在所述出隊(duì)原子比較交換函數(shù)中將當(dāng)前隊(duì)列頭計(jì)數(shù)H指向下一待出隊(duì)位置,若不相等,則所述出隊(duì)原子比較交換函數(shù)直接返回當(dāng)前隊(duì)列頭計(jì)數(shù)H的值;
[0024]出隊(duì)判斷單元,用于判斷出隊(duì)原子比較交換函數(shù)返回值與所述緩存變量Hcur,若相等則指令出隊(duì)單元執(zhí)行,否則指令出隊(duì)預(yù)處理單元執(zhí)行再次執(zhí)行;
[0025]出隊(duì)單元,用于以所述緩存變量Hcur對隊(duì)列總長度S取余所得值作為出隊(duì)位置執(zhí)行報(bào)文出隊(duì)操作;
[0026]其中,所述隊(duì)列尾計(jì)數(shù)T和隊(duì)列頭計(jì)數(shù)H為原子變量。
[0027]在一些實(shí)施例中,所述隊(duì)列總長度S大于等于隊(duì)列配置長度L與核數(shù)N之和,所述隊(duì)列配置長度L為預(yù)配置的隊(duì)列緩存報(bào)文的最大數(shù)目,所述核數(shù)N為多核設(shè)備的處理器核心數(shù)目。
[0028]在一些實(shí)施例中,所述入隊(duì)預(yù)處理單元判斷當(dāng)前隊(duì)列是否已滿的方法為:判斷緩存變量Tcur減去所述變量隊(duì)列頭計(jì)數(shù)H與隊(duì)列配置長度L之和是否小于0,小于O表示隊(duì)列未滿,否則表示隊(duì)列已滿。
[0029]在一些實(shí)施例中,所述出隊(duì)預(yù)處理單元判斷判斷當(dāng)前隊(duì)列是否為空的方法為:以Hcur減去隊(duì)列尾計(jì)數(shù)T,當(dāng)差值小于O時(shí)表示隊(duì)列不為空,否則表示隊(duì)列為空。
[0030]在一些實(shí)施例中,所述入隊(duì)原子比較交換單元和所述出隊(duì)原子比較交換單元通過隊(duì)列頭計(jì)數(shù)H和隊(duì)列尾計(jì)數(shù)T在達(dá)到其表達(dá)范圍上限后的回繞實(shí)現(xiàn)隊(duì)列存儲(chǔ)空間的循環(huán)使用。
[0031]相對于現(xiàn)有技術(shù),本發(fā)明具有以下優(yōu)勢:
[0032]本發(fā)明方案未使用自旋鎖,以原子操作讀取FIFO隊(duì)列的當(dāng)前頭計(jì)數(shù)H和尾計(jì)數(shù)T,在原子比較交換函數(shù)中完成判斷是否有其它核執(zhí)行入隊(duì)或出隊(duì)操作及實(shí)際入隊(duì)或出隊(duì)計(jì)數(shù)的計(jì)數(shù)操作。本發(fā)明中,需要多核互斥操作的保護(hù)代碼段的范圍很小,沒有多核加鎖和解鎖的開銷,能夠提高多核設(shè)備對FIFO隊(duì)列的調(diào)度效率。
【專利附圖】
【附圖說明】
[0033]構(gòu)成本發(fā)明實(shí)施例一部分的附圖用來提供對本發(fā)明實(shí)施例的進(jìn)一步理解,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:
[0034]圖1為本發(fā)明實(shí)施例提供的一種多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度方法所使用的隊(duì)列數(shù)據(jù)結(jié)構(gòu)示意圖;
[0035]圖2為本發(fā)明實(shí)施例提供的一種多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度方法中的報(bào)文入隊(duì)方法流程圖;
[0036]圖3為本發(fā)明實(shí)施例提供的一種多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度方法中的報(bào)文出隊(duì)方法流程圖;
[0037]圖4為本發(fā)明實(shí)施例提供的一種多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度裝置結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0038]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0039]需要說明的是,在不沖突的情況下,本發(fā)明實(shí)施例及實(shí)施例中的特征可以相互組口 ο
[0040]下面結(jié)合附圖,對本發(fā)明的各優(yōu)選實(shí)施例作進(jìn)一步說明:
[0041]圖1為本發(fā)明實(shí)施例提供的多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度方法所使用的隊(duì)列數(shù)據(jù)結(jié)構(gòu)示意圖,在本發(fā)明一實(shí)施例中,隊(duì)列數(shù)據(jù)結(jié)構(gòu)采用數(shù)組結(jié)構(gòu),每個(gè)數(shù)組單元為一個(gè)報(bào)文指針,指向?qū)嶋H存儲(chǔ)報(bào)文的內(nèi)存單元,本發(fā)明不限定該隊(duì)列的數(shù)據(jù)結(jié)構(gòu),任意能夠?qū)崿F(xiàn)本發(fā)明方法的數(shù)據(jù)結(jié)構(gòu)都應(yīng)包括在本發(fā)明的保護(hù)范圍之內(nèi),例如也可以采用鏈表結(jié)構(gòu)。如圖1所示,其中:
[0042]隊(duì)列配置長度L:為隊(duì)列需要緩存報(bào)文的最大報(bào)文數(shù)目,可以根據(jù)系統(tǒng)參數(shù)進(jìn)行配置,為大于等于I的正整數(shù)。由于隊(duì)列受到系統(tǒng)資源的限制,不能無限緩存報(bào)文,需要有一個(gè)緩存上限,該上限即為緩存的最大報(bào)文數(shù)目,該值在各設(shè)備中可以是不一樣的,本發(fā)明不做具體限定。
[0043]核數(shù)N:為多核設(shè)備的處理器核心數(shù)目,如中央處理單元CPU的數(shù)目,該值可從操作系統(tǒng)中獲取。
[0044]隊(duì)列總長度S:為隊(duì)列總的報(bào)文緩沖區(qū)大小,即隊(duì)列總的可緩存報(bào)文的個(gè)數(shù),由計(jì)算所得,大于等于L+N,通常指定為L+N。
[0045]隊(duì)列頭計(jì)數(shù)H:記錄隊(duì)列中報(bào)文頭的位置。通常初始化為0,為原子變量,以原子方式執(zhí)行操作,當(dāng)達(dá)到該變量表達(dá)范圍上限值時(shí),將會(huì)被重置為O。
[0046]隊(duì)列尾計(jì)數(shù)T:記錄隊(duì)列中報(bào)文尾的位置。通常初始化為0,為原子變量,以原子方式執(zhí)行操作,當(dāng)達(dá)到該變量表達(dá)范圍上限值時(shí),將會(huì)被重置為O。
[0047]隊(duì)列緩沖區(qū)以頭尾計(jì)數(shù)在達(dá)到其表達(dá)范圍上限后的回繞實(shí)現(xiàn)隊(duì)列存儲(chǔ)空間的循環(huán)使用,例如T初始化為0,當(dāng)其為雙字節(jié)16比特位時(shí),其表達(dá)范圍為O?65535,當(dāng)其值超過65535時(shí)將被重置為O即實(shí)現(xiàn)回繞操作。
[0048]基于上述隊(duì)列數(shù)據(jù)結(jié)構(gòu),本發(fā)明實(shí)施例提供的一種多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度方法,該方法包括步驟:
[0049]在報(bào)文入隊(duì)時(shí):以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur,當(dāng)判定當(dāng)前隊(duì)列未滿時(shí),在原子比較交換函數(shù)中判斷當(dāng)前的隊(duì)列尾計(jì)數(shù)T是否等于所述緩存變量Tcur,若相等,則在所述原子比較交換函數(shù)中將當(dāng)前隊(duì)列尾計(jì)數(shù)T指向下一待入隊(duì)位置(例如對T做自增操作),若不相等,則所述原子比較交換函數(shù)直接返回當(dāng)前的隊(duì)列尾計(jì)數(shù)T的值;判斷函數(shù)返回值與所述緩存變量Tcur值是否相等,若相等則以所述緩存變量Tcur對隊(duì)列總長度S取余所得值(即Tcur^S)作為入隊(duì)位置執(zhí)行報(bào)文入隊(duì)操作;若不相等則返回所述以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur的步驟,再次執(zhí)行上述入隊(duì)步驟;
[0050]其中,原子比較交換函數(shù)中判斷當(dāng)前的隊(duì)列尾計(jì)數(shù)T是否等于緩存變量Tcur的目的是判斷在執(zhí)行該原子操作之前,是否有其它核執(zhí)行了入隊(duì)操作,從而導(dǎo)致當(dāng)前的T與之前獲得Tcur不同。
[0051]在報(bào)文出隊(duì)時(shí):以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur,當(dāng)判定當(dāng)前隊(duì)列不為空時(shí),在原子比較交換函數(shù)中判斷當(dāng)前隊(duì)列頭計(jì)數(shù)H是否等于所述緩存變量Hcur,若相等,則在所述原子比較交換函數(shù)中將當(dāng)前隊(duì)列頭計(jì)數(shù)H指向下一待出隊(duì)位置(例如對H做自增操作),若不相等,則所述原子比較交換函數(shù)直接返回當(dāng)前隊(duì)列頭計(jì)數(shù)H的值;判斷函數(shù)返回值與所述緩存變量Hcur,若相等則以所述緩存變量Hcur對隊(duì)列總長度S取余所得值(即Hcur^ S)作為出隊(duì)位置執(zhí)行報(bào)文出隊(duì)操作;若不相等則返回到所述以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur的步驟,再次執(zhí)行上述出隊(duì)步驟。
[0052]其中,原子比較交換函數(shù)中判斷當(dāng)前的隊(duì)列尾計(jì)數(shù)H是否等于緩存變量Hcur的目的是判斷在執(zhí)行該原子操作之前,是否有其它核執(zhí)行了出隊(duì)操作,從而導(dǎo)致當(dāng)前的H與之前獲得Hcur不同。
[0053]通過上述步驟可知,本發(fā)明實(shí)施例提供的隊(duì)列調(diào)度方法中,未使用自旋鎖的方式來解決多核并發(fā)入隊(duì)或出隊(duì)導(dǎo)致調(diào)度錯(cuò)誤的問題,本發(fā)明通過原子變量實(shí)現(xiàn)隊(duì)列頭計(jì)數(shù)H和尾計(jì)數(shù)T并采用原子操作對其移位計(jì)數(shù)操作,將入隊(duì)和出隊(duì)多核臨界區(qū)限定在更小的范圍內(nèi)(即原子操作范圍內(nèi)),實(shí)現(xiàn)了多生產(chǎn)者多消費(fèi)者FIFO隊(duì)列調(diào)度模型,能夠更大程度的發(fā)揮了多核CPU并發(fā)的優(yōu)勢,提高數(shù)通設(shè)備的隊(duì)列處理性能。
[0054]圖2為本發(fā)明實(shí)施例提供的一種多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度方法中的報(bào)文入隊(duì)方法流程圖,假設(shè)在該實(shí)施例中,當(dāng)前隊(duì)列的初始狀態(tài)為:隊(duì)列配置長度L為100,核數(shù)N為8,隊(duì)列總長度S (即L+N)為108,隊(duì)列頭計(jì)數(shù)H為500,隊(duì)列尾計(jì)數(shù)T為599,在整個(gè)入隊(duì)過程中,H保持不變。報(bào)文入隊(duì)步驟如下:
[0055]步驟201、以原子讀操作獲取隊(duì)列尾計(jì)數(shù)原子變量T的值,并賦值給緩存變量Tcur ;
[0056]例如當(dāng)T值為599,通過原子讀函數(shù)atomic_read(T)讀取T的值賦值給Tcur,則Tcur的值為599。
[0057]步驟202、以Tcur減去原子變量隊(duì)列頭計(jì)數(shù)H與隊(duì)列配置長度L之和,判斷隊(duì)列是否已滿,當(dāng)差值小于O時(shí)表示隊(duì)列未滿,則執(zhí)行步驟203,否則執(zhí)行步驟206 ;
[0058]例如當(dāng)H為500,L為100時(shí),判斷Tcur-(H+L)是否小于零,當(dāng)Tcur為599時(shí),則差值小于零,說明隊(duì)列未滿,否則說明隊(duì)列已滿。
[0059]步驟203、通過原子比較交換函數(shù)完成:判斷當(dāng)前隊(duì)列尾計(jì)數(shù)T是否等于所述緩存變量Tcur,若相等,則在原子比較交換函數(shù)中將隊(duì)列尾計(jì)數(shù)T加1,并返回原隊(duì)列尾計(jì)數(shù)T的值即加I之前的值給中間變量Told,若不相等,則直接返回當(dāng)前隊(duì)列尾計(jì)數(shù)T的值給中間變量Told。
[0060]本發(fā)明實(shí)施例中用到原子比較交換函數(shù)atomic_cmpxchg(a, b, c),其中a為原子變量,b和c為目標(biāo)參數(shù)。各數(shù)通操作系統(tǒng)(包括Linux等)都提供原子變量類型及一組原子變量的操作處理,本發(fā)明中在原子比較交換函數(shù)中對原子變量a進(jìn)行的原子變量操作具有原子性,能夠保證并發(fā)寫入原子變量臨界區(qū)的正確性。
[0061]該原子比較交換函數(shù)的功能包括:原子變量a與目標(biāo)參數(shù)b進(jìn)行比較,若a與b相等,將a交換成目標(biāo)參數(shù)c并返回原原子變量a的值即交換之前的值,若a與b不相等,則直接返回原子變量a的值。該函數(shù)過程滿足原子性,不可中斷。
[0062]例如該步驟執(zhí)行原子比較交換函數(shù)形式為atomic_cmpxchg(T, Tcur, Tcur+1),假設(shè)在執(zhí)行該原子函數(shù)時(shí),T = Tcur,則說明在執(zhí)行該函數(shù)前,沒有其它核執(zhí)行了入隊(duì)操作,則在該原子函數(shù)對原子變量T加I (即將Tcur+Ι的值賦值給T),并返回原T的值給Told,例如Tcur為599,T當(dāng)前也為599時(shí),在該原子函數(shù)中T變?yōu)?00,并函數(shù)返回值為599給Told。假設(shè)在執(zhí)行該原子函數(shù)時(shí),T fTcur,則說明在執(zhí)行該函數(shù)前,有其他核執(zhí)行了入隊(duì)操作,則該原子函數(shù)直接返回當(dāng)前的原子變量T的值給Told,例如Tcur為599,T當(dāng)前值為600,則該原子函數(shù)不對T做任何操作,直接返回600的值給Told。
[0063]步驟204、通過Told和Tcur的比較判斷在執(zhí)行原子比較交換函數(shù)時(shí),是否有其他核做入隊(duì)操作,如果有即Told ? Tcur時(shí),返回步驟201,如果沒有即Told = Tcur時(shí),執(zhí)行步驟205 ;
[0064]步驟205、依據(jù)緩存變量Tcur,將緩存變量Tcur對隊(duì)列總長度S取余后的值作為入隊(duì)位置執(zhí)行報(bào)文入隊(duì)操作,流程結(jié)束。
[0065]在該步驟中,由于報(bào)文實(shí)際入隊(duì)的位置已通過緩存變量Tcur保存了下來,所以在原子比較交換函數(shù)之后其他核的入隊(duì)操作將不會(huì)影響當(dāng)前報(bào)文的入隊(duì)操作。
[0066]步驟206、丟棄報(bào)文,結(jié)束流程。
[0067]圖3本發(fā)明實(shí)施例提供的一種多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度方法中的報(bào)文出隊(duì)方法流程圖,假設(shè)在該實(shí)施例中,當(dāng)前隊(duì)列的初始狀態(tài)為:隊(duì)列配置長度L為100,核數(shù)N為8,隊(duì)列總長度S (即L+N)為108,隊(duì)列頭計(jì)數(shù)H為550,隊(duì)列尾計(jì)數(shù)T為600,在整個(gè)出隊(duì)過程中,T保持不變。報(bào)文出隊(duì)步驟如下:
[0068]步驟301、以原子讀操作獲取隊(duì)列頭計(jì)數(shù)原子變量H的值,并賦值給緩存變量Hcur ;
[0069]例如當(dāng)H值為550,通過原子讀函數(shù)atomic_read(H)讀取H的值賦值給Hcur,貝丨JHcur的值為550。
[0070]步驟302、以Hcur減去原子變量隊(duì)列尾計(jì)數(shù)T,判斷隊(duì)列是否為空,當(dāng)差值小于O時(shí)表示隊(duì)列不為空,則執(zhí)行步驟303,否則結(jié)束流程;
[0071]例如當(dāng)T為600,Hcur為550時(shí),判斷Hcur-T小于零,說明隊(duì)列不為空,可以執(zhí)行報(bào)文出隊(duì)操作,否則說明隊(duì)列為空,不能執(zhí)行報(bào)文出隊(duì)操作。
[0072]步驟303、通過原子比較交換函數(shù)完成:判斷當(dāng)前隊(duì)列頭計(jì)數(shù)H是否等于所述緩存變量Hcur,若相等,則在原子比較交換函數(shù)中將隊(duì)列頭計(jì)數(shù)H加1,并返回原隊(duì)列頭計(jì)數(shù)H的值即加I之前的值給中間變量Hold,若不相等,則直接返回當(dāng)前隊(duì)列頭計(jì)數(shù)H的值給中間變量Hold。
[0073]如該步驟執(zhí)行原子比較交換函數(shù)形式為atomic_cmpxchg(H, Hcur, Hcur+1),假設(shè)在執(zhí)行該原子函數(shù)時(shí),H = Hcur,則說明在執(zhí)行該函數(shù)前,沒有其它核執(zhí)行了出隊(duì)操作,則在該原子函數(shù)對原子變量H加I (即將Hcur+1的值賦值給H),并返回原H的值給Hold。假設(shè)在執(zhí)行該原子函數(shù)時(shí),H古Hcur,則說明在執(zhí)行該函數(shù)前,有其他核執(zhí)行了出隊(duì)操作,則該原子函數(shù)直接返回當(dāng)前的原子變量H的值給Hold。
[0074]步驟304、通過Hold和Hcur的比較判斷在執(zhí)行原子比較交換函數(shù)時(shí),是否有其他核做出隊(duì)操作,如果有即Hold ? Hcur時(shí),返回步驟301,如果沒有即Hold = Hcur時(shí),執(zhí)行步驟305 ;
[0075]步驟305、依據(jù)緩存變量Hcur,將緩存變量Hcur對隊(duì)列總長度S取余后的值作為出隊(duì)位置執(zhí)行報(bào)文出隊(duì)操作,流程結(jié)束。
[0076]在該步驟中,由于報(bào)文實(shí)際出隊(duì)的位置已通過緩存變量Hcur保存了下來,所以在原子比較交換函數(shù)之后其他核的出隊(duì)操作將不會(huì)影響當(dāng)前報(bào)文的出隊(duì)操作。
[0077]以下說明本發(fā)明實(shí)施例中將S設(shè)定為S彡H+L的原因:
[0078]本發(fā)明實(shí)施例中,步驟303 (P3)為隊(duì)列頭原子變量H操作,步驟305 (P4)為報(bào)文實(shí)際出隊(duì)列的操作,在步驟303和305之間,有若干個(gè)CPU時(shí)鐘周期的時(shí)間差(和具體的CPU相關(guān),通常在O到20個(gè)時(shí)鐘周期之間),步驟303中對H的操作先完成,步驟305中出隊(duì)操作后完成。
[0079]本發(fā)明實(shí)施例中,步驟203(P1)為隊(duì)列尾原子變量T操作,步驟205 (P2),P2為實(shí)際的報(bào)文入隊(duì)列的操作,在步驟203和205之間,有若干個(gè)CPU時(shí)鐘周期的時(shí)間差(和具體的CPU相關(guān),通常在O到20個(gè)時(shí)鐘周期之間),步驟203中T的操作先完成,步驟205中入隊(duì)操作后完成。
[0080]如果沒有S彡L+N的限制,而是S = L,那么存在如下問題:
[0081]當(dāng)隊(duì)列已滿時(shí)即(H等于T時(shí)),假設(shè)有兩個(gè)CPU,CPUl執(zhí)行出隊(duì)(步驟303和305),CPU2執(zhí)行入隊(duì)(步驟203和步驟205),在絕對時(shí)間上以步驟303 —步驟203 —步驟205 —步驟305的順序來完成出隊(duì)和入隊(duì)的操作。
[0082]則CPUl執(zhí)行步驟303過程后,H已釋放一個(gè)緩存空間,CPU2滿足了入隊(duì)條件,執(zhí)行步驟203,隨后執(zhí)行步驟205,這樣CPUl的步驟305報(bào)文出隊(duì)列實(shí)際出了 CPU2在步驟205中入隊(duì)的報(bào)文,導(dǎo)致調(diào)度錯(cuò)誤。
[0083]隊(duì)列緩存區(qū)提供了額外的CPU個(gè)數(shù)的擴(kuò)展緩沖區(qū)(即隊(duì)列緩沖區(qū)總長度S大于等于隊(duì)列配置長度L+核數(shù)N),這樣即便所有的CPU同時(shí)并發(fā),也能夠避免隊(duì)列尾原子變量T計(jì)算的隊(duì)列緩沖區(qū)的入隊(duì)計(jì)數(shù)(即T%S)回繞到隊(duì)列頭原子變量H計(jì)算的隊(duì)列緩沖區(qū)的出隊(duì)計(jì)數(shù)(H% S) 0
[0084]本發(fā)明實(shí)施例通過原子變量及其操作,將入隊(duì)和出隊(duì)多核臨界區(qū)限定在更小的范圍內(nèi)(原子操作范圍內(nèi)),實(shí)現(xiàn)了多生產(chǎn)者多消費(fèi)者FIFO隊(duì)列調(diào)度模型,能夠更大程度的發(fā)揮了多核CPU并發(fā)的優(yōu)勢,提高數(shù)通設(shè)備的隊(duì)列處理性能。
[0085]基于上述方法實(shí)施例,本發(fā)明實(shí)施例還提供一種多核系統(tǒng)下無自旋鎖的支持多生產(chǎn)者多消費(fèi)者的FIFO隊(duì)列調(diào)度裝置,其結(jié)構(gòu)示意圖如圖4所示:
[0086]基于與上述方法實(shí)施例相同的原理,本發(fā)明實(shí)施例還提供一種先入先出隊(duì)列調(diào)度裝置,該裝置的功能模塊結(jié)構(gòu)示意圖如圖4所示,該裝置400包括:入隊(duì)模塊410和出隊(duì)模塊 420 ;
[0087]入隊(duì)模塊410包括:
[0088]入隊(duì)預(yù)處理單元411,用于以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur,及判斷當(dāng)前隊(duì)列是否已滿,在隊(duì)列未滿時(shí)指令原子比較交換單元執(zhí)行;
[0089]入隊(duì)原子比較交換單元412,用于執(zhí)行入隊(duì)原子比較交換函數(shù),在入隊(duì)原子比較交換函數(shù)中判斷當(dāng)前的隊(duì)列尾計(jì)數(shù)T是否等于所述緩存變量Tcur,若相等,則在所述入隊(duì)原子比較交換函數(shù)中將當(dāng)前隊(duì)列尾計(jì)數(shù)T指向下一待入隊(duì)位置,若不相等,則所述入隊(duì)原子比較交換函數(shù)直接返回當(dāng)前的隊(duì)列尾計(jì)數(shù)T的值;
[0090]入隊(duì)判斷單元413,用于判斷所述入隊(duì)原子比較交換函數(shù)的返回值與所述緩存變量Tcur值是否相等,若相等則指令入隊(duì)單元執(zhí)行,否則指令預(yù)處理單元再次執(zhí)行;
[0091]入隊(duì)單元414,用于以所述緩存變量Tcur對隊(duì)列總長度S取余所得值作為入隊(duì)位置執(zhí)行報(bào)文入隊(duì)操作;
[0092]出隊(duì)模塊420包括:
[0093]出隊(duì)預(yù)處理單元421,用于以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur,以及判斷當(dāng)前隊(duì)列是否為空,若不為空則指令出隊(duì)原子比較交換單元執(zhí)行;
[0094]出隊(duì)原子比較交換單元422,用于執(zhí)行出隊(duì)原子比較交換函數(shù),在出隊(duì)原子比較交換函數(shù)中判斷當(dāng)前隊(duì)列頭計(jì)數(shù)H是否等于所述緩存變量Hcur,若相等,則在所述出隊(duì)原子比較交換函數(shù)中將當(dāng)前隊(duì)列頭計(jì)數(shù)H指向下一待出隊(duì)位置,若不相等,則所述出隊(duì)原子比較交換函數(shù)直接返回當(dāng)前隊(duì)列頭計(jì)數(shù)H的值;
[0095]出隊(duì)判斷單元423,用于判斷出隊(duì)原子比較交換函數(shù)返回值與所述緩存變量Hcur,若相等則指令出隊(duì)單元執(zhí)行,否則指令出隊(duì)預(yù)處理單元執(zhí)行再次執(zhí)行;
[0096]出隊(duì)單元424,用于以所述緩存變量Hcur對隊(duì)列總長度S取余所得值作為出隊(duì)位置執(zhí)行報(bào)文出隊(duì)操作;
[0097]其中,所述隊(duì)列尾計(jì)數(shù)T和隊(duì)列頭計(jì)數(shù)H為原子變量。
[0098]隊(duì)列總長度S大于等于隊(duì)列配置長度L與核數(shù)N之和,隊(duì)列配置長度L為預(yù)配置的隊(duì)列緩存報(bào)文的最大數(shù)目,核數(shù)N為多核設(shè)備的處理器核心數(shù)目。
[0099]進(jìn)一步地,入隊(duì)預(yù)處理單元411判斷當(dāng)前隊(duì)列是否已滿的方法為:判斷緩存變量Tcur減去所述變量隊(duì)列頭計(jì)數(shù)H與隊(duì)列配置長度L之和是否小于0,小于O表示隊(duì)列未滿,否則表示隊(duì)列已滿。
[0100]進(jìn)一步地,出隊(duì)預(yù)處理單元421判斷當(dāng)前隊(duì)列是否為空的方法為:以Hcur減去隊(duì)列尾計(jì)數(shù)T,當(dāng)差值小于O時(shí)表示隊(duì)列不為空,否則表示隊(duì)列為空。
[0101]進(jìn)一步地,入隊(duì)原子比較交換單元412和出隊(duì)原子比較交換單元422通過隊(duì)列頭計(jì)數(shù)H和隊(duì)列尾計(jì)數(shù)T在達(dá)到其表達(dá)范圍上限后的回繞實(shí)現(xiàn)隊(duì)列存儲(chǔ)空間的循環(huán)使用。
[0102]顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計(jì)算裝置來實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算裝置上,或者分布在多個(gè)計(jì)算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來實(shí)現(xiàn),從而,可以將它們存儲(chǔ)在存儲(chǔ)裝置中由計(jì)算裝置來執(zhí)行,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。所述存儲(chǔ)裝置為非易失性存儲(chǔ)器,如:R0M/RAM、閃存、磁碟、光盤等。
[0103]以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種先入先出隊(duì)列調(diào)度方法,其特征在于,該方法包括: 在報(bào)文入隊(duì)時(shí):以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur,當(dāng)判定當(dāng)前隊(duì)列未滿時(shí),在原子比較交換函數(shù)中判斷當(dāng)前的隊(duì)列尾計(jì)數(shù)T是否等于所述緩存變量Tcur,若相等,則在所述原子比較交換函數(shù)中將當(dāng)前隊(duì)列尾計(jì)數(shù)T指向下一待入隊(duì)位置,若不相等,則所述原子比較交換函數(shù)直接返回當(dāng)前的隊(duì)列尾計(jì)數(shù)T的值;判斷函數(shù)返回值與所述緩存變量Tcur值是否相等,若相等則以所述緩存變量Tcur對隊(duì)列總長度S取余所得值作為入隊(duì)位置執(zhí)行報(bào)文入隊(duì)操作;若不相等則返回所述以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur的步驟,再次執(zhí)行上述入隊(duì)步驟; 在報(bào)文出隊(duì)時(shí):以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur,當(dāng)判定當(dāng)前隊(duì)列不為空時(shí),在原子比較交換函數(shù)中判斷當(dāng)前隊(duì)列頭計(jì)數(shù)H是否等于所述緩存變量Hcur,若相等,則在所述原子比較交換函數(shù)中將當(dāng)前隊(duì)列頭計(jì)數(shù)H指向下一待出隊(duì)位置,若不相等,則所述原子比較交換函數(shù)直接返回當(dāng)前隊(duì)列頭計(jì)數(shù)H的值;判斷函數(shù)返回值與所述緩存變量Hcur,若相等則以所述緩存變量Hcur對隊(duì)列總長度S取余所得值作為出隊(duì)位置執(zhí)行報(bào)文出隊(duì)操作;若不相等則返回到所述以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur的步驟,再次執(zhí)行上述出隊(duì)步驟; 其中,所述隊(duì)列尾計(jì)數(shù)T和隊(duì)列頭計(jì)數(shù)H為原子變量。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述隊(duì)列總長度S大于等于隊(duì)列配置長度L與核數(shù)N之和,所述隊(duì)列配置長度L為預(yù)配置的隊(duì)列緩存報(bào)文的最大數(shù)目,所述核數(shù)N為多核設(shè)備的處理器核心數(shù)目。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于, 所述在報(bào)文入隊(duì)時(shí),判斷當(dāng)前隊(duì)列未滿的方法為:判斷緩存變量Tcur減去所述變量隊(duì)列頭計(jì)數(shù)H與隊(duì)列配置長度L之和是否小于O,小于O表示隊(duì)列未滿,否則表示隊(duì)列已滿。
4.根據(jù)權(quán)利要求2所述的方法,其特征在于, 所述在報(bào)文出隊(duì)時(shí),判斷當(dāng)前隊(duì)列不為空的方法為:以Hcur減去隊(duì)列尾計(jì)數(shù)T,當(dāng)差值小于O時(shí)表示隊(duì)列不為空,否則表示隊(duì)列為空。
5.根據(jù)權(quán)利要求2所述的方法,其特征在于, 所述隊(duì)列通過隊(duì)列頭計(jì)數(shù)H和隊(duì)列尾計(jì)數(shù)T在達(dá)到其表達(dá)范圍上限后的回繞實(shí)現(xiàn)隊(duì)列存儲(chǔ)空間的循環(huán)使用。
6.一種先入先出隊(duì)列調(diào)度裝置,其特征在于,該裝置包括入隊(duì)模塊和出隊(duì)模塊; 所述入隊(duì)模塊包括: 入隊(duì)預(yù)處理單元,用于以原子讀操作獲取隊(duì)列尾計(jì)數(shù)T賦值給緩存變量Tcur,及判斷當(dāng)前隊(duì)列是否已滿,在隊(duì)列未滿時(shí)指令原子比較交換單元執(zhí)行; 入隊(duì)原子比較交換單元,用于執(zhí)行入隊(duì)原子比較交換函數(shù),在入隊(duì)原子比較交換函數(shù)中判斷當(dāng)前的隊(duì)列尾計(jì)數(shù)T是否等于所述緩存變量Tcur,若相等,則在所述入隊(duì)原子比較交換函數(shù)中將當(dāng)前隊(duì)列尾計(jì)數(shù)T指向下一待入隊(duì)位置,若不相等,則所述入隊(duì)原子比較交換函數(shù)直接返回當(dāng)前的隊(duì)列尾計(jì)數(shù)T的值; 入隊(duì)判斷單元,用于判斷所述入隊(duì)原子比較交換函數(shù)的返回值與所述緩存變量Tcur值是否相等,若相等則指令入隊(duì)單元執(zhí)行,否則指令預(yù)處理單元再次執(zhí)行; 入隊(duì)單元,用于以所述緩存變量Tcur對隊(duì)列總長度S取余所得值作為入隊(duì)位置執(zhí)行報(bào)文入隊(duì)操作; 所述出隊(duì)模塊包括: 出隊(duì)預(yù)處理單元,用于以原子讀操作獲取隊(duì)列頭計(jì)數(shù)H賦值給緩存變量Hcur,以及判斷當(dāng)前隊(duì)列是否為空,若不為空則指令出隊(duì)原子比較交換單元執(zhí)行; 出隊(duì)原子比較交換單元,用于執(zhí)行出隊(duì)原子比較交換函數(shù),在出隊(duì)原子比較交換函數(shù)中判斷當(dāng)前隊(duì)列頭計(jì)數(shù)H是否等于所述緩存變量Hcur,若相等,則在所述出隊(duì)原子比較交換函數(shù)中將當(dāng)前隊(duì)列頭計(jì)數(shù)H指向下一待出隊(duì)位置,若不相等,則所述出隊(duì)原子比較交換函數(shù)直接返回當(dāng)前隊(duì)列頭計(jì)數(shù)H的值; 出隊(duì)判斷單元,用于判斷出隊(duì)原子比較交換函數(shù)返回值與所述緩存變量Hcur,若相等則指令出隊(duì)單元執(zhí)行,否則指令出隊(duì)預(yù)處理單元執(zhí)行再次執(zhí)行; 出隊(duì)單元,用于以所述緩存變量Hcur對隊(duì)列總長度S取余所得值作為出隊(duì)位置執(zhí)行報(bào)文出隊(duì)操作; 其中,所述隊(duì)列尾計(jì)數(shù)T和隊(duì)列頭計(jì)數(shù)H為原子變量。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述隊(duì)列總長度S大于等于隊(duì)列配置長度L與核數(shù)N之和,所述隊(duì)列配置長度L為預(yù)配置的隊(duì)列緩存報(bào)文的最大數(shù)目,所述核數(shù)N為多核設(shè)備的處理器核心數(shù)目。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于, 所述入隊(duì)預(yù)處理單元判斷當(dāng)前隊(duì)列是否已滿的方法為:判斷緩存變量Tcur減去所述變量隊(duì)列頭計(jì)數(shù)H與隊(duì)列配置長度L之和是否小于O,小于O表示隊(duì)列未滿,否則表示隊(duì)列已滿。
9.根據(jù)權(quán)利要求7所述的裝置,其特征在于, 所述出隊(duì)預(yù)處理單元判斷判斷當(dāng)前隊(duì)列是否為空的方法為:以Hcur減去隊(duì)列尾計(jì)數(shù)T,當(dāng)差值小于O時(shí)表示隊(duì)列不為空,否則表示隊(duì)列為空。
10.根據(jù)權(quán)利要求7所述的裝置,其特征在于, 所述入隊(duì)原子比較交換單元和所述出隊(duì)原子比較交換單元通過隊(duì)列頭計(jì)數(shù)H和隊(duì)列尾計(jì)數(shù)T在達(dá)到其表達(dá)范圍上限后的回繞實(shí)現(xiàn)隊(duì)列存儲(chǔ)空間的循環(huán)使用。
【文檔編號】H04L12/863GK104168217SQ201410404736
【公開日】2014年11月26日 申請日期:2014年8月15日 優(yōu)先權(quán)日:2014年8月15日
【發(fā)明者】董君 申請人:杭州華三通信技術(shù)有限公司