多線程條件下cpu高速緩存行失效的處理方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,具體地,涉及一種多線程條件下CPU高速緩存行失效的處理方法及裝置。
【背景技術(shù)】
[0002]Java虛擬機(jī)(英文:Java Virtual Machine,簡(jiǎn)稱:JVM)是運(yùn)行Java程序的抽象計(jì)算機(jī),是Java語言的運(yùn)行環(huán)境。JVM屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使得Java程序只需生成在JVM上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。
[0003]Java內(nèi)存模型規(guī)定,Java程序中的所有變量都存儲(chǔ)在主內(nèi)存中。每條線程還有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了被該線程使用到的變量的主內(nèi)存副本拷貝,線程對(duì)變量的所有操作(如讀取、賦值等)都在工作內(nèi)存中進(jìn)行,但線程間變量的傳遞則需要通過主內(nèi)存來完成。
[0004]此外,Java語言規(guī)范還規(guī)定了可以通過volatile關(guān)鍵字來修飾變量,以保證一個(gè)線程對(duì)該變量的更新會(huì)對(duì)其他線程立即可見,也就是說,保證所述其他線程始終能夠讀取該變量的最新數(shù)據(jù)。
[0005]通常,為了提高線程處理速度,可以將線程頻繁調(diào)用的變量載入線程所在CPU的緩存中。CPU緩存是位于CPU與主內(nèi)存之間的臨時(shí)存儲(chǔ)器,可結(jié)合實(shí)際應(yīng)用被設(shè)置為多級(jí)緩存,各級(jí)緩存以一定大小的緩存行作為基本的存儲(chǔ)單元。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的目的是提供一種多線程條件下CPU高速緩存行失效的處理方法及裝置,使需要被隔離的兩個(gè)字段分開位于兩個(gè)緩存行中,可以有效避免多線程條件下的CPU高速緩存行失效,有助于維持應(yīng)用程序性能。
[0007]第一方面,本發(fā)明實(shí)施例提供了一種多線程條件下CPU高速緩存行失效的處理方法,所述方法包括:
[0008]判斷第一字段和第二字段之間是否需要隔離,所述第一字段用volatile關(guān)鍵字修飾;
[0009]如果需要隔離,在所述第一字段和所述第二字段之間加入填充字段,所述填充字段用于使所述第一字段和所述第二字段位于不同緩存行。
[0010]在第一方面的第一種可能的實(shí)現(xiàn)方式中,所述判斷第一字段和第二字段之間是否需要隔離,包括:
[0011]根據(jù)Java虛擬機(jī)變量重排列規(guī)則,獲得所述第一字段和所述第二字段的間隔距離;
[0012]利用所述間隔距離和處理器的緩存行大小,判斷所述第一字段和所述第二字段是否位于同一緩存行;
[0013]如果位于同一緩存行,判定所述第一字段和所述第二字段之間需要隔離。
[0014]結(jié)合第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,所述Java虛擬機(jī)變量重排列規(guī)則為按照變量的類型進(jìn)行重排列,則所述第一字段、所述第二字段和所述填充字段三者具有相同類型。
[0015]結(jié)合第一方面的第一種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,獲得所述處理器的緩存行大小的方式為:
[0016]利用Java本地接口 JNI調(diào)用C語言函數(shù),并使用所述C語言函數(shù)調(diào)用CPUID匯編指令,獲得所述處理器的緩存行大小。
[0017]結(jié)合第一方面的第一種至第三種中任一種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,獲得所述間隔距離之前,所述方法還包括:
[0018]判斷所述第一字段和所述第二字段是否被標(biāo)識(shí)為需要隔離;
[0019]如果是,再執(zhí)行獲得所述間隔距離的步驟。
[0020]在第一方面的第五種可能的實(shí)現(xiàn)方式中,在所述第一字段和所述第二字段之間加入填充字段,包括:
[0021]修改Java源文件,加入所述填充字段。
[0022]在第一方面的第六種可能的實(shí)現(xiàn)方式中,在所述第一字段和所述第二字段之間加入填充字段,包括:
[0023]對(duì)Java源文件編譯生成的class文件進(jìn)行字節(jié)碼增強(qiáng),加入所述填充字段。
[0024]在第一方面的第七種可能的實(shí)現(xiàn)方式中,在所述第一字段和所述第二字段之間加入填充字段之后,所述方法還包括:
[0025]添加對(duì)所述填充字段的調(diào)用方法。
[0026]第二方面,本發(fā)明實(shí)施例提供了一種多線程條件下CPU高速緩存行失效的處理裝置,所述裝置包括:
[0027]隔離判斷單元,用于判斷第一字段和第二字段之間是否需要隔離,所述第一字段用volatile關(guān)鍵字修飾;
[0028]字段加入單元,用于在所述隔離判斷單元判定所述第一字段和所述第二字段之間需要隔離時(shí),在所述第一字段和所述第二字段之間加入填充字段,所述填充字段用于使所述第一字段和所述第二字段位于不同緩存行。
[0029]在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述隔離判斷單元包括:
[0030]間隔距離獲得單元,用于根據(jù)Java虛擬機(jī)變量重排列規(guī)則,獲得所述第一字段和所述第二字段的間隔距離;
[0031]隔離判斷子單元,用于利用所述間隔距離和處理器的緩存行大小,判斷所述第一字段和所述第二字段是否位于同一緩存行;如果位于同一緩存行,判定所述第一字段和所述第二字段之間需要隔離。
[0032]結(jié)合第二方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,所述隔離判斷單元還包括:
[0033]緩存行大小獲得單元,用于利用Java本地接口 JNI調(diào)用C語言函數(shù),并使用所述C語言函數(shù)調(diào)用CPUID匯編指令,獲得所述處理器的緩存行大小。
[0034]結(jié)合第二方面的第一種或者第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,所述隔離判斷單元還包括:
[0035]標(biāo)識(shí)判斷單元,用于在所述間隔距離獲得單元獲得所述間隔距離之前,判斷所述第一字段和所述第二字段是否被標(biāo)識(shí)為需要隔離;如果是,再通知所述間隔距離獲得單元獲得所述間隔距離。
[0036]在第二方面的第四種可能的實(shí)現(xiàn)方式中,所述字段加入單元,具體用于修改Java源文件,在所述第一字段和所述第二字段之間加入所述填充字段。
[0037]在第二方面的第五種可能的實(shí)現(xiàn)方式中,所述字段加入單元,具體用于對(duì)Java源文件編譯生成的class文件進(jìn)行字節(jié)碼增強(qiáng),在所述第一字段和所述第二字段之間加入所述填充字段。
[0038]在第二方面的第六種可能的實(shí)現(xiàn)方式中,所述裝置還包括:
[0039]調(diào)用方法添加單元,用于在所述字段加入單元加入所述填充字段之后,添加對(duì)所述填充字段的調(diào)用方法。
[0040]結(jié)合發(fā)明人分析研究結(jié)果,當(dāng)兩個(gè)需要被隔離的字段位于同一緩存行時(shí),可能會(huì)因?yàn)榫€程的頻繁更新操作,影響多核處理器的性能,本發(fā)明技術(shù)方案中,在需要被隔離的第一字段和第二字段之間加入填充字段,確保第一字段和第二字段分別位于不同緩存行,如此,便可在需要時(shí)分別載入各自線程所占用CPU,從而有效避免多線程條件下的CPU緩存行失效,有助于維持應(yīng)用程序的性能。
[0041]本發(fā)明的其他特征和優(yōu)點(diǎn)將在隨后的【具體實(shí)施方式】部分予以詳細(xì)說明。
【附圖說明】
[0042]附圖是用來提供對(duì)本發(fā)明的進(jìn)一步理解,并且構(gòu)成說明書的一部分,與下面的【具體實(shí)施方式】一起用于解釋本發(fā)明,但并不構(gòu)成對(duì)本發(fā)明的限制。在附圖中:
[0043]圖1是CPU緩存的示意圖;
[0044]圖2是本發(fā)明多線程條件下CPU高速緩存行失效的處理方法的流程圖;
[0045]圖3是本發(fā)明中判斷第一字段和第二字段之間是否需要隔離的流程圖;
[0046]圖4是本發(fā)明多線程條件下CPU高速緩存行失效的處理裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0047]以下結(jié)合附圖對(duì)本發(fā)明的【具體實(shí)施方式】進(jìn)行詳細(xì)說明。應(yīng)當(dāng)理解的是,此處所描述的【具體實(shí)施方式】?jī)H用于說明和解釋本發(fā)明,并不用于限制本發(fā)明。
[0048]結(jié)合實(shí)際應(yīng)用,發(fā)明人發(fā)現(xiàn)在運(yùn)行環(huán)境基本相同的情況下,多核處理器執(zhí)行一些多線程操作時(shí)的性能較優(yōu),而在執(zhí)行另一些多線