




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、聊聊并發(fā)(1):深入分析volatile的實(shí)現(xiàn)原理-編程開發(fā)技術(shù)聊聊并發(fā)(1):深入分析volatile的實(shí) 現(xiàn)原理原文出處:方騰e引言在多線程并發(fā)編程中synchronized和volatile都扮演著重要的角色,volatile 是輕量級(jí)的synchronized,它在多處理器開發(fā)中保證了共享變量的“可見性”。 可見性的意思是當(dāng)一個(gè)線程修改一個(gè)共享變量時(shí),另外一個(gè)線程能讀到這個(gè)修改 的值。它在某些情況下比synchronized的開銷更小,本文將深入分析在硬件層 面上inter處理器是如何實(shí)現(xiàn)volatile的,通過深入分析能幫助我們止確的使 用volatile變量。術(shù)語定義術(shù)語英文單詞描
2、述共享變量在多個(gè)線程z間能夠被共享的變量被稱為共享 變量。共享變雖包括所冇的實(shí)例變屋,靜態(tài)變 量和數(shù)組元素。他們都被存放在堆內(nèi)存中, volatile只作用于共享變量。內(nèi)存屏障memory barriers是一組處理器指令,用于實(shí)現(xiàn)対內(nèi)存操作的順 序限制。緩沖行cache line緩存中可以分配的最小存儲(chǔ)單位。處理器填寫 緩存線時(shí)會(huì)加載整個(gè)緩存線,需耍使用多個(gè)主 內(nèi)存讀周期。原子操作atomic operations不可中斷的一個(gè)或一系列操作。緩存行填充cache line fill當(dāng)處理器識(shí)別到從內(nèi)存中讀取操作數(shù)是對(duì)緩存 的,處理器讀取整個(gè)緩存行到適當(dāng)?shù)木彺?l1, l2, l3的或所有)緩
3、存命中cache hit如果進(jìn)行高速緩存行填充操作的內(nèi)存位置仍然 是下次處理器訪問的地址時(shí),處理器從緩存中 讀取操作數(shù),而不是從內(nèi)存。寫命中write hit當(dāng)處理辭將操作數(shù)寫回到一個(gè)內(nèi)存緩存的區(qū)域 吋,它首先會(huì)檢查這個(gè)緩存的內(nèi)存地址是否在 緩存行屮,如果存在一個(gè)何效的緩存行,則處理器將這個(gè)操作數(shù)寫制到緩存,而不是寫制到 內(nèi)存,這個(gè)操作被稱為寫命中。寫缺失write misses the cache一個(gè)有效的緩存行被寫入到不存在的內(nèi)存區(qū) 域。volat訂e的官方定義java語言規(guī)范第三版中對(duì)volatile的定義如下:java編程語言允許線程訪問 共享變量,為了確保共享變量能被準(zhǔn)確和一致的更新
4、,線程應(yīng)該確保通過排他鎖 單獨(dú)獲得這個(gè)變量。java語言提供了 volatile,在某些情況下比鎖更加方便。 如果一個(gè)字段被聲明成volatile, java線程內(nèi)存模型確保所有線程看到這個(gè)變 量的值是一致的。為什么要使用volatilevolatile變量修飾符如果使用恰當(dāng)?shù)脑挘萻ynchronized的使用和執(zhí)行成本 會(huì)更低,因?yàn)樗粫?huì)引起線程上下文的切換和調(diào)度。volatile的實(shí)現(xiàn)原理那么volatile是如何來保證可見性的呢?在x86處理器下通過工具獲取j1t編 譯器生成的匯編指令來看看對(duì)volatile進(jìn)行寫操作cpu會(huì)做什么事情。java代碼:instance = new s
5、ingleton();/instance 是 volatile 變量匯編代碼:0x01a3dcld:0,(%esp);movb $0 x 0,0 x 1104800(%csi);0x01a3dc24:?lock?addl $0 x有volatile變量修飾的共享變量進(jìn)行寫操作的吋候會(huì)多第二行匯編代碼,通過 查ia-32架構(gòu)軟件開發(fā)者手冊(cè)可知,lock前綴的指令在多核處理器下會(huì)引發(fā)了 兩件事情。將當(dāng)前處理器緩存行的數(shù)據(jù)會(huì)寫回到系統(tǒng)內(nèi)存。這個(gè)寫冋內(nèi)存的操作會(huì)引起在其他cpu里緩存了該內(nèi)存地址的數(shù)據(jù)無效。處理器為了提高處理速度,不直接和內(nèi)存進(jìn)行通訊,而是先將系統(tǒng)內(nèi)存的數(shù)據(jù)讀 到內(nèi)部緩存(l1,l2或
6、其他)后再進(jìn)行操作,但操作完之后不知道何時(shí)會(huì)寫到內(nèi) 存,如果對(duì)聲明了 volatile變量進(jìn)行寫操作,jvm就會(huì)向處理器發(fā)送一條lock 前綴的指令,將這個(gè)變量所在緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存。但是就算寫回到內(nèi) 存,如果其他處理器緩存的值還是舊的,再執(zhí)行計(jì)算操作就會(huì)有問題,所以在多 處理器下,為了保證各個(gè)處理器的緩存是一致的,就會(huì)實(shí)現(xiàn)緩存一致性協(xié)議,每 個(gè)處理器通過嗅探在總線上傳播的數(shù)據(jù)來檢查自己緩存的值是不是過期了,當(dāng)處 理器發(fā)現(xiàn)自c緩存行對(duì)應(yīng)的內(nèi)存地址被修改,就會(huì)將當(dāng)前處理器的緩存行設(shè)置成 無效狀態(tài),當(dāng)處理器要對(duì)這個(gè)數(shù)據(jù)進(jìn)行修改操作的時(shí)候,會(huì)強(qiáng)制重新從系統(tǒng)內(nèi)存 里把數(shù)據(jù)讀到處理器緩存里。這兩
7、件事情在ta-32軟件開發(fā)者架構(gòu)手冊(cè)的第三冊(cè)的多處理器管理章節(jié)(第八 章)中有詳細(xì)闡述。lock前綴指令會(huì)引起處理器緩存回寫到內(nèi)存。lock而綴指令導(dǎo)致在執(zhí)行指令期 間,聲言處理器的lock#信號(hào)。在多處理器環(huán)境屮,lock#信號(hào)確保在聲言該 信號(hào)期間,處理器可以獨(dú)占使用任何共享內(nèi)存。(因?yàn)樗鼤?huì)鎖住總線,導(dǎo)致其他 cpu不能訪問總線,不能訪問總線就意味著不能訪問系統(tǒng)內(nèi)存),但是在最近的 處理器里,lock#信號(hào)一般不鎖總線,而是鎖緩存,畢竟鎖總線開銷比較人。在 & 1. 4章節(jié)有詳細(xì)說明鎖定操作對(duì)處理器緩存的影響,對(duì)丁 intel486和pentium 處理器,在鎖操作時(shí),總是在總線上
8、聲言lock#信號(hào)。但在p6和最近的處理器 中,如果訪問的內(nèi)存區(qū)域已經(jīng)緩存在處理器內(nèi)部,則不會(huì)聲言lock#信號(hào)。相反 地,它會(huì)鎖定這塊內(nèi)存區(qū)域的緩存并回寫到內(nèi)存,并使用緩存-致性機(jī)制來確保 修改的原子性,此操作被稱為“緩存鎖定”,緩存一致性機(jī)制會(huì)阻止同時(shí)修改被 兩個(gè)以上處理器緩存的內(nèi)存區(qū)域數(shù)據(jù)。一個(gè)處理器的緩存回寫到內(nèi)存會(huì)導(dǎo)致其他處理器的緩存無效。1a-32處理器和 intel 64處理器使用mesi (修改,獨(dú)占,共享,無效)控制協(xié)議去維護(hù)內(nèi)部緩 存和其他處理器緩存的一致性。在多核處理器系統(tǒng)屮進(jìn)行操作的吋候,ia-32和 intel 64處理器能嗅探其他處理器訪問系統(tǒng)內(nèi)存和它們的內(nèi)部緩存。
9、它們使用 嗅探技術(shù)保證它的內(nèi)部緩存,系統(tǒng)內(nèi)存和其他處理器的緩存的數(shù)據(jù)在總線上保持 一致。例如在pentium和p6family處理器屮,如呆通過嗅探一個(gè)處理器來檢測(cè) 其他處理器打算寫內(nèi)存地址,而這個(gè)地址當(dāng)前處理共享狀態(tài),那么正在嗅探的處 理器將無效它的緩存行,在下次訪問相同內(nèi)存地址吋,強(qiáng)制執(zhí)行緩存行填充。volat訂e的使用優(yōu)化著名的j3v3并發(fā)編程大師doug lea在jdk7的并發(fā)包里新增一個(gè)隊(duì)列集合類 linkedtransferqueue,他在使用volatile變量時(shí),用一種追加字節(jié)的方式來優(yōu) 化隊(duì)列出隊(duì)和入隊(duì)的性能。追加字節(jié)能優(yōu)化性能?這種方式看起來很神奇,但如果深入理解處理器架構(gòu)
10、就能 理解具中的奧秘。讓我們先來看看nkedtransferqueue這個(gè)類,它使用一個(gè)內(nèi) 部類類型來定義隊(duì)列的頭隊(duì)列(head)和尾節(jié)點(diǎn)(tail),而這個(gè)內(nèi)部類 paddedatomicreference相對(duì)于父類atomicreference只做了一件事情,就將共 享變量追加到64字節(jié)。我們可以來計(jì)算下,一個(gè)對(duì)彖的引用占4個(gè)字節(jié),它追 加了 15個(gè)變量共占60個(gè)字節(jié),再加上父類的value變量,一共64個(gè)字節(jié)。/* head of the queue */private transient final paddedatomicrefcrcnce<qnode> head;/*
11、tail of the queue */static final class paddedatomicreferenee <t> extends atomicreferenee <t>/ enough padding for 64bytes with 4byte refsobject po, pl, p2, p3, p4, p5, p6, p7, p8, p9, pa, pb, pc, pd, pe;paddedatomi creference(t r) super (r); public class atomicreference <v> implemen
12、ts java. io. serializable private volatile v value;/省略其他代碼為什么追加64字節(jié)能夠提高并發(fā)編程的效率呢?因?yàn)閷?duì)于英特爾酷睿i7,酷 睿,atom 和 nctburst, core solo 和 pentium m 處理器的 li, l2 或 l3 緩存 的高速緩存行是64個(gè)字節(jié)寬,不支持部分填充緩存行,這意味著如果隊(duì)列的頭 節(jié)點(diǎn)和尾節(jié)點(diǎn)都不足64字節(jié)的話,處理器會(huì)將它們都讀到同一個(gè)高速緩存行中, 在多處理器下每個(gè)處理器都會(huì)緩存同樣的頭尾節(jié)點(diǎn),當(dāng)一個(gè)處理器試圖修改頭接 點(diǎn)時(shí)會(huì)將整個(gè)緩存行鎖定,那么在緩存一致性機(jī)制的作用下,會(huì)導(dǎo)致其他處理器 不能訪問自c高速緩存中的尾節(jié)點(diǎn),而隊(duì)列的入隊(duì)和出隊(duì)操作是需要不停修改頭 接點(diǎn)和尾節(jié)點(diǎn),所以在多處理器的情況下將會(huì)嚴(yán)重影響到隊(duì)列的入隊(duì)和出隊(duì)效 率。doug lea使用追加到64字節(jié)的方式來填滿高速緩沖區(qū)的緩存行,避免頭接 點(diǎn)和尾節(jié)點(diǎn)加載到同一個(gè)緩存行,使得頭尾節(jié)點(diǎn)在修改時(shí)不會(huì)互相鎖定。那么是不是在使用volatile變量時(shí)都應(yīng)該追加到64字節(jié)呢?不是的。在兩種場(chǎng) 景下不應(yīng)該使用這種方式。第一:緩存行非64字節(jié)寬的處理器,如p6系列
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校燃安全管理制度
- 學(xué)校課后班管理制度
- 安保室衛(wèi)生管理制度
- 安全設(shè)備科管理制度
- 安防中控室管理制度
- 定制家具廠管理制度
- 實(shí)訓(xùn)室倉庫管理制度
- 審批程序等管理制度
- 客車gps管理制度
- 宮腔鏡檢查管理制度
- (2024年)健康評(píng)估教學(xué)教案心電圖檢查教案
- 方法模型:展開圖、還原立體圖形
- 2023年廣東省中考生物試卷(含答案)
- 大學(xué)生職業(yè)生涯發(fā)展規(guī)劃智慧樹知到期末考試答案2024年
- 小學(xué)數(shù)學(xué)“組題”設(shè)計(jì)分析 論文
- 中央空調(diào)維護(hù)保養(yǎng)服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 社會(huì)工作學(xué)習(xí)資料
- 初三數(shù)學(xué)-中考模擬試卷
- 工程倫理 課件全套 李正風(fēng) 第1-9章 工程與倫理、如何理解倫理- 全球化視野下的工程倫理
- 肝內(nèi)膽管癌護(hù)理查房課件
- 高速鐵路工務(wù)故障預(yù)防與處理措施
評(píng)論
0/150
提交評(píng)論