一種并發(fā)數(shù)據(jù)的緩存方法及結(jié)構(gòu)的制作方法
【專利摘要】一種并發(fā)數(shù)據(jù)的緩存方法,A每組數(shù)據(jù)寫(xiě)入,A1監(jiān)測(cè)是否有寫(xiě)鎖定狀態(tài)緩存分區(qū):若有轉(zhuǎn)入步驟A2?2;若無(wú)A2監(jiān)測(cè)是否存在空閑狀態(tài)緩存分區(qū):A21若有A21?1選定一組空閑狀態(tài)緩存分區(qū)置為寫(xiě)鎖定狀態(tài);A21?2向緩存分區(qū)寫(xiě)入數(shù)據(jù):A21?3判斷數(shù)據(jù)是否寫(xiě)入成功:若成功,則該組數(shù)據(jù)寫(xiě)入完成;若失敗,則將該緩存分區(qū)置為寫(xiě)滿狀態(tài),轉(zhuǎn)入步驟A1;A22若無(wú)空閑狀態(tài)緩存分區(qū),結(jié)束數(shù)據(jù)寫(xiě)入;步驟B數(shù)據(jù)讀取,B1實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)滿狀態(tài)下緩存分區(qū):若有B11選定該組緩存分區(qū)置為讀鎖定狀態(tài);B12讀取該緩存分區(qū)內(nèi)的緩存數(shù)據(jù),當(dāng)判斷緩存分區(qū)讀取完畢時(shí),將其設(shè)為空閑狀態(tài),轉(zhuǎn)入步驟B1;若沒(méi)有,轉(zhuǎn)入步驟B1,繼續(xù)數(shù)據(jù)讀取,其對(duì)緩存分區(qū)訪問(wèn)施加嚴(yán)格讀寫(xiě)鎖,可有效優(yōu)化數(shù)據(jù)處理速率。
【專利說(shuō)明】
一種并發(fā)數(shù)據(jù)的緩存方法及結(jié)構(gòu)
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及輻射檢測(cè)領(lǐng)域的數(shù)據(jù)采集技術(shù),具體涉及一種高速數(shù)據(jù)采集的緩存方法和設(shè)備。
【背景技術(shù)】
[0002]現(xiàn)有技術(shù)中的高速數(shù)據(jù)采集系統(tǒng),其每個(gè)數(shù)據(jù)通道一般都對(duì)應(yīng)設(shè)有一個(gè)獨(dú)立的用于緩存通道數(shù)據(jù)的FIF0(First Input First Ouput,先入先出隊(duì)列),然而在實(shí)際的數(shù)據(jù)采集中,經(jīng)常遇到數(shù)據(jù)采集率高、速度快,而數(shù)據(jù)處理時(shí)間長(zhǎng),速度較慢的矛盾,當(dāng)緩存容量大時(shí),這種原始數(shù)據(jù)的速率較高,對(duì)網(wǎng)絡(luò)接收和數(shù)據(jù)處理提出了較高的要求。
[0003]以全數(shù)字PET為例,圖1為全數(shù)字PET設(shè)備中數(shù)據(jù)采集與處理流程示意圖,探測(cè)器各通道對(duì)接收到信號(hào)進(jìn)行采樣和編碼,以特定格式的數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)。PET成像所需的有效事件分布于不同的探測(cè)器通道,兩者之間的匹配關(guān)系可通過(guò)事件采樣時(shí)間來(lái)標(biāo)定。來(lái)自各探測(cè)器通道的有效事件以及噪聲數(shù)據(jù)混合在一起,串行分布于網(wǎng)絡(luò)傳輸鏈路中,當(dāng)采集服務(wù)器接收到這些數(shù)據(jù)后,基于符合算法從中篩選出有效事件,并進(jìn)行時(shí)間、能量校正,然后根據(jù)重建算法將篩選結(jié)果轉(zhuǎn)換為PET圖像。理想情況下數(shù)據(jù)采集應(yīng)與符合處理并發(fā)執(zhí)行,實(shí)時(shí)完成數(shù)據(jù)篩選、時(shí)間校正、能量校正,從而降低重建前數(shù)據(jù)存儲(chǔ)所需的資源要求。但是由于通道數(shù)量多,且每個(gè)通道中數(shù)據(jù)量十分巨大,每秒需要同時(shí)處理1.5GB至3GB的數(shù)據(jù),若無(wú)法及時(shí)進(jìn)行處理,會(huì)導(dǎo)致有效事件的丟包,進(jìn)而導(dǎo)致數(shù)據(jù)篩選、時(shí)間校正、能量校正的有效性降低,圖像重建無(wú)法實(shí)現(xiàn)或者雖然能實(shí)現(xiàn)但是嚴(yán)重影響精準(zhǔn)性。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的在于提供一種并發(fā)數(shù)據(jù)的緩存方法及結(jié)構(gòu),能夠有效解決數(shù)據(jù)采集率高、速度塊,而數(shù)據(jù)處理時(shí)間長(zhǎng)、速度慢的問(wèn)題,尤其適用于全數(shù)字PET中的探測(cè)器數(shù)據(jù)采集。
[0005]為達(dá)到上述目的,本發(fā)明的解決方案是:
[0006]本發(fā)明公開(kāi)一種并發(fā)數(shù)據(jù)的緩存方法,包括以下步驟:緩存分區(qū)的工作狀態(tài)設(shè)置為空閑狀態(tài)、寫(xiě)鎖定狀態(tài)、寫(xiě)滿狀態(tài)以及讀鎖定狀態(tài)中的任意一種,
[0007](A)每組數(shù)據(jù)寫(xiě)入時(shí),(Al)實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)鎖定狀態(tài)緩存分區(qū):若有寫(xiě)鎖定狀態(tài)緩存分區(qū)直接轉(zhuǎn)入步驟(A2-2)進(jìn)行該組數(shù)據(jù)寫(xiě)入;若沒(méi)有寫(xiě)鎖定狀態(tài)緩存分區(qū),(A2)實(shí)時(shí)監(jiān)測(cè)是否存在空閑狀態(tài)的緩存分區(qū):
[0008](A21)若有處于空閑狀態(tài)的緩存分區(qū),(A21-1)選定一組空閑狀態(tài)的緩存分區(qū)置為寫(xiě)鎖定狀態(tài);(A21-2)向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入該組數(shù)據(jù):(A21-3)判斷所述數(shù)據(jù)是否寫(xiě)入成功:若寫(xiě)入成功,則該組數(shù)據(jù)寫(xiě)入完成,結(jié)束本次數(shù)據(jù)寫(xiě)入;若寫(xiě)入失敗,則將當(dāng)前緩存分區(qū)置為寫(xiě)滿狀態(tài),并轉(zhuǎn)入步驟(Al)繼續(xù)該組數(shù)據(jù)的寫(xiě)入;
[0009](A22)若沒(méi)有處于空閑狀態(tài)的緩存分區(qū),則結(jié)束該組數(shù)據(jù)寫(xiě)入;
[0010]步驟(B)數(shù)據(jù)讀取時(shí),(BI)實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)滿狀態(tài)下的緩存分區(qū):若有處于寫(xiě)滿狀態(tài)下的緩存分區(qū),(Bll)選定該組寫(xiě)滿狀態(tài)的緩存分區(qū)置為讀鎖定狀態(tài);(B12)讀取該讀鎖定狀態(tài)緩存分區(qū)內(nèi)的緩存數(shù)據(jù),當(dāng)判斷所述讀鎖定狀態(tài)緩存分區(qū)讀取完畢時(shí),將所述緩存設(shè)置為空閑狀態(tài),同時(shí)轉(zhuǎn)入步驟(BI)繼續(xù)下一組緩存分區(qū)的讀取;若沒(méi)有寫(xiě)滿狀態(tài)的緩存分區(qū),轉(zhuǎn)入步驟(BI),繼續(xù)數(shù)據(jù)的讀取。
[0011]所述緩存分區(qū)中,同時(shí)只存在一組寫(xiě)鎖定狀態(tài)緩存分區(qū)與一組讀鎖定狀態(tài)緩存分區(qū);
[0012]優(yōu)選的,全部數(shù)據(jù)寫(xiě)入進(jìn)程結(jié)束時(shí),若存在一組未寫(xiě)滿的緩存分區(qū),則將該組緩存分區(qū)置為寫(xiě)滿狀態(tài)以進(jìn)行數(shù)據(jù)的讀取。
[0013]依次順序訪問(wèn)各緩存分區(qū)以監(jiān)測(cè)是否存在寫(xiě)鎖定或空閑狀態(tài)的緩存分區(qū);
[0014]優(yōu)選的,采取遍歷、與數(shù)據(jù)寫(xiě)入訪問(wèn)相同的順序、緩存分區(qū)寫(xiě)入完成主動(dòng)上報(bào)中的任一方式實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)滿狀態(tài)的緩存分區(qū);
[0015]所述緩存分區(qū)內(nèi)部采用分級(jí)管理的方式進(jìn)行數(shù)據(jù)寫(xiě)入操作,所述緩存分區(qū)中包括多個(gè)大小相同的緩存扇區(qū),且所述緩存扇區(qū)一一編碼,且包括多個(gè)大小相同的緩存頁(yè)面,所述每組寫(xiě)入數(shù)據(jù)的大小與所述緩存頁(yè)面大小相同設(shè)置,則所述步驟(A21-3)中,判斷所述數(shù)據(jù)是否寫(xiě)入成功包括以下步驟:每組數(shù)據(jù)寫(xiě)入緩存分區(qū)的每一緩存扇區(qū)后,緩存扇區(qū)內(nèi)部計(jì)數(shù),確定當(dāng)前緩存扇區(qū)編碼,比較所述緩存扇區(qū)編碼與所述緩存扇區(qū)的最大編碼數(shù)大小:若該緩存扇區(qū)編碼小于所述緩存分區(qū)的最大編碼數(shù),判斷下一組數(shù)據(jù)能夠在本緩存分區(qū)中寫(xiě)入成功,若緩存扇區(qū)編碼等于所述緩存分區(qū)的最大編碼數(shù),則判斷所述緩存分區(qū)已滿,轉(zhuǎn)入步驟(Al),將下一組數(shù)據(jù)寫(xiě)入下一個(gè)緩存分區(qū)中;
[0016]優(yōu)選的,所述數(shù)據(jù)按照編碼順序?qū)懭胫了鼍彺嫔葏^(qū)中,且所述緩存頁(yè)面一一編碼,所述數(shù)據(jù)寫(xiě)入至緩存扇區(qū)時(shí),按照緩存頁(yè)面的編碼順序依次寫(xiě)入。
[0017]所述步驟(A21-3)中,所述數(shù)據(jù)寫(xiě)入成功判斷包括以下步驟:向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)組:當(dāng)判斷所述寫(xiě)鎖定狀態(tài)緩存分區(qū)未寫(xiě)滿時(shí),寫(xiě)入成功,繼續(xù)該組緩存分區(qū)的數(shù)據(jù)寫(xiě)入;當(dāng)判斷所述寫(xiě)鎖定狀態(tài)緩存分區(qū)寫(xiě)滿或外部數(shù)據(jù)寫(xiě)完畢時(shí),將該組緩存分區(qū)置為寫(xiě)滿狀態(tài),并轉(zhuǎn)入步驟(Al)繼續(xù)下一組外部數(shù)據(jù)的寫(xiě)入;
[0018]進(jìn)一步的,所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿判斷包括以下步驟:向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)時(shí),比較外部數(shù)據(jù)量與所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)剩余空間大小,若外部數(shù)據(jù)的數(shù)量大于所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)剩余空間,判斷所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿;或,向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)時(shí),系統(tǒng)報(bào)錯(cuò),則判斷所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿。
[0019]所述步驟(BI)之前,還包括實(shí)時(shí)監(jiān)測(cè)是否存在讀鎖定狀態(tài)緩存分區(qū)的步驟,若有,直接轉(zhuǎn)入步驟(B12)讀取所述讀鎖定狀態(tài)緩存分區(qū)內(nèi)的緩存數(shù)據(jù);若無(wú),則轉(zhuǎn)入步驟(BI);
[0020]優(yōu)選的,所述數(shù)據(jù)讀取速度大于數(shù)據(jù)寫(xiě)入速度;
[0021]優(yōu)選的,其應(yīng)有于生產(chǎn)者與消費(fèi)者模型。
[0022]本發(fā)明公開(kāi)了一種并發(fā)數(shù)據(jù)的緩存結(jié)構(gòu),其同時(shí)進(jìn)行數(shù)據(jù)的寫(xiě)入與讀取,包括一組數(shù)據(jù)寫(xiě)入線程、一組數(shù)據(jù)讀取線程、一組數(shù)據(jù)緩存模塊以及一分區(qū)控制模塊;
[0023]所述數(shù)據(jù)緩存模塊包括多組緩存分區(qū);
[0024]所述分區(qū)控制模塊與所述數(shù)據(jù)緩存模塊通信連接以控制所述多個(gè)緩存分區(qū)的工作狀態(tài)以及被訪問(wèn)順序,所述分區(qū)控制模塊用于將所述每個(gè)緩存分區(qū)的工作狀態(tài)設(shè)置為空閑狀態(tài)、寫(xiě)鎖定狀態(tài)、寫(xiě)滿狀態(tài)以及讀鎖定狀態(tài)中的任意一種,僅當(dāng)所述緩存分區(qū)為空閑狀態(tài)時(shí)支持寫(xiě)鎖定,且所述緩存分區(qū)處于寫(xiě)鎖定狀態(tài)時(shí)支持?jǐn)?shù)據(jù)寫(xiě)入,僅當(dāng)所述緩存分區(qū)為寫(xiě)滿狀態(tài)時(shí)支持讀鎖定,且所述緩存分區(qū)處于讀鎖定狀態(tài)時(shí)支持?jǐn)?shù)據(jù)讀出;
[0025]所述數(shù)據(jù)寫(xiě)入線程與所述數(shù)據(jù)讀取線程分別經(jīng)由所述分區(qū)控制模塊與各緩存分區(qū)通信連接,所述分區(qū)控制模塊控制所述數(shù)據(jù)寫(xiě)入線程與所述數(shù)據(jù)讀取線程訪問(wèn)緩存分區(qū)的順序,以使得所述數(shù)據(jù)寫(xiě)入線程與所述數(shù)據(jù)讀取線程根據(jù)所訪問(wèn)緩存分區(qū)的工作狀態(tài)進(jìn)行數(shù)據(jù)的寫(xiě)入與讀取。
[0026]所述每組緩存分區(qū)包括一控制單元以及多組緩存扇區(qū),所述緩存扇區(qū)一一編碼設(shè)置,所述控制單元與所述每組緩存扇區(qū)通信連接,以控制每組緩存分區(qū)中,數(shù)據(jù)寫(xiě)入緩存扇區(qū)的順序;
[0027]進(jìn)一步優(yōu)選的,所述每組緩存扇區(qū)包括一控制組件以及多個(gè)緩存頁(yè)面,所述緩存頁(yè)面一一編碼且每組寫(xiě)入數(shù)據(jù)的大小與緩存頁(yè)面相同設(shè)置,所述控制組件與所述緩存頁(yè)面分別通向連接,以控制每組緩存扇區(qū)中,數(shù)據(jù)寫(xiě)入緩存頁(yè)碼的順序。
[0028]所述分區(qū)控制模塊包括一寫(xiě)鎖定判斷單元以及一讀鎖定判斷單元;
[0029]所述寫(xiě)鎖定判斷單元與數(shù)據(jù)緩存模塊通信連接,以控制數(shù)據(jù)緩存模塊中緩存分區(qū)的訪問(wèn)順序、寫(xiě)鎖定與去寫(xiě)鎖定,所述數(shù)據(jù)寫(xiě)入線程與所述寫(xiě)鎖定判斷單元通信連接以根據(jù)所述寫(xiě)鎖定判斷單元確定的訪問(wèn)順序訪問(wèn)的緩存分區(qū),并根據(jù)當(dāng)前訪問(wèn)緩存分區(qū)的工作狀態(tài)進(jìn)行數(shù)據(jù)的寫(xiě)入操作;
[0030]所述讀鎖定判斷單元與相應(yīng)的數(shù)據(jù)緩存模塊通信連接,以控制數(shù)據(jù)緩存模塊中緩存分區(qū)的訪問(wèn)順序、讀鎖定與去讀鎖定,所述數(shù)據(jù)讀取線程與所述讀鎖定判斷單元通信連接以根據(jù)所訪問(wèn)的緩存分區(qū)的當(dāng)前狀態(tài)判斷是否讀取緩存數(shù)據(jù)。
[0031]優(yōu)選的,同時(shí)只存在一組寫(xiě)鎖定狀態(tài)緩存分區(qū)與一組讀鎖定狀態(tài)緩存分區(qū)。
[0032]優(yōu)選的,所述數(shù)據(jù)緩存模塊為生產(chǎn)者與消費(fèi)者模型。
[0033]此外,本發(fā)明還公開(kāi)了一種并發(fā)數(shù)據(jù)的緩存模型,同時(shí)包括至少兩組以上如權(quán)利要求8所述并發(fā)數(shù)據(jù)的緩存結(jié)構(gòu)。
[0034]由于采用上述方案,本發(fā)明的有益效果是:本發(fā)明所示的簡(jiǎn)單的并發(fā)數(shù)據(jù)緩存方法及結(jié)構(gòu),通過(guò)為對(duì)緩存分區(qū)的訪問(wèn)施加嚴(yán)格的讀寫(xiě)鎖,可支持更高的網(wǎng)絡(luò)數(shù)據(jù)速率,優(yōu)化數(shù)據(jù)處理速度。
【附圖說(shuō)明】
[0035]圖1為全數(shù)字PET的數(shù)據(jù)采集與處理流程示意圖;
[0036]圖2為本發(fā)明一實(shí)施例中并發(fā)數(shù)據(jù)緩存方法步驟示意圖;
[0037]圖3為圖2所示實(shí)施例中并發(fā)數(shù)據(jù)緩存方法數(shù)據(jù)寫(xiě)入時(shí)的流程圖;
[0038]圖4為圖2所示實(shí)施例中并發(fā)數(shù)據(jù)緩存方法數(shù)據(jù)讀取時(shí)的流程圖;
[0039]圖5為本法一實(shí)施例中并發(fā)數(shù)據(jù)緩存結(jié)構(gòu)示意圖;
[0040]圖6為圖5所不實(shí)施例中緩存扇區(qū)的結(jié)構(gòu)不意圖。
【具體實(shí)施方式】
[0041 ]以下結(jié)合附圖所示實(shí)施例對(duì)本發(fā)明作進(jìn)一步的說(shuō)明。
[0042]本發(fā)明提供了一種并發(fā)數(shù)據(jù)的緩存方法,包括以下步驟,緩存分區(qū)的工作狀態(tài)設(shè)置為空閑狀態(tài)、寫(xiě)鎖定狀態(tài)、寫(xiě)滿狀態(tài)以及讀鎖定狀態(tài)中的任意一種,其中當(dāng)某一緩存分區(qū)全部寫(xiě)滿或某一時(shí)間段內(nèi)外部數(shù)據(jù)寫(xiě)入完畢,沒(méi)有新的數(shù)據(jù)寫(xiě)入時(shí),該緩存分區(qū)被置為寫(xiě)滿狀態(tài)。
[0043]由于無(wú)法確定外部數(shù)據(jù)的發(fā)送時(shí)間以及數(shù)量的大小,為了確保每組外部發(fā)送的數(shù)據(jù)能夠及時(shí)有效的寫(xiě)入至緩存中,盡量避免出現(xiàn)丟包的問(wèn)題,如圖3所示,每組數(shù)據(jù)寫(xiě)入過(guò)程如下,(A)—組數(shù)據(jù)寫(xiě)入:(Al)實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)鎖定狀態(tài)緩存分區(qū):當(dāng)確定存在寫(xiě)鎖定狀態(tài)緩存分區(qū)時(shí),直接轉(zhuǎn)入步驟(A2-2),將該組數(shù)據(jù)寫(xiě)入至寫(xiě)鎖定狀態(tài)緩存分區(qū)中。若當(dāng)前緩存分區(qū)中沒(méi)有處于寫(xiě)鎖定的工作狀態(tài)時(shí),(A2)則實(shí)時(shí)監(jiān)測(cè)是否存在空閑狀態(tài)的緩存分區(qū):(A21)若有處于空閑狀態(tài)的緩存分區(qū),(A21-1)選定一組空閑狀態(tài)的緩存分區(qū)置為寫(xiě)鎖定狀態(tài);(A21-2)向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入該組數(shù)據(jù):(A21-3)判斷所述數(shù)據(jù)是否寫(xiě)入成功:若數(shù)據(jù)寫(xiě)入成功,則該組數(shù)據(jù)寫(xiě)入完成,結(jié)束該組數(shù)據(jù)的寫(xiě)入,同時(shí)可轉(zhuǎn)入步驟(A)中繼續(xù)下一組數(shù)據(jù)的寫(xiě)入;若數(shù)據(jù)寫(xiě)入失敗,則說(shuō)明當(dāng)前處于寫(xiě)鎖定工作狀態(tài)的緩存分區(qū)已經(jīng)寫(xiě)滿了,無(wú)法在進(jìn)行新的數(shù)據(jù)寫(xiě)入,則將當(dāng)前緩存分區(qū)的工作狀態(tài)置為寫(xiě)滿狀態(tài),同時(shí)轉(zhuǎn)入步驟(Al)中,繼續(xù)該組外部數(shù)據(jù)的寫(xiě)入,將該組外部數(shù)據(jù)寫(xiě)入至其他緩存分區(qū)中;
[0044]其中,上述步驟(A21-3)中,可通過(guò)判斷選定的寫(xiě)鎖定狀態(tài)緩存分區(qū)是否寫(xiě)滿的步驟來(lái)確定數(shù)據(jù)是否寫(xiě)入成功。在向?qū)戞i定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)組時(shí),若判斷寫(xiě)鎖定狀態(tài)緩存分區(qū)還未寫(xiě)滿時(shí),則說(shuō)明有足夠的空間寫(xiě)入當(dāng)前數(shù)據(jù),則當(dāng)該組數(shù)據(jù)寫(xiě)入時(shí)可判斷其寫(xiě)入成功;當(dāng)判斷選定的寫(xiě)鎖定狀態(tài)緩存分區(qū)已寫(xiě)滿時(shí),沒(méi)有足夠的空間繼續(xù)寫(xiě)入新的數(shù)據(jù),則說(shuō)明無(wú)法將該組數(shù)據(jù)寫(xiě)入至上述寫(xiě)鎖定狀態(tài)緩存分區(qū),判斷其寫(xiě)入失敗,此時(shí),需將該組緩存分區(qū)置為寫(xiě)滿狀態(tài),并轉(zhuǎn)入步驟(Al),以將本組數(shù)據(jù)寫(xiě)入至其他合適的緩存分區(qū)中。
[0045]上述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿判斷具體又包括以下步驟:向?qū)戞i定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)時(shí),首先比較該組數(shù)據(jù)與寫(xiě)鎖定狀態(tài)的緩存分區(qū)剩余空間大小,若外部數(shù)據(jù)大于寫(xiě)鎖定狀態(tài)的緩存分區(qū)剩余空間,則判斷寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿;若外部數(shù)據(jù)不大于寫(xiě)鎖定狀態(tài)的緩存分區(qū)剩余空間,則判斷寫(xiě)鎖定狀態(tài)的緩存分區(qū)未寫(xiě)滿,本組數(shù)據(jù)可繼續(xù)寫(xiě)入;也可采取主動(dòng)上報(bào)的方式判斷寫(xiě)鎖定狀態(tài)的緩存分區(qū)是否寫(xiě)滿,即當(dāng)向?qū)戞i定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)時(shí),若系統(tǒng)主動(dòng)報(bào)錯(cuò),則判斷寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿。
[0046](A22)若沒(méi)有處于空閑狀態(tài)的緩存分區(qū),說(shuō)明當(dāng)前緩存已經(jīng)全部寫(xiě)滿,則結(jié)束該組數(shù)據(jù)的寫(xiě)入進(jìn)程。
[0047]數(shù)據(jù)讀取包括以下步驟,(B)數(shù)據(jù)讀取時(shí),以單個(gè)緩存分區(qū)為基礎(chǔ)來(lái)進(jìn)行的,(BI)實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)滿狀態(tài)下的緩存分區(qū):若有處于寫(xiě)滿狀態(tài)下的緩存分區(qū),(Bll)選定其中一組寫(xiě)滿狀態(tài)的緩存分區(qū)置為讀鎖定狀態(tài);(B12)讀取該讀鎖定狀態(tài)緩存分區(qū)內(nèi)的緩存數(shù)據(jù),當(dāng)判斷所述讀鎖定狀態(tài)緩存分區(qū)讀取完畢時(shí),將所述緩存設(shè)置為空閑狀態(tài),同時(shí)轉(zhuǎn)入步驟(BI)繼續(xù)下一組緩存分區(qū)的讀取;若沒(méi)有寫(xiě)滿狀態(tài)的緩存分區(qū),則轉(zhuǎn)入步驟(BI)中,判斷下一時(shí)刻是否存在寫(xiě)滿狀態(tài)緩存分區(qū)以繼續(xù)進(jìn)行數(shù)據(jù)的讀取。
[0048]此外,全部數(shù)據(jù)寫(xiě)入進(jìn)程結(jié)束時(shí),若存在一組未寫(xiě)滿的緩存分區(qū),則將該組緩存分區(qū)置為寫(xiě)滿狀態(tài)以進(jìn)行數(shù)據(jù)的讀取??紤]到外部數(shù)據(jù)的大小無(wú)法確定,某一時(shí)間段內(nèi)數(shù)據(jù)寫(xiě)入進(jìn)程結(jié)束時(shí),所接收的外部數(shù)據(jù)可能無(wú)法寫(xiě)滿一組數(shù)據(jù)緩存,或者最后一段數(shù)據(jù)無(wú)法寫(xiě)滿一組數(shù)據(jù)緩存,此時(shí)為了讀取該部分?jǐn)?shù)據(jù),將寫(xiě)入該部分?jǐn)?shù)據(jù)的緩存分區(qū)也置為寫(xiě)滿狀態(tài)。
[0049]所述步驟(BI)之前,還包括實(shí)時(shí)監(jiān)測(cè)是否存在讀鎖定狀態(tài)緩存分區(qū)的步驟,若有,直接轉(zhuǎn)入步驟(B12)讀取選定讀鎖定狀態(tài)緩存分區(qū)內(nèi)的緩存數(shù)據(jù);若無(wú),則轉(zhuǎn)入步驟(BI),判斷是否存在寫(xiě)滿狀態(tài)下的緩存分區(qū)以繼續(xù)數(shù)據(jù)的讀取。
[0050]為了便于數(shù)據(jù)寫(xiě)入與讀取的管理,在所有的緩存分區(qū)中,同時(shí)只設(shè)置一組寫(xiě)鎖定狀態(tài)緩存分區(qū)與一組讀鎖定狀態(tài)緩存分區(qū),即緩存中同時(shí)只進(jìn)行一組緩存分區(qū)的數(shù)據(jù)寫(xiě)入和/或一組緩存分區(qū)的數(shù)據(jù)讀取,這樣設(shè)置,一方面可使得數(shù)據(jù)的寫(xiě)入與讀取更為有序,只有一組緩存分區(qū)寫(xiě)完或讀完之后,才能對(duì)下一分區(qū)進(jìn)行讀寫(xiě)操作,另一方面,也可充分利用緩存分區(qū)的空間,保證每組緩存分區(qū)都得到有效利用,而不會(huì)出現(xiàn)多組緩存分區(qū)只有一部分空間被利用的情形。
[0051]在上述基礎(chǔ)上,本發(fā)明所示的緩存方法對(duì)緩存分區(qū)的訪問(wèn)順序進(jìn)行設(shè)置,以更好的實(shí)現(xiàn)數(shù)據(jù)寫(xiě)入與讀取的合理管理。
[0052]數(shù)據(jù)寫(xiě)入過(guò)程中,依次順序訪問(wèn)各緩存分區(qū)以監(jiān)測(cè)是否存在寫(xiě)鎖定或空閑狀態(tài)的緩存分區(qū),即寫(xiě)入線程在尋找寫(xiě)鎖定或空閑狀態(tài)的緩存分區(qū)時(shí),任意設(shè)置一緩存分區(qū)作為起點(diǎn),然后按照順序循環(huán)依次訪問(wèn),具體而言,各緩存分區(qū)構(gòu)建和初始化完成后一般即為空閑狀態(tài),由于同時(shí)只存在一組寫(xiě)鎖定狀態(tài)的緩存分區(qū),在進(jìn)行數(shù)據(jù)寫(xiě)入時(shí),寫(xiě)入線程按照從起始點(diǎn)開(kāi)始的順序依次訪問(wèn)各緩存分區(qū),首先起始點(diǎn)的空閑狀態(tài)緩存分別被置為寫(xiě)鎖定狀態(tài)以進(jìn)行數(shù)據(jù)寫(xiě)入,當(dāng)起始點(diǎn)的緩存分區(qū)寫(xiě)滿后,起始點(diǎn)的下一緩存分區(qū)被置為寫(xiě)鎖定狀態(tài),寫(xiě)入線程直接轉(zhuǎn)入下一緩存分區(qū)繼續(xù)數(shù)據(jù)的寫(xiě)入,直至該緩存分區(qū)寫(xiě)滿,依次循環(huán)實(shí)現(xiàn)數(shù)據(jù)的寫(xiě)入。
[0053]由于數(shù)據(jù)寫(xiě)入的時(shí)間以及寫(xiě)入量是人為無(wú)法控制的,為了更好的應(yīng)對(duì)各種突發(fā)的數(shù)據(jù)寫(xiě)入情況,更進(jìn)一步的,緩存分區(qū)中包括多個(gè)大小相同的緩存扇區(qū),緩存扇區(qū)一一編碼且包括多個(gè)大小相同的緩存頁(yè)面,將每組寫(xiě)入數(shù)據(jù)的大小與緩存頁(yè)面大小相同設(shè)置。當(dāng)確定一組寫(xiě)鎖定狀態(tài)下的緩存分區(qū)進(jìn)行數(shù)據(jù)寫(xiě)入時(shí),將本組數(shù)據(jù)按照順序?qū)懭敫骶彺嫔葏^(qū)的緩存頁(yè)面中,即首先本組數(shù)據(jù)寫(xiě)入第一組緩存扇區(qū)的第一個(gè)緩存頁(yè)面中,下一組數(shù)據(jù)寫(xiě)入第一組緩存扇區(qū)的第二個(gè)緩存頁(yè)面中,依次進(jìn)行,直至該組緩存扇區(qū)寫(xiě)滿,則緩存扇區(qū)內(nèi)部自己計(jì)數(shù),確定當(dāng)前緩存扇區(qū)編碼,并自動(dòng)將未寫(xiě)完的數(shù)據(jù)或者下一組數(shù)據(jù)寫(xiě)入至第二組緩存分區(qū)(下一緩存扇區(qū))的第一個(gè)緩存頁(yè)面中,直至該緩存分區(qū)中所有的緩存頁(yè)面均被寫(xiě)滿。相應(yīng)的數(shù)據(jù)寫(xiě)入時(shí)緩存分區(qū)寫(xiě)滿判斷的步驟如下:比較緩存扇區(qū)編碼與緩存扇區(qū)的最大編碼數(shù)大小:若該緩存扇區(qū)編碼小于緩存分區(qū)的最大編碼數(shù),判斷下一組數(shù)據(jù)能夠在本緩存分區(qū)中寫(xiě)入成功,若緩存扇區(qū)編碼等于緩存分區(qū)的最大編碼數(shù),則判斷緩存分區(qū)已滿,轉(zhuǎn)入步驟(Al ),將下一組數(shù)據(jù)寫(xiě)入下一個(gè)緩存分區(qū)中。
[0054]在進(jìn)行數(shù)據(jù)讀取時(shí),可采用與數(shù)據(jù)寫(xiě)入訪問(wèn)相同的順序的進(jìn)行數(shù)據(jù)的讀出,從而當(dāng)緩存分區(qū)寫(xiě)滿并置為寫(xiě)滿狀態(tài)后,數(shù)據(jù)讀取線程能在第一時(shí)間內(nèi)訪問(wèn)該緩存分區(qū),進(jìn)而該緩存分區(qū)被置為讀鎖定狀態(tài)并進(jìn)行數(shù)據(jù)的讀取,這樣設(shè)置,可盡量節(jié)約時(shí)間,提高數(shù)據(jù)的讀出效率。同時(shí),也可采取遍歷、緩存分區(qū)寫(xiě)滿主動(dòng)上報(bào)等方式實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)滿狀態(tài)的緩存分區(qū),從進(jìn)行數(shù)據(jù)的讀出。
[0055]此外,考慮到若出現(xiàn)外部數(shù)據(jù)量較大,緩存空間存儲(chǔ)能力有限的,可能導(dǎo)致數(shù)據(jù)丟失的情形,故本發(fā)明所示的緩存方法中,數(shù)據(jù)讀取速度大于數(shù)據(jù)寫(xiě)入速度設(shè)置。
[0056]以下以本發(fā)明所示的緩存方法應(yīng)用于基本緩存模型(即單個(gè)生產(chǎn)者和單個(gè)消費(fèi)者的場(chǎng)景)對(duì)其工作過(guò)程進(jìn)行進(jìn)一步的說(shuō)明。將整個(gè)緩存分為若干個(gè)緩存分區(qū),通過(guò)簡(jiǎn)單的狀態(tài)鎖來(lái)實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者對(duì)緩存分區(qū)的訪問(wèn)保護(hù)。各緩存分區(qū)構(gòu)建和初始化完成后即為空閑狀態(tài)。在將數(shù)據(jù)寫(xiě)入緩存分區(qū)之前,首先實(shí)時(shí)判斷是否存在空閑狀態(tài)的緩存分區(qū),如果存在則進(jìn)行數(shù)據(jù)寫(xiě)入操作,將該緩存分區(qū)狀態(tài)置為寫(xiě)鎖定狀態(tài),僅當(dāng)緩存分區(qū)為空閑狀態(tài)時(shí)支持寫(xiě)鎖定,并通過(guò)數(shù)據(jù)寫(xiě)入線程進(jìn)行該組緩存分區(qū)的數(shù)據(jù)寫(xiě)入。當(dāng)判斷該緩存分區(qū)寫(xiě)滿后,一方面將該緩存分區(qū)置為可讀狀態(tài)(即寫(xiě)滿且未鎖定狀態(tài)),另一方面尋找緩存內(nèi)其他的空閑分區(qū),循環(huán)繼續(xù)數(shù)據(jù)寫(xiě)入操作。在進(jìn)行數(shù)據(jù)寫(xiě)入操作的同時(shí),數(shù)據(jù)讀取線程也在訪問(wèn)緩存分區(qū)進(jìn)行數(shù)據(jù)讀取操作,數(shù)據(jù)讀取線程實(shí)時(shí)訪問(wèn)各緩存分區(qū)以判斷是否存在可讀狀態(tài)緩存分區(qū),當(dāng)數(shù)據(jù)讀取線程判斷當(dāng)前訪問(wèn)的緩存分區(qū)變?yōu)榭勺x狀態(tài)時(shí),在數(shù)據(jù)讀取線程從緩存分區(qū)讀取數(shù)據(jù)之前,首先需要將該分區(qū)狀態(tài)置為讀鎖定狀態(tài),僅當(dāng)緩存分區(qū)為可讀狀態(tài)時(shí)支持讀鎖定。若試圖對(duì)緩存分區(qū)添加讀鎖定或?qū)戞i定而操作失敗,意味著網(wǎng)絡(luò)接收線程和數(shù)據(jù)處理線程訪問(wèn)位置發(fā)生交匯,若為寫(xiě)鎖定相關(guān)操作失敗則表示緩存已滿。
[0057]本發(fā)明所示的并發(fā)數(shù)據(jù)的緩存方法也可用于由多個(gè)基本緩存模型組成的緩存中,具體步驟如前所述,每基本緩存模型均采取并發(fā)數(shù)據(jù)的緩存方法進(jìn)行數(shù)據(jù)的寫(xiě)入與讀出,此處不再贅述。
[0058]當(dāng)該方法應(yīng)用于PET設(shè)備中的數(shù)據(jù)采集實(shí)現(xiàn)時(shí),NETTY網(wǎng)絡(luò)框架定義了獨(dú)立的數(shù)據(jù)接收線程充當(dāng)生產(chǎn)者。由定制的工作線程充當(dāng)消費(fèi)者,負(fù)責(zé)網(wǎng)絡(luò)數(shù)據(jù)包解析、事件符合計(jì)算等處理。緩存分區(qū)的訪問(wèn)鎖基于JAVA開(kāi)發(fā)環(huán)境提供的CAS機(jī)制實(shí)現(xiàn),其基本原理是將緩存分區(qū)的狀態(tài)設(shè)定實(shí)現(xiàn)為原子性操作。具體來(lái)說(shuō),訪問(wèn)鎖對(duì)象的訪問(wèn)是一個(gè)原子性操作。一個(gè)操作是原子的,則這個(gè)操作的更高層不能發(fā)現(xiàn)其內(nèi)部實(shí)現(xiàn)與結(jié)構(gòu)。原子操作可以是一個(gè)步驟,也可以是多個(gè)步驟,其順序是不可以被打亂的,也不能被分割只執(zhí)行部分。CAS是指CompareandSet,即檢查對(duì)象的值,如果滿足某種條件,則將此對(duì)象設(shè)置為新值。使用CAS機(jī)制可實(shí)現(xiàn)不使用線程鎖的方式對(duì)對(duì)象的值進(jìn)行訪問(wèn)和更新,性能優(yōu)于使用互斥鎖的方案。
[0059]單個(gè)緩存分區(qū)作為事件篩選樣本的基本集合單元,其容量可靈活配置,以便于調(diào)整因數(shù)據(jù)分片而引起的符合事件丟失率。為優(yōu)化數(shù)據(jù)處理速度,網(wǎng)絡(luò)數(shù)據(jù)包解析和符合篩選環(huán)節(jié)均引入了 JAVA開(kāi)發(fā)環(huán)境提供的Fork/Join并行計(jì)算模型。每個(gè)緩存分區(qū)的容量是相同,其容量大小可靈活配置。理論上緩存分區(qū)越大越好,這樣可以保證數(shù)據(jù)丟失少,但緩存分區(qū)越大對(duì)物理內(nèi)存的要求也就越高。故這個(gè)緩存分區(qū)容量大小值可根據(jù)物理內(nèi)存的大小來(lái)確定。Fork/Join并行計(jì)算模型的原理是Map/Reduce模型,對(duì)一個(gè)復(fù)雜的任務(wù)進(jìn)行分而治之,通過(guò)使用現(xiàn)在計(jì)算機(jī)多核多線程技術(shù)提高計(jì)算效率。例如計(jì)算N個(gè)數(shù)的和,將N個(gè)數(shù)分為M份,并使用M個(gè)線程同步執(zhí)行計(jì)算的任務(wù),再將M個(gè)結(jié)果合并成一個(gè)結(jié)果。
[0060]本發(fā)明還公開(kāi)了一種并發(fā)數(shù)據(jù)的緩存結(jié)構(gòu),同時(shí)進(jìn)行數(shù)據(jù)的寫(xiě)入與讀取,包括一組數(shù)據(jù)寫(xiě)入線程100、一組數(shù)據(jù)讀取線程200、一組數(shù)據(jù)緩存模塊300以及一分區(qū)控制模塊400。
[0061 ]數(shù)據(jù)緩存模塊300包括多組緩存分區(qū)310,分區(qū)控制模塊400與數(shù)據(jù)緩存模塊300通信連接,用于控制數(shù)據(jù)緩存模塊300中各個(gè)緩存分區(qū)310的工作狀態(tài),即分區(qū)控制模塊400將每個(gè)緩存分區(qū)310的工作狀態(tài)設(shè)置為空閑狀態(tài)、寫(xiě)鎖定狀態(tài)、寫(xiě)滿狀態(tài)以及讀鎖定狀態(tài)中的任意一種。僅當(dāng)緩存分區(qū)310為空閑狀態(tài)時(shí)支持寫(xiě)鎖定,且當(dāng)緩存分區(qū)310的工作狀態(tài)為寫(xiě)鎖定時(shí)支持?jǐn)?shù)據(jù)寫(xiě)入線程100進(jìn)行數(shù)據(jù)的寫(xiě)入;僅當(dāng)緩存分區(qū)310為寫(xiě)滿狀態(tài)時(shí)支持讀鎖定,且當(dāng)緩存分區(qū)310的工作狀態(tài)為讀鎖定狀態(tài)時(shí)支持?jǐn)?shù)據(jù)讀取線程200進(jìn)行數(shù)據(jù)的讀出,同時(shí)分區(qū)控制模塊400還用于控制各個(gè)緩存分區(qū)310的被訪問(wèn)順序,數(shù)據(jù)寫(xiě)入線程100與數(shù)據(jù)讀取線程200分別經(jīng)由分區(qū)控制模塊400與各緩存分區(qū)310通信連接,數(shù)據(jù)寫(xiě)入線程100與數(shù)據(jù)讀取線程200按照分區(qū)控制模塊400確定的訪問(wèn)順序分別訪問(wèn)數(shù)據(jù)緩存模塊300中的多組緩存分區(qū),然后根據(jù)其所訪問(wèn)緩存分區(qū)的狀態(tài)來(lái)進(jìn)行數(shù)據(jù)的寫(xiě)入或者讀取操作。
[0062]為了便于數(shù)據(jù)的寫(xiě)入與讀取,分區(qū)控制模塊400將讀寫(xiě)操作分開(kāi)進(jìn)行,其包括一寫(xiě)鎖定判斷單元410以及一讀鎖定判斷單元420,且在所有的緩存分區(qū)中,同時(shí)只設(shè)置一組寫(xiě)鎖定狀態(tài)緩存分區(qū)與一組讀鎖定狀態(tài)緩存分區(qū)。
[0063]寫(xiě)鎖定判斷單元410與數(shù)據(jù)緩存模塊300通信連接,用于控制數(shù)據(jù)緩存模塊300中緩存分區(qū)310的訪問(wèn)順序、寫(xiě)鎖定(將空閑狀態(tài)的緩存分區(qū)置為寫(xiě)鎖定狀態(tài))與去寫(xiě)鎖定(將寫(xiě)滿的寫(xiě)鎖定狀態(tài)緩存分區(qū)置為寫(xiě)滿狀態(tài))。數(shù)據(jù)寫(xiě)入線程100與寫(xiě)鎖定判斷單元410通信連接,其根據(jù)寫(xiě)鎖定判斷單元410確定的訪問(wèn)順序來(lái)訪問(wèn)各緩存分區(qū)310,并根據(jù)當(dāng)前所訪問(wèn)緩存分區(qū)310的工作狀態(tài)進(jìn)行數(shù)據(jù)的寫(xiě)入操作。在其中一實(shí)施例中,為了使得各緩存分區(qū)的數(shù)據(jù)輸入相對(duì)均衡,寫(xiě)鎖定判斷單元410采用定制遍歷策略來(lái)調(diào)節(jié)數(shù)據(jù)在緩存模塊中的分布,即順序遍歷,可任意選取其中一組緩存分區(qū)作為起始點(diǎn)并按照編碼順序?qū)彺娣謪^(qū)進(jìn)行控制。緩存構(gòu)建完成后,一般情況下,各緩存分區(qū)均為空閑狀態(tài),寫(xiě)鎖定判斷單元410將處于起始點(diǎn)的空閑狀態(tài)的緩存分區(qū)置為寫(xiě)鎖定狀態(tài),數(shù)據(jù)寫(xiě)入線程100按照寫(xiě)鎖定判斷單元410確定的訪問(wèn)順序訪問(wèn)起始點(diǎn)的緩存分區(qū),由于其為寫(xiě)鎖定狀態(tài),則可開(kāi)始進(jìn)行數(shù)據(jù)寫(xiě)入,待該緩存分區(qū)寫(xiě)滿以后,寫(xiě)鎖定判斷單元410將起始點(diǎn)的緩存分區(qū)置為寫(xiě)滿狀態(tài),并將起始點(diǎn)下一編碼處的空閑狀態(tài)緩存分區(qū)置為寫(xiě)鎖定狀態(tài),數(shù)據(jù)寫(xiě)入線程100按照寫(xiě)鎖定判斷單元410確定的繼續(xù)訪問(wèn)下一編碼緩存分區(qū),然后進(jìn)行數(shù)據(jù)寫(xiě)入操作。
[0064]讀鎖定判斷單元420與相應(yīng)的數(shù)據(jù)緩存模塊300也通信連接,用于控制數(shù)據(jù)緩存模塊300中緩存分區(qū)的訪問(wèn)順序、讀鎖定(將寫(xiě)滿狀態(tài)的緩存分區(qū)置為讀鎖定狀態(tài))與去讀鎖定(將讀取完畢的緩存分區(qū)置為空閑狀態(tài)),數(shù)據(jù)讀取線程200與讀鎖定判斷單元420通信連接以根據(jù)所訪問(wèn)的緩存分區(qū)的當(dāng)前狀態(tài)判斷是否讀取緩存數(shù)據(jù)。在數(shù)據(jù)寫(xiě)入的同時(shí),數(shù)據(jù)讀取線程200也在進(jìn)行數(shù)據(jù)的讀取操作,數(shù)據(jù)讀取的訪問(wèn)順序可采用與數(shù)據(jù)寫(xiě)入訪問(wèn)相同的順序的進(jìn)行數(shù)據(jù)的讀出,即讀鎖定判斷單元420控制數(shù)據(jù)讀取線程200按照寫(xiě)鎖定判斷單元410所確定的訪問(wèn)順序,來(lái)訪問(wèn)各緩存分區(qū),這樣設(shè)置,當(dāng)緩存分區(qū)寫(xiě)滿并置為寫(xiě)滿狀態(tài)后,數(shù)據(jù)讀取線程200能在第一時(shí)間內(nèi)訪問(wèn)該緩存分區(qū),進(jìn)而該緩存分區(qū)被置為讀鎖定狀態(tài)并進(jìn)行數(shù)據(jù)的讀取,能夠更進(jìn)一步的提高數(shù)據(jù)的讀出效率。此外,讀鎖定判斷單元420也可采取遍歷順序,或者由各緩存分區(qū)寫(xiě)滿主動(dòng)上報(bào),讀鎖定判斷單元420以及緩存分區(qū)上報(bào)的順序確定數(shù)據(jù)讀取線程200的訪問(wèn)順序。
[0065]由于數(shù)據(jù)寫(xiě)入的過(guò)程是人為無(wú)法控制的過(guò)程,可能出現(xiàn)在上述設(shè)置的基礎(chǔ)上,為了有效的進(jìn)行數(shù)據(jù)的寫(xiě)入管理,減少數(shù)據(jù)丟包事件的發(fā)生,同時(shí)提高緩存的利用率,每組緩存分區(qū)310分層級(jí)管理設(shè)置,其包括一控制單元311以及多組緩存扇區(qū)312,緩存扇區(qū)312—一編碼設(shè)置,控制單元311與該組緩存分區(qū)310中的所有緩存扇區(qū)312通信連接,用于控制每組緩存分區(qū)中,外部數(shù)據(jù)寫(xiě)入緩存扇區(qū)312的順序。進(jìn)一步的,每組緩存扇區(qū)312包括一控制組件312-1以及多個(gè)緩存頁(yè)面312-2,緩存頁(yè)面312-2—一編碼且每組寫(xiě)入數(shù)據(jù)的大小與緩存頁(yè)面312-2相同設(shè)置,控制組件312-1與緩存頁(yè)面312-2分別通向連接,以控制每組緩存扇區(qū)中,數(shù)據(jù)寫(xiě)入緩存頁(yè)碼的順序。
[0066]當(dāng)該組緩存分區(qū)設(shè)置為寫(xiě)鎖定狀態(tài)且與數(shù)據(jù)寫(xiě)入線程100通信成功進(jìn)行數(shù)據(jù)寫(xiě)入操作時(shí),緩存分區(qū)內(nèi)部對(duì)數(shù)據(jù)寫(xiě)入的過(guò)程二次導(dǎo)向。在其中一實(shí)施例中,控制單元311控制緩存分區(qū)內(nèi)部也采用順序?qū)懭氲姆绞竭M(jìn)行,一組數(shù)據(jù)寫(xiě)入時(shí),將本組數(shù)據(jù)按照順序?qū)懭敫骶彺嫔葏^(qū)的緩存頁(yè)面312-2中,即首先將該組數(shù)據(jù)寫(xiě)入第一組緩存扇區(qū)的第一個(gè)緩存頁(yè)面312-2中,下一組數(shù)據(jù)寫(xiě)入第一組緩存扇區(qū)的第二個(gè)緩存頁(yè)面312-2中,依次進(jìn)行,直至該組緩存扇區(qū)寫(xiě)滿,則緩存扇區(qū)內(nèi)部自己計(jì)數(shù),確定當(dāng)前緩存扇區(qū)編碼,并自動(dòng)將未寫(xiě)完的數(shù)據(jù)或者下一組數(shù)據(jù)寫(xiě)入至第二組緩存扇區(qū)(下一緩存扇區(qū))的第一個(gè)緩存頁(yè)面312-2中,直至該緩存分區(qū)中所有的緩存頁(yè)面312-2均被寫(xiě)滿。相應(yīng)的數(shù)據(jù)寫(xiě)入時(shí)緩存分區(qū)寫(xiě)滿判斷的步驟如下:每組緩存分區(qū)中,控制單元311比較緩存扇區(qū)編碼與緩存扇區(qū)的最大編碼數(shù)大小:若該緩存扇區(qū)編碼小于緩存分區(qū)的最大編碼數(shù),判斷下一組數(shù)據(jù)能夠在本緩存分區(qū)中寫(xiě)入成功,若緩存扇區(qū)編碼等于緩存分區(qū)的最大編碼數(shù),則判斷緩存分區(qū)已滿,將下一組數(shù)據(jù)寫(xiě)入下一個(gè)緩存分區(qū)中。
[0067]作為一個(gè)優(yōu)選方案,數(shù)據(jù)緩存模塊300可為生產(chǎn)者與消費(fèi)者模型。
[0068]理論上緩存分區(qū)越大越好,這樣可以保證數(shù)據(jù)丟失少,但緩存分區(qū)越大對(duì)物理內(nèi)存的要求也就越高。由于緩存容量有限,故本發(fā)明還提供了一種并發(fā)數(shù)據(jù)的緩存模型,其同時(shí)包括兩組以上的上述并發(fā)數(shù)據(jù)的緩存結(jié)構(gòu)。每個(gè)緩存結(jié)構(gòu)的工作原理相同,此處不再贅述,上述并發(fā)數(shù)據(jù)的緩存模型中,同時(shí)經(jīng)由多個(gè)數(shù)據(jù)寫(xiě)入線程100與外部數(shù)據(jù)源通信連接,進(jìn)行數(shù)據(jù)的寫(xiě)入操作,同時(shí)經(jīng)由多個(gè)數(shù)據(jù)讀取線程200與外部處理設(shè)備通信連接,將各緩存內(nèi)部的數(shù)據(jù)及時(shí)讀出并發(fā)送至外部處理設(shè)備中進(jìn)行下一步的數(shù)據(jù)處理,從而有效增強(qiáng)數(shù)據(jù)的緩存能力。
[0069]上述的對(duì)實(shí)施例的描述是為便于該技術(shù)領(lǐng)域的普通技術(shù)人員能理解和使用本發(fā)明。熟悉本領(lǐng)域技術(shù)的人員顯然可以容易地對(duì)這些實(shí)施例做出各種修改,并把在此說(shuō)明的一般原理應(yīng)用到其他實(shí)施例中而不必經(jīng)過(guò)創(chuàng)造性的勞動(dòng)。因此,本發(fā)明不限于上述實(shí)施例,本領(lǐng)域技術(shù)人員根據(jù)本發(fā)明的揭示,不脫離本發(fā)明范疇所做出的改進(jìn)和修改都應(yīng)該在本發(fā)明的保護(hù)范圍之內(nèi)。
【主權(quán)項(xiàng)】
1.一種并發(fā)數(shù)據(jù)的緩存方法,其特征在于:包括以下步驟:緩存分區(qū)的工作狀態(tài)設(shè)置為空閑狀態(tài)、寫(xiě)鎖定狀態(tài)、寫(xiě)滿狀態(tài)以及讀鎖定狀態(tài)中的任意一種, (A)每組數(shù)據(jù)寫(xiě)入時(shí),(Al)實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)鎖定狀態(tài)緩存分區(qū):若有寫(xiě)鎖定狀態(tài)緩存分區(qū)直接轉(zhuǎn)入步驟(A2-2)進(jìn)行該組數(shù)據(jù)寫(xiě)入;若沒(méi)有寫(xiě)鎖定狀態(tài)緩存分區(qū),(A2)實(shí)時(shí)監(jiān)測(cè)是否存在空閑狀態(tài)的緩存分區(qū): (A21)若有處于空閑狀態(tài)的緩存分區(qū),(A21-1)選定一組空閑狀態(tài)的緩存分區(qū)置為寫(xiě)鎖定狀態(tài);(A21-2)向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入該組數(shù)據(jù):(A21-3)判斷所述數(shù)據(jù)是否寫(xiě)入成功:若寫(xiě)入成功,則該組數(shù)據(jù)寫(xiě)入完成,結(jié)束本次數(shù)據(jù)寫(xiě)入;若寫(xiě)入失敗,則將當(dāng)前緩存分區(qū)置為寫(xiě)滿狀態(tài),并轉(zhuǎn)入步驟(Al)繼續(xù)該組數(shù)據(jù)的寫(xiě)入; (A22)若沒(méi)有處于空閑狀態(tài)的緩存分區(qū),則結(jié)束該組數(shù)據(jù)寫(xiě)入; 步驟(B)數(shù)據(jù)讀取時(shí),(BI)實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)滿狀態(tài)下的緩存分區(qū):若有處于寫(xiě)滿狀態(tài)下的緩存分區(qū),(Bll)選定該組寫(xiě)滿狀態(tài)的緩存分區(qū)置為讀鎖定狀態(tài);(B12)讀取該讀鎖定狀態(tài)緩存分區(qū)內(nèi)的緩存數(shù)據(jù),當(dāng)判斷所述讀鎖定狀態(tài)緩存分區(qū)讀取完畢時(shí),將所述緩存設(shè)置為空閑狀態(tài),同時(shí)轉(zhuǎn)入步驟(BI)繼續(xù)下一組緩存分區(qū)的讀取;若沒(méi)有寫(xiě)滿狀態(tài)的緩存分區(qū),轉(zhuǎn)入步驟(BI),繼續(xù)數(shù)據(jù)的讀取。2.根據(jù)權(quán)利要求1所述的并發(fā)數(shù)據(jù)的緩存方法,其特征在于:所述緩存分區(qū)中,同時(shí)只存在一組寫(xiě)鎖定狀態(tài)緩存分區(qū)與一組讀鎖定狀態(tài)緩存分區(qū); 優(yōu)選的,全部數(shù)據(jù)寫(xiě)入進(jìn)程結(jié)束時(shí),若存在一組未寫(xiě)滿的緩存分區(qū),則將該組緩存分區(qū)置為寫(xiě)滿狀態(tài)以進(jìn)行數(shù)據(jù)的讀取。3.根據(jù)權(quán)利要求1或2所述的并發(fā)數(shù)據(jù)的緩存方法,其特征在于:依次順序訪問(wèn)各緩存分區(qū)以監(jiān)測(cè)是否存在寫(xiě)鎖定或空閑狀態(tài)的緩存分區(qū); 優(yōu)選的,采取遍歷、與數(shù)據(jù)寫(xiě)入訪問(wèn)相同的順序、緩存分區(qū)寫(xiě)入完成主動(dòng)上報(bào)中的任一方式實(shí)時(shí)監(jiān)測(cè)是否存在寫(xiě)滿狀態(tài)的緩存分區(qū)。4.根據(jù)權(quán)利要求1所述的并發(fā)數(shù)據(jù)的緩存方法,其特征在于:所述緩存分區(qū)內(nèi)部采用分級(jí)管理的方式進(jìn)行數(shù)據(jù)寫(xiě)入操作,所述緩存分區(qū)中包括多個(gè)大小相同的緩存扇區(qū),且所述緩存扇區(qū)一一編碼,且包括多個(gè)大小相同的緩存頁(yè)面,所述每組寫(xiě)入數(shù)據(jù)的大小與所述緩存頁(yè)面大小相同設(shè)置,則所述步驟(A21-3)中,判斷所述數(shù)據(jù)是否寫(xiě)入成功包括以下步驟:每組數(shù)據(jù)寫(xiě)入緩存分區(qū)的每一緩存扇區(qū)后,緩存扇區(qū)內(nèi)部計(jì)數(shù),確定當(dāng)前緩存扇區(qū)編碼,比較所述緩存扇區(qū)編碼與所述緩存扇區(qū)的最大編碼數(shù)大小:若該緩存扇區(qū)編碼小于所述緩存分區(qū)的最大編碼數(shù),判斷下一組數(shù)據(jù)能夠在本緩存分區(qū)中寫(xiě)入成功,若緩存扇區(qū)編碼等于所述緩存分區(qū)的最大編碼數(shù),則判斷所述緩存分區(qū)已滿,轉(zhuǎn)入步驟(Al),將下一組數(shù)據(jù)寫(xiě)入下一個(gè)緩存分區(qū)中; 優(yōu)選的,所述數(shù)據(jù)按照編碼順序?qū)懭胫了鼍彺嫔葏^(qū)中,且所述緩存頁(yè)面一一編碼,所述數(shù)據(jù)寫(xiě)入至緩存扇區(qū)時(shí),按照緩存頁(yè)面的編碼順序依次寫(xiě)入。5.根據(jù)權(quán)利要求1所述的并發(fā)數(shù)據(jù)的緩存方法,其特征在于:所述步驟(A21-3)中,所述數(shù)據(jù)寫(xiě)入成功判斷包括以下步驟:向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)組:當(dāng)判斷所述寫(xiě)鎖定狀態(tài)緩存分區(qū)未寫(xiě)滿時(shí),寫(xiě)入成功,繼續(xù)該組緩存分區(qū)的數(shù)據(jù)寫(xiě)入;當(dāng)判斷所述寫(xiě)鎖定狀態(tài)緩存分區(qū)寫(xiě)滿或外部數(shù)據(jù)寫(xiě)完畢時(shí),將該組緩存分區(qū)置為寫(xiě)滿狀態(tài),并轉(zhuǎn)入步驟(Al)繼續(xù)下一組外部數(shù)據(jù)的寫(xiě)入; 進(jìn)一步的,所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿判斷包括以下步驟:向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)時(shí),比較外部數(shù)據(jù)量與所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)剩余空間大小,若外部數(shù)據(jù)的數(shù)量大于所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)剩余空間,判斷所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿;或,向所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)入外部發(fā)送的數(shù)據(jù)時(shí),系統(tǒng)報(bào)錯(cuò),則判斷所述寫(xiě)鎖定狀態(tài)的緩存分區(qū)寫(xiě)滿。6.根據(jù)權(quán)利要求1所述的并發(fā)數(shù)據(jù)的緩存方法,其特征在于:所述步驟(BI)之前,還包括實(shí)時(shí)監(jiān)測(cè)是否存在讀鎖定狀態(tài)緩存分區(qū)的步驟,若有,直接轉(zhuǎn)入步驟(B12)讀取所述讀鎖定狀態(tài)緩存分區(qū)內(nèi)的緩存數(shù)據(jù);若無(wú),則轉(zhuǎn)入步驟(BI); 優(yōu)選的,所述數(shù)據(jù)讀取速度大于數(shù)據(jù)寫(xiě)入速度; 優(yōu)選的,其應(yīng)有于生產(chǎn)者與消費(fèi)者模型。7.—種并發(fā)數(shù)據(jù)的緩存結(jié)構(gòu),其特征在于:其同時(shí)進(jìn)行數(shù)據(jù)的寫(xiě)入與讀取,包括一組數(shù)據(jù)寫(xiě)入線程、一組數(shù)據(jù)讀取線程、一組數(shù)據(jù)緩存模塊以及一分區(qū)控制模塊; 所述數(shù)據(jù)緩存模塊包括多組緩存分區(qū); 所述分區(qū)控制模塊與所述數(shù)據(jù)緩存模塊通信連接以控制所述多個(gè)緩存分區(qū)的工作狀態(tài)以及被訪問(wèn)順序,所述分區(qū)控制模塊用于將所述每個(gè)緩存分區(qū)的工作狀態(tài)設(shè)置為空閑狀態(tài)、寫(xiě)鎖定狀態(tài)、寫(xiě)滿狀態(tài)以及讀鎖定狀態(tài)中的任意一種,僅當(dāng)所述緩存分區(qū)為空閑狀態(tài)時(shí)支持寫(xiě)鎖定,且所述緩存分區(qū)處于寫(xiě)鎖定狀態(tài)時(shí)支持?jǐn)?shù)據(jù)寫(xiě)入,僅當(dāng)所述緩存分區(qū)為寫(xiě)滿狀態(tài)時(shí)支持讀鎖定,且所述緩存分區(qū)處于讀鎖定狀態(tài)時(shí)支持?jǐn)?shù)據(jù)讀出; 所述數(shù)據(jù)寫(xiě)入線程與所述數(shù)據(jù)讀取線程分別經(jīng)由所述分區(qū)控制模塊與各緩存分區(qū)通信連接,所述分區(qū)控制模塊控制所述數(shù)據(jù)寫(xiě)入線程與所述數(shù)據(jù)讀取線程訪問(wèn)緩存分區(qū)的順序,以使得所述數(shù)據(jù)寫(xiě)入線程與所述數(shù)據(jù)讀取線程根據(jù)所訪問(wèn)緩存分區(qū)的工作狀態(tài)進(jìn)行數(shù)據(jù)的寫(xiě)入與讀取。8.根據(jù)權(quán)利要求7所述的緩存結(jié)構(gòu),其特征在于:所述每組緩存分區(qū)包括一控制單元以及多組緩存扇區(qū),所述緩存扇區(qū)一一編碼設(shè)置,所述控制單元與所述每組緩存扇區(qū)通信連接,以控制每組緩存分區(qū)中,數(shù)據(jù)寫(xiě)入緩存扇區(qū)的順序; 進(jìn)一步優(yōu)選的,所述每組緩存扇區(qū)包括一控制組件以及多個(gè)緩存頁(yè)面,所述緩存頁(yè)面一一編碼且每組寫(xiě)入數(shù)據(jù)的大小與緩存頁(yè)面相同設(shè)置,所述控制組件與所述緩存頁(yè)面分別通向連接,以控制每組緩存扇區(qū)中,數(shù)據(jù)寫(xiě)入緩存頁(yè)碼的順序。9.根據(jù)權(quán)利要求7所述的緩存結(jié)構(gòu),其特征在于:所述分區(qū)控制模塊包括一寫(xiě)鎖定判斷單元以及一讀鎖定判斷單元; 所述寫(xiě)鎖定判斷單元與數(shù)據(jù)緩存模塊通信連接,以控制數(shù)據(jù)緩存模塊中緩存分區(qū)的訪問(wèn)順序、寫(xiě)鎖定與去寫(xiě)鎖定,所述數(shù)據(jù)寫(xiě)入線程與所述寫(xiě)鎖定判斷單元通信連接以根據(jù)所述寫(xiě)鎖定判斷單元確定的訪問(wèn)順序訪問(wèn)的緩存分區(qū),并根據(jù)當(dāng)前訪問(wèn)緩存分區(qū)的工作狀態(tài)進(jìn)行數(shù)據(jù)的寫(xiě)入操作; 所述讀鎖定判斷單元與相應(yīng)的數(shù)據(jù)緩存模塊通信連接,以控制數(shù)據(jù)緩存模塊中緩存分區(qū)的訪問(wèn)順序、讀鎖定與去讀鎖定,所述數(shù)據(jù)讀取線程與所述讀鎖定判斷單元通信連接以根據(jù)所訪問(wèn)的緩存分區(qū)的當(dāng)前狀態(tài)判斷是否讀取緩存數(shù)據(jù)。10.根據(jù)權(quán)利要求7所述的緩存結(jié)構(gòu),其特征在于:同時(shí)只存在一組寫(xiě)鎖定狀態(tài)緩存分區(qū)與一組讀鎖定狀態(tài)緩存分區(qū)。 優(yōu)選的,所述數(shù)據(jù)緩存模塊為生產(chǎn)者與消費(fèi)者模型。11.一種并發(fā)數(shù)據(jù)的緩存模型,其特征在于:同時(shí)包括至少兩組以上如權(quán)利要求7所述的并發(fā)數(shù)據(jù)的緩存結(jié)構(gòu)。
【文檔編號(hào)】G06F12/0884GK105912479SQ201610210432
【公開(kāi)日】2016年8月31日
【申請(qǐng)日】2016年4月7日
【發(fā)明人】徐馳
【申請(qǐng)人】武漢數(shù)字派特科技有限公司