一種多核環(huán)境下實(shí)現(xiàn)免鎖隊(duì)列的方法和設(shè)備的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,尤其涉及一種多核環(huán)境下實(shí)現(xiàn)免鎖隊(duì)列的方法和設(shè)備。
【背景技術(shù)】
[0002]在數(shù)據(jù)處理領(lǐng)域,隊(duì)列是一種常見的數(shù)據(jù)結(jié)構(gòu),隊(duì)列通常是多個(gè)應(yīng)用模塊間保存共享數(shù)據(jù)的一種方式,典型的隊(duì)列是先入先出(First Input First Output, FIFO)隊(duì)列,其應(yīng)用模式通常是,一個(gè)應(yīng)用模塊把數(shù)據(jù)保存到隊(duì)列的一端中(通??梢苑Q這種產(chǎn)生數(shù)據(jù)的模塊為生產(chǎn)者),而另一個(gè)應(yīng)用模塊在隊(duì)列的另一端把數(shù)據(jù)按照先后順序從隊(duì)列中取出(通??梢苑Q這種取數(shù)據(jù)的模塊為消費(fèi)者)。
[0003]簡單的單生產(chǎn)者單消費(fèi)者FIFO隊(duì)列模型中,生產(chǎn)者把生產(chǎn)出來的數(shù)據(jù)存入隊(duì)列尾中,而消費(fèi)者則從隊(duì)列頭中取出數(shù)據(jù),生產(chǎn)者和消費(fèi)者各司其職,不存在并發(fā)訪問,所以沒有資源競爭的沖突。
[0004]而在有多個(gè)應(yīng)用模塊同時(shí)共享一個(gè)隊(duì)列時(shí),就可能出現(xiàn)以下另外三種情形:多生產(chǎn)者單消費(fèi)者、單生產(chǎn)者多消費(fèi)者和多生產(chǎn)者和多消費(fèi)者。這就導(dǎo)致了可能出現(xiàn)多個(gè)生產(chǎn)者或者多個(gè)消費(fèi)者同時(shí)對隊(duì)列進(jìn)行訪問的情況(通常稱為并發(fā)訪問),這種情況下,如果沒有很好的解決并發(fā)訪問時(shí)的沖突問題,就會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)誤。在計(jì)算機(jī)軟件領(lǐng)域中,通過采用鎖機(jī)制來解決并發(fā)訪問時(shí)的沖突問題。
[0005]鎖機(jī)制的原理如下:當(dāng)某個(gè)模塊要對隊(duì)列進(jìn)行訪問時(shí),先要取得隊(duì)列的鎖,把隊(duì)列占為己有,然后才對隊(duì)列進(jìn)行相應(yīng)的讀寫訪問;當(dāng)隊(duì)列的鎖被某個(gè)模塊取得時(shí),其它模塊無權(quán)對隊(duì)列進(jìn)行訪問。
[0006]這種運(yùn)用鎖機(jī)制把隊(duì)列獨(dú)占的機(jī)制,當(dāng)出現(xiàn)并發(fā)沖突時(shí),沒有取得隊(duì)列鎖的模塊可能需要一直空等待而無法執(zhí)行其它操作(當(dāng)其它操作必需要訪問隊(duì)列之后才能執(zhí)行)。這在單核中央處理器(Central Processing Unit,CPU)的系統(tǒng)中,不會(huì)存在浪費(fèi)CPU資源的問題。
[0007]然而,在多核CPU系統(tǒng)中,假如每個(gè)CPU核運(yùn)行一個(gè)單獨(dú)的應(yīng)用模塊,那么,當(dāng)出現(xiàn)并發(fā)訪問沖突時(shí),等待獲取隊(duì)列鎖的CPU核則會(huì)出現(xiàn)空等待而導(dǎo)致CPU資源浪費(fèi)的情況,進(jìn)而導(dǎo)致系統(tǒng)效率低下的問題。
【發(fā)明內(nèi)容】
[0008]本發(fā)明的目的是提供一種多核環(huán)境下實(shí)現(xiàn)免鎖隊(duì)列的方法和設(shè)備,以解決當(dāng)出現(xiàn)并發(fā)訪問沖突多核CPU在獲取共享隊(duì)列鎖時(shí)由于空等待導(dǎo)致系統(tǒng)效率低的問題。
[0009]本發(fā)明的目的是通過以下技術(shù)方案實(shí)現(xiàn)的:
[0010]一種多核環(huán)境下實(shí)現(xiàn)免鎖隊(duì)列的方法,包括:
[0011]確定一個(gè)環(huán)形隊(duì)列,所述環(huán)形隊(duì)列的存儲(chǔ)結(jié)構(gòu)采用數(shù)組形式存儲(chǔ),所述環(huán)形隊(duì)列包括生產(chǎn)者子隊(duì)列和消費(fèi)者子隊(duì)列;
[0012]當(dāng)生產(chǎn)者有M個(gè)數(shù)據(jù)入隊(duì)時(shí),獲取所述生產(chǎn)者子隊(duì)列的頭指針作為生產(chǎn)者子隊(duì)列初始頭指針,獲取所述消費(fèi)者子隊(duì)列的尾指針作為消費(fèi)者子隊(duì)列第一尾指針,基于所述生產(chǎn)者子隊(duì)列初始頭指針和所述消費(fèi)者子隊(duì)列第一尾指針,確定所述環(huán)形隊(duì)列未滿時(shí),將所述生產(chǎn)者子隊(duì)列初始頭指針加M作為新的生產(chǎn)者子隊(duì)列頭指針,從所述生產(chǎn)者子隊(duì)列初始頭指針開始依次將M個(gè)數(shù)據(jù)加入到所述環(huán)形隊(duì)列中,獲取所述生產(chǎn)者子隊(duì)列的尾指針作為生產(chǎn)者子隊(duì)列初始尾指針,確定所述生產(chǎn)者子隊(duì)列初始尾指針等于所述生產(chǎn)者子隊(duì)列初始頭指針時(shí),將所述生產(chǎn)者子隊(duì)列初始尾指針加M作為新的生產(chǎn)者子隊(duì)列尾指針,入隊(duì)完成,其中M為正整數(shù);
[0013]當(dāng)消費(fèi)者有N個(gè)數(shù)據(jù)出隊(duì)時(shí),獲取所述消費(fèi)者子隊(duì)列的頭指針作為消費(fèi)者子隊(duì)列初始頭指針,獲取所述生產(chǎn)者子隊(duì)列的尾指針作為生產(chǎn)者子隊(duì)列第一尾指針,基于所述消費(fèi)者子隊(duì)列初始頭指針和所述生產(chǎn)者子隊(duì)列第一尾指針,確定所述環(huán)形隊(duì)列未空時(shí),將所述消費(fèi)者子隊(duì)列初始頭指針加N作為新的消費(fèi)者子隊(duì)列的頭指針,從所述消費(fèi)者子隊(duì)列初始頭指針開始依次將N個(gè)數(shù)據(jù)從所述環(huán)形隊(duì)列中清除,獲取所述消費(fèi)者子隊(duì)列的尾指針作為消費(fèi)者子隊(duì)列初始尾指針,確定所述消費(fèi)者子隊(duì)列初始尾指針等于所述消費(fèi)者子隊(duì)列初始頭指針時(shí),將所述消費(fèi)者子隊(duì)列初始尾指針加N作為新的消費(fèi)者子隊(duì)列尾指針,出隊(duì)完成,其中N為正整數(shù)。
[0014]這樣,在多核環(huán)境下實(shí)現(xiàn)免鎖隊(duì)列的過程中在隊(duì)列的入隊(duì)和出隊(duì)操作中,沒有使用隊(duì)列鎖的機(jī)制獨(dú)占隊(duì)列,而是讓多個(gè)模塊同時(shí)訪問隊(duì)列的不同部分,從而有效解決了多生產(chǎn)者或多消費(fèi)者并發(fā)訪問時(shí)的沖突,減少了 CPU核空等待的時(shí)間,進(jìn)而提高了多核系統(tǒng)的效率。
[0015]可選的,所述生產(chǎn)者子隊(duì)列與所述消費(fèi)者子隊(duì)列均可以占據(jù)所述環(huán)形隊(duì)列的任何存儲(chǔ)空間,且針對所述生產(chǎn)者子隊(duì)列和所述消費(fèi)者子隊(duì)列的操作方向相同。
[0016]可選的,進(jìn)一步包括:
[0017]在系統(tǒng)初始化階段,將所述生產(chǎn)者子隊(duì)列的頭指針、所述生產(chǎn)者子隊(duì)列的尾指針、所述消費(fèi)者子隊(duì)列的頭指針和所述消費(fèi)者子隊(duì)列的尾指針均設(shè)置為所述環(huán)形隊(duì)列對應(yīng)的數(shù)組結(jié)構(gòu)的第一個(gè)元素。
[0018]可選的,確定所述環(huán)形隊(duì)列未滿,具體包括:
[0019]當(dāng)生產(chǎn)者有M個(gè)數(shù)據(jù)入隊(duì)時(shí),判斷所述消費(fèi)者子隊(duì)列第一尾指針是否等于所述生產(chǎn)者子隊(duì)列初始頭指針加1,若是,則判定所述環(huán)形隊(duì)列已滿,不能執(zhí)行生產(chǎn)者的入隊(duì)操作;否則,判定所述環(huán)形隊(duì)列未滿,繼續(xù)執(zhí)行生產(chǎn)者的入隊(duì)操作。
[0020]可選的,當(dāng)生產(chǎn)者有M個(gè)數(shù)據(jù)入隊(duì)時(shí),在確定所述環(huán)形隊(duì)列未滿之后,將所述生產(chǎn)者子隊(duì)列初始頭指針加M作為新的生產(chǎn)者子隊(duì)列頭指針之前,進(jìn)一步包括:
[0021]獲取當(dāng)前生產(chǎn)者子隊(duì)列的頭指針,并判斷當(dāng)前生產(chǎn)者子隊(duì)列的頭指針是否等于所述生產(chǎn)者子隊(duì)列初始頭指針,若是,則執(zhí)行后續(xù)操作;否則,重新開始獲取所述生產(chǎn)者子隊(duì)列的頭指針作為生產(chǎn)者子隊(duì)列初始頭指針,獲取所述消費(fèi)者子隊(duì)列的尾指針作為消費(fèi)者子隊(duì)列第一尾指針,基于所述生產(chǎn)者子隊(duì)列初始頭指針和所述消費(fèi)者子隊(duì)列第一尾指針,確定所述環(huán)形隊(duì)列未滿時(shí),再次獲取當(dāng)前生產(chǎn)者子隊(duì)列的頭指針,并判斷當(dāng)前生產(chǎn)者子隊(duì)列的頭指針是否等于所述生產(chǎn)者子隊(duì)列初始頭指針,執(zhí)行后續(xù)操作。
[0022]可選的,確定所述環(huán)形隊(duì)列未空,具體包括:
[0023]當(dāng)消費(fèi)者有N個(gè)數(shù)據(jù)出隊(duì)時(shí),判斷當(dāng)前生產(chǎn)者子隊(duì)列的尾指針是否等于所述消費(fèi)者子隊(duì)列初始頭指針,若是,則判定所述環(huán)形隊(duì)列已空,不能執(zhí)行消費(fèi)者的出隊(duì)操作;否則,判定所述環(huán)形隊(duì)列未空,繼續(xù)執(zhí)行消費(fèi)者的出隊(duì)操作。
[0024]可選的,當(dāng)消費(fèi)者有N個(gè)數(shù)據(jù)出隊(duì)時(shí),確定所述環(huán)形隊(duì)列未空之后,將所述消費(fèi)者子隊(duì)列初始頭指針加N作為新的消費(fèi)者子隊(duì)列的頭指針之前,進(jìn)一步包括:
[0025]獲取當(dāng)前消費(fèi)者子隊(duì)列的頭指針,并判斷當(dāng)前消費(fèi)者子隊(duì)列的頭指針是否等于所述消費(fèi)者子隊(duì)列初始頭指針,若是,則執(zhí)行后續(xù)操作;否則,重新開始獲取所述消費(fèi)者子隊(duì)列的頭指針作為消費(fèi)者子隊(duì)列初始頭指針,獲取所述生產(chǎn)者子隊(duì)列的尾指針作為生產(chǎn)者子隊(duì)列第一尾指針,基于所述消費(fèi)者子隊(duì)列初始頭指針和所述生產(chǎn)者子隊(duì)列第一尾指針,確定所述環(huán)形隊(duì)列未空時(shí),再次獲取當(dāng)前消費(fèi)者子隊(duì)列的頭指針,并判斷當(dāng)前消費(fèi)者子隊(duì)列的頭指針是否等于所述消費(fèi)者子隊(duì)列初始頭指針,執(zhí)行后續(xù)操作。
[0026]—種多核環(huán)境下實(shí)現(xiàn)免鎖隊(duì)列的設(shè)備,包括:
[0027]確定單元,用于確定一個(gè)環(huán)形隊(duì)列,所述環(huán)形隊(duì)列的存儲(chǔ)結(jié)構(gòu)采用數(shù)組形式存儲(chǔ),所述環(huán)形隊(duì)列包括生產(chǎn)者子隊(duì)列和消費(fèi)者子隊(duì)列;
[0028]第一處理單元,用于當(dāng)生產(chǎn)者有M個(gè)數(shù)據(jù)入隊(duì)時(shí),獲取所述生產(chǎn)者子隊(duì)列的頭指針作為生產(chǎn)者子隊(duì)列初始頭指針,獲取所述消費(fèi)者子隊(duì)列的尾指針作為消費(fèi)者子隊(duì)列第一尾指針,基于所述生產(chǎn)者子隊(duì)列初始頭指針和所述消費(fèi)者子隊(duì)列第一尾指針,確定所述環(huán)形隊(duì)列未滿時(shí),將所述生產(chǎn)者子隊(duì)列初始頭指針加M作為新的生產(chǎn)者子隊(duì)列頭指針,從所述生產(chǎn)者子隊(duì)列初始頭指針開始依次將M個(gè)數(shù)據(jù)加入到所述環(huán)形隊(duì)列中,獲取所述生產(chǎn)者子隊(duì)列的尾指針作為生產(chǎn)者子隊(duì)列初始尾指針,確定所述生產(chǎn)者子隊(duì)列初始尾指針等于所述生產(chǎn)者子隊(duì)列初始頭指針時(shí),將所述生產(chǎn)者子隊(duì)列初始尾指針加M作為新的生產(chǎn)者子隊(duì)列尾指針,入隊(duì)完成,其中M為正整數(shù);
[0029]第二處理單元,用于當(dāng)消費(fèi)者有N個(gè)數(shù)據(jù)出隊(duì)時(shí),獲取所述消費(fèi)者子隊(duì)列的頭指針作為消費(fèi)者子隊(duì)列初始頭指針,獲取所述生產(chǎn)者子隊(duì)列的尾指針作為生產(chǎn)者子隊(duì)列第一尾指針,基于所述消費(fèi)者子隊(duì)列初始頭指針和所述生產(chǎn)者子隊(duì)列第一尾指針,確定所述環(huán)形隊(duì)列未空時(shí),將所述消費(fèi)者子隊(duì)列初始頭指針加N作為新的消費(fèi)者子隊(duì)列的頭指針,從所述消費(fèi)者子隊(duì)列初始頭指針開始依次將N個(gè)數(shù)據(jù)從所述環(huán)形隊(duì)列中清除,獲取所述消費(fèi)者子隊(duì)列的尾指針作為消費(fèi)者子