日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 程序喵大人
[導(dǎo)讀]我們知道,現(xiàn)代CPU都是多核處理器。由于cpu核心(Kernel)讀取內(nèi)存數(shù)據(jù)較慢,于是就有了緩存的概念。我們希望針對(duì)頻繁讀寫(xiě)的某個(gè)內(nèi)存變量,提升本核心的訪問(wèn)速率。因此我們會(huì)給每個(gè)核心設(shè)計(jì)緩存區(qū)(Cache),緩存該變量。由于緩存硬件的讀寫(xiě)速度比內(nèi)存快,所以通過(guò)這種方式可以提升變量訪問(wèn)速度。

引子

小艾吃飯路上碰上小牛,忙問(wèn):你昨天面大廠面的咋樣了?聽(tīng)說(shuō)他們最喜歡問(wèn)多線程相關(guān)知識(shí)。

小牛說(shuō):對(duì)啊,第一個(gè)問(wèn)題我就講了20分鐘,直接把面試官講服了。

小艾忙問(wèn):什么問(wèn)題能講這么久?是不是問(wèn)你情感經(jīng)歷了?

小牛說(shuō):...問(wèn)的volatile關(guān)鍵字。

小艾說(shuō):volatile關(guān)鍵詞的作用一般有如下兩個(gè):

  1. 可見(jiàn)性:當(dāng)一個(gè)線程修改了由volatile關(guān)鍵字修飾的變量的值時(shí),其它線程能夠立即得知這個(gè)修改。
  2. 有序性:禁止編譯器關(guān)于操作volatile關(guān)鍵詞修飾的變量的指令重排序。

你說(shuō)這兩個(gè)說(shuō)了20分鐘?口吃?

小牛說(shuō):你知道volatile的實(shí)現(xiàn)原理嗎?

小艾說(shuō):緩存一致性協(xié)議嘛,這有啥?

小牛說(shuō):既然硬件保證了緩存一致性協(xié)議,無(wú)論該變量是否被volatile關(guān)鍵詞修飾,它都該滿足緩存一致性協(xié)議呀。你這說(shuō)的有點(diǎn)自相矛盾哦。

小艾說(shuō):那volatile的實(shí)現(xiàn)原理是什么?

小牛說(shuō):且聽(tīng)我慢慢道來(lái)。


緩存一致性協(xié)議

我們知道,現(xiàn)代CPU都是多核處理器。由于cpu核心(Kernel)讀取內(nèi)存數(shù)據(jù)較慢,于是就有了緩存的概念。我們希望針對(duì)頻繁讀寫(xiě)的某個(gè)內(nèi)存變量,提升本核心的訪問(wèn)速率。因此我們會(huì)給每個(gè)核心設(shè)計(jì)緩存區(qū)(Cache),緩存該變量。由于緩存硬件的讀寫(xiě)速度比內(nèi)存快,所以通過(guò)這種方式可以提升變量訪問(wèn)速度。緩存的結(jié)構(gòu)可以如下設(shè)計(jì):

緩存結(jié)構(gòu)圖

其中,一個(gè)緩存區(qū)可以分為N個(gè)緩存行(Cache line),緩存行是和內(nèi)存進(jìn)行數(shù)據(jù)交換的最小單位。每個(gè)緩存行包含三個(gè)部分,其中valid用于標(biāo)識(shí)該數(shù)據(jù)的有效性。如果有效位為false,CPU核心就從內(nèi)存中讀取,并將對(duì)應(yīng)舊的緩存行數(shù)據(jù)覆蓋,否則使用舊緩存數(shù)據(jù);tag用于指示數(shù)據(jù)對(duì)應(yīng)的內(nèi)存地址;block則用以存儲(chǔ)數(shù)據(jù),

多核緩存和內(nèi)存

但是,如果涉及到并發(fā)任務(wù),多個(gè)核心讀取同一個(gè)變量值,由于每個(gè)核心讀取的是自己那一部分的緩存,每個(gè)核心的緩存數(shù)據(jù)不一致將會(huì)導(dǎo)致一系列問(wèn)題。緩存一致性的問(wèn)題根源就在于,對(duì)于某個(gè)變量,好幾個(gè)核心對(duì)應(yīng)的緩存區(qū)都有,到底哪個(gè)是新的數(shù)據(jù)呢?如果只有一個(gè)CPU核心對(duì)應(yīng)的緩存區(qū)有該變量,那就沒(méi)事啦,該緩存肯定是新的。

所以為了保證緩存的一致性,業(yè)界有兩種思路:

  1. 寫(xiě)失效(Write Invalidate):當(dāng)一個(gè)核心修改了一份數(shù)據(jù),其它核心如果有這份數(shù)據(jù),就把valid標(biāo)識(shí)為無(wú)效;
  2. 寫(xiě)更新(Write update):當(dāng)一個(gè)核心修改了一份數(shù)據(jù),其它核心如果有這份數(shù)據(jù),就都更新為新值,并且還是標(biāo)記valid有效。

業(yè)界有多種實(shí)現(xiàn)緩存一致性的協(xié)議,諸如MSI、MESI、MOSI、Synapse、Firefly Dragon Protocol等,其中最為流行的是MESI協(xié)議。

MESI協(xié)議就是根據(jù)寫(xiě)失效的思路,設(shè)計(jì)的一種緩存一致性協(xié)議。為了實(shí)現(xiàn)這個(gè)協(xié)議,原先的緩存行修改如下:

緩存結(jié)構(gòu)圖

原先的valid是一個(gè)比特位,代表有效/無(wú)效兩種狀態(tài)。在MESI協(xié)議中,該位改成兩位,不再只是有效和無(wú)效兩種狀態(tài),而是有四個(gè)狀態(tài),分別為:

  1. M(Modified):表示核心的數(shù)據(jù)被修改了,緩存數(shù)據(jù)屬于有效狀態(tài),但是數(shù)據(jù)只處于本核心對(duì)應(yīng)的緩存,還沒(méi)有將這個(gè)新數(shù)據(jù)寫(xiě)到內(nèi)存中。由于此時(shí)數(shù)據(jù)在各個(gè)核心緩存區(qū)只有唯一一份,不涉及緩存一致性問(wèn)題;
  2. E(Exclusive):表示數(shù)據(jù)只存在本核心對(duì)應(yīng)的緩存中,別的核心緩存沒(méi)這個(gè)數(shù)據(jù),緩存數(shù)據(jù)屬于有效狀態(tài),并且該緩存中的最新數(shù)據(jù)已經(jīng)寫(xiě)到內(nèi)存中了。同樣由于此時(shí)數(shù)據(jù)在各個(gè)核心緩存區(qū)只有一份,也不涉及緩存一致性問(wèn)題;
  3. S(Shared):表示數(shù)據(jù)存于多個(gè)核心對(duì)應(yīng)的緩存中,緩存數(shù)據(jù)屬于有效狀態(tài),和內(nèi)存一致。這種狀態(tài)的值涉及緩存一致性問(wèn)題;
  4. I(Invalid):表示該核心對(duì)應(yīng)的緩存數(shù)據(jù)無(wú)效。

看到這里,大家想必知道為什么這個(gè)協(xié)議稱為MESI協(xié)議了吧,它的命名就是取了這四個(gè)狀態(tài)的首字母而已。為了保證緩存一致性,每個(gè)核心要寫(xiě)新數(shù)據(jù)前,需要確保其他核心已經(jīng)置同一變量數(shù)據(jù)的緩存行狀態(tài)位為Invalid后,再把新數(shù)據(jù)寫(xiě)到自己的緩存行,并之后寫(xiě)到內(nèi)存中。

MESI協(xié)議包含以下幾個(gè)行為:

  • 讀(Read):當(dāng)某個(gè)核心需要某個(gè)變量的值,并且該核心對(duì)應(yīng)的緩存沒(méi)這個(gè)變量時(shí),就會(huì)發(fā)出讀命令,希望別的核心緩存或者內(nèi)存能給該核心最新的數(shù)據(jù);
  • 讀命令反饋(Read Response):讀命令反饋是對(duì)讀命令的回應(yīng),包含了之前讀命令請(qǐng)求的數(shù)據(jù)。舉例來(lái)說(shuō),Kernel0發(fā)送讀命令,請(qǐng)求變量a的值,Kernel1對(duì)應(yīng)的緩存區(qū)包含變量a,并且該緩存的狀態(tài)是M狀態(tài),所以Kernel1會(huì)給Kernel0的讀命令發(fā)送讀命令反饋,給出該值;
  • 無(wú)效化(Invalidate):無(wú)效化指令是一條廣播指令,它告訴其他所有核心,緩存中某個(gè)變量已經(jīng)無(wú)效了。如果變量是獨(dú)占的,只存在某一個(gè)核心對(duì)應(yīng)的緩存區(qū)中,那就不存在緩存一致性問(wèn)題了,直接在自己緩存中改了就行,也不用發(fā)送無(wú)效化指令;
  • 無(wú)效化確認(rèn)(Invalidate Acknowledge):該指令是對(duì)無(wú)效化指令的回復(fù),收到無(wú)效化指令的核心,需要將自己緩存區(qū)對(duì)應(yīng)的變量狀態(tài)改為Invalid,并回復(fù)無(wú)效化確認(rèn),以此保證發(fā)送無(wú)效化確認(rèn)的緩存已經(jīng)無(wú)效了;
  • 讀無(wú)效(Read Invalidate):這個(gè)命令是讀命令和無(wú)效化命令的綜合體。它需要接受讀命令反饋和無(wú)效化確認(rèn);
  • 寫(xiě)回(Writeback)這個(gè)命令的意思是將核心中某個(gè)緩存行對(duì)應(yīng)的變量值寫(xiě)回到內(nèi)存中去。

下圖給了個(gè)一個(gè)應(yīng)用MESI讀寫(xiě)數(shù)據(jù)的例子。在該圖中,假設(shè)CPU有兩個(gè)核心,Kernel0表示第一個(gè)核心,Kernel1表示第二個(gè)核心。這里給出了Kernel0想寫(xiě)新數(shù)據(jù)到自己緩存的例子。

  1. 首先Kernel0先完成新數(shù)據(jù)的創(chuàng)建;
  2. Kernel0向全體其他核心發(fā)送無(wú)效化指令,告訴其他核心其所對(duì)應(yīng)的緩存區(qū)中的這條數(shù)據(jù)已經(jīng)過(guò)期無(wú)效。本圖例中只有一個(gè)其他核心,為Kernel1;
  3. 其他核心收到廣播消息后,將自己對(duì)應(yīng)緩存的數(shù)據(jù)的標(biāo)志位記為無(wú)效,然后給Kernel0回確認(rèn)消息;
  4. 收到所有其他Kernel的確認(rèn)消息后,Kernel0才能將新數(shù)據(jù)寫(xiě)回到它所對(duì)應(yīng)的緩存結(jié)構(gòu)中去。

根據(jù)上圖,我們可以發(fā)現(xiàn),影響MESI協(xié)議的時(shí)間瓶頸主要有兩塊:

  1. 無(wú)效化指令:Kernel0需要通知所有的核心,該變量對(duì)應(yīng)的緩存在其他核心中是無(wú)效的。在通知完之前,該核心不能做任何關(guān)于這個(gè)變量的操作。
  2. 確認(rèn)響應(yīng):Kernel0需要收到其他核心的確認(rèn)響應(yīng)。在收到確認(rèn)消息之前,該核心不能做任何關(guān)于這個(gè)變量的操作,需要持續(xù)等待其他核心的響應(yīng),直到所有核心響應(yīng)完成,將其對(duì)應(yīng)的緩存行標(biāo)志位設(shè)為Invalid,才能繼續(xù)其它操作。

針對(duì)這兩部分,我們可以進(jìn)一步優(yōu)化:

  1. 針對(duì)無(wú)效化指令的加速:在緩存的基礎(chǔ)上,引入Store Buffer這個(gè)結(jié)構(gòu)。Store Buffer是一個(gè)特殊的硬件存儲(chǔ)結(jié)構(gòu)。通俗的來(lái)講,核心可以先將變量寫(xiě)入Store Buffer,然后再處理其他事情。如果后面的操作需要用到這個(gè)變量,就可以從Store Buffer中讀取變量的值,核心讀數(shù)據(jù)的順序變成Store Buffer → 緩存 → 內(nèi)存。這樣在任何時(shí)候核心都不用卡住,做不了關(guān)于這個(gè)變量的操作了。引入Store Buffer后的結(jié)構(gòu)如下所示:

Store Buffer結(jié)構(gòu)

  1. 針對(duì)確認(rèn)響應(yīng)的加速:在緩存的基礎(chǔ)上,引入Invalidate Queue這個(gè)結(jié)構(gòu)。其他核心收到Kernel0的Invalidate的命令后,立即給Kernel0回Acknowledge,并把Invalidate這個(gè)操作,先記錄到Invalidate Queue里,當(dāng)其他操作結(jié)束時(shí),再?gòu)腎nvalidate Queue中取命令,進(jìn)行Invalidate操作。所以當(dāng)Kernel0收到確認(rèn)響應(yīng)時(shí),其他核心對(duì)應(yīng)的緩存行可能還沒(méi)完全置為Invalid狀態(tài)。引入Invalidate Queue后的結(jié)構(gòu)如下所示:

Invalidate Queue結(jié)構(gòu)

緩存一致性協(xié)議優(yōu)化存在的問(wèn)題

上一節(jié)講了兩種緩存一致性協(xié)議的加速方式。但是這兩個(gè)方式卻會(huì)對(duì)緩存一致性導(dǎo)致一定的偏差,下面我們來(lái)看一下兩個(gè)出錯(cuò)的例子:

例子1:關(guān)于Store Buffer帶來(lái)的錯(cuò)誤,假設(shè)CPU有兩個(gè)核心,Kernel0表示第一個(gè)核心,Kernel1表示第二個(gè)核心。

...
public void foo(){
    a=1;
    b=1;
}
public void bar(){
    while(b==0continue;
    assert(a==1):"a has a wrong value!";
}
...

如果Kernel0執(zhí)行foo()函數(shù),Kernel1執(zhí)行bar()函數(shù),按照之前我們的理解,如果b變量為1了,那a肯定為1了,assert(a==1)肯定不會(huì)報(bào)錯(cuò)。但是事實(shí)卻不是這樣的。

假設(shè)初始情況是這樣的:在執(zhí)行兩個(gè)函數(shù)前Kernel1的緩存包含變量a=0,不包含緩存變量b,Kernel0的緩存包含變量b=0,不包含緩存變量a。Kernel0執(zhí)行foo()函數(shù),Kernel1執(zhí)行bar()函數(shù)時(shí),。這樣的話計(jì)算機(jī)的指令程序可能會(huì)如下展開(kāi):

  1. Kernel0執(zhí)行a=1。由于Kernel0的緩存行不包含變量a,因此Kernel0會(huì)將變量a的值存在Store Buffer中,并且向其他Kernel進(jìn)行read Invalidate操作,通知a變量緩存無(wú)效;
  2. Kernel1執(zhí)行while(b==0),由于Kernel1的緩存沒(méi)有變量b,因此它需要發(fā)送一個(gè)讀命令,去找b的值;
  3. Kernel0執(zhí)行b=1,由于Kernel0的緩存中已經(jīng)有了變量b,而且別的核心沒(méi)有這個(gè)變量的緩存,所以它可以直接更改緩存b的值;
  4. Kernel0收到讀命令后,將最新的b的值發(fā)送給Kernel1,并且將變量b的狀態(tài)由E(獨(dú)占)改變?yōu)镾(共享);
  5. Kernel1收到b的值后,將其存到自己Kernel對(duì)應(yīng)的緩存區(qū)中;
  6. Kernel1接著執(zhí)行while(b==0),因?yàn)榇藭r(shí)b的新值為1,因此跳出循環(huán);
  7. Kernel1執(zhí)行assert(a==1),由于Kernel1緩存中a的值為0,并且是有效的,所以斷言出錯(cuò);
  8. Kernel1終于收到了第一步Kernel0發(fā)送的Invalidate了,趕緊將緩存區(qū)的a==1置為invalid,但是為時(shí)已晚。

所以我們看到,這個(gè)例子出錯(cuò)的原因完全是由Store Buffer這個(gè)結(jié)構(gòu)引發(fā)的。如果規(guī)定將Store Buffer中數(shù)據(jù)完全刷入到緩存,才能執(zhí)行對(duì)應(yīng)變量寫(xiě)操作的話,該錯(cuò)誤也能避免了。

例子2:關(guān)于Invalidate Queue帶來(lái)的錯(cuò)誤,同樣假設(shè)CPU有兩個(gè)核心,Kernel0表示第一個(gè)核心,Kernel1表示第二個(gè)核心。

...
public void foo(){
    a=1;
    b=1;
}
public void bar(){
    while(b==0continue;
    assert(a==1):"a has a wrong value!";
}
...

Kernel0執(zhí)行foo()函數(shù),Kernel1執(zhí)行bar()函數(shù),猜猜看這次斷言會(huì)出錯(cuò)嗎?

假設(shè)在初始情況是這樣的:變量a的值在Kernel0和Kernel1對(duì)應(yīng)的緩存區(qū)都有,狀態(tài)為S(共享),初值為0,變量b的值是0,狀態(tài)為E(獨(dú)占),只存在于Kernel1對(duì)應(yīng)的緩存區(qū),不存在Kernel0對(duì)應(yīng)的緩存區(qū)。假設(shè)Kernel0執(zhí)行foo()函數(shù),Kernel1執(zhí)行bar()函數(shù)時(shí),程序執(zhí)行過(guò)程如下:

  1. Kernel0執(zhí)行a=1,此時(shí)由于a變量被更改了,需要給Kernel1發(fā)送無(wú)效化命令,并且將a的值存儲(chǔ)在Kernel0的Store Buffer中;
  2. Kernel1執(zhí)行while(b==0),由于Kernel1對(duì)應(yīng)的緩存不包含變量b,它需要發(fā)出一個(gè)讀命令;
  3. Kernel0執(zhí)行b=1,由于是獨(dú)占的,因此它直接更改自己緩存的值;
  4. Kernel0收到讀命令,將最新的b的值發(fā)送給Kernel1,并且將變量b的狀態(tài)改變?yōu)镾(共享);
  5. Kernel1收到Kernel0在第一步發(fā)的無(wú)效化命令,將這個(gè)命令存到Invalidate Queue中,打算之后再處理,并且給Kernel0回確認(rèn)響應(yīng);
  6. Kernel1收到包含b值的讀命令反饋,把該值存到自己緩存下;
  7. Kernel1收到b的值之后,打破while循環(huán);
  8. Kernel1執(zhí)行assert(a==1),由于此時(shí)Invalidate Queue中的無(wú)效化a=0這個(gè)緩存值還沒(méi)執(zhí)行,因此Kernel1會(huì)接著用自己緩存中的a=1這個(gè)緩存值,這就出現(xiàn)了問(wèn)題;
  9. Kernel1開(kāi)始執(zhí)行Invalidate Queue中的命令,將a=0這個(gè)緩存值無(wú)效化。但這時(shí)已經(jīng)太晚了。

所以我們看到,這個(gè)例子出錯(cuò)的原因完全是由Invalidate Queue這個(gè)結(jié)構(gòu)引發(fā)的。如果規(guī)定將Invalidate Queue中命令完全處理完,才能執(zhí)行對(duì)應(yīng)變量讀操作的話,該錯(cuò)誤也能避免了。

內(nèi)存屏障

既然剛剛我們遇到了問(wèn)題,那如何改正呢?這里就終于到了今天的重頭戲,內(nèi)存屏障了。內(nèi)存屏障簡(jiǎn)單來(lái)講就是一行命令,規(guī)定了某個(gè)針對(duì)緩存的操作。這里我們來(lái)看一下最常見(jiàn)的寫(xiě)屏障和讀屏障。

  1. 針對(duì)Store Buffer:核心在后續(xù)變量的新值寫(xiě)入之前,把Store Buffer的所有值刷新到緩存;核心要么就等待刷新完成后寫(xiě)入,要么就把后續(xù)的后續(xù)變量的新值放到Store Buffer中,直到Store Buffer的數(shù)據(jù)按順序刷入緩存。這種也稱為內(nèi)存屏障中的寫(xiě)屏障(Store Barrier)。
  2. 針對(duì)Invalidate Queue:執(zhí)行后需等待Invalidate Queue完全應(yīng)用到緩存后,后續(xù)的讀操作才能繼續(xù)執(zhí)行,保證執(zhí)行前后的讀操作對(duì)其他CPU而言是順序執(zhí)行的。這種也稱為內(nèi)存屏障中的讀屏障(Load Barrier)。

volatile中的內(nèi)存屏障

對(duì)于JVM的內(nèi)存屏障實(shí)現(xiàn)中,也采取了內(nèi)存屏障。JVM的內(nèi)存屏障有四種,這四種實(shí)際上也是上述的讀屏障和寫(xiě)屏障的組合。我們來(lái)看一下這四種屏障和他們的作用:

  1. LoadLoad屏障:對(duì)于這樣的語(yǔ)句

    第一大段讀數(shù)據(jù)指令; 
    LoadLoad; 
    第二大段讀數(shù)據(jù)指令;

LoadLoad指令作用:在第二大段讀數(shù)據(jù)指令被訪問(wèn)前,保證第一大段讀數(shù)據(jù)指令執(zhí)行完畢

  1. StoreStore屏障:對(duì)于這樣的語(yǔ)句

    第一大段寫(xiě)數(shù)據(jù)指令; 
    StoreStore; 
    第二大段寫(xiě)數(shù)據(jù)指令;

StoreStore指令作用:在第二大段寫(xiě)數(shù)據(jù)指令被訪問(wèn)前,保證第一大段寫(xiě)數(shù)據(jù)指令執(zhí)行完畢

  1. LoadStore屏障:對(duì)于這樣的語(yǔ)句

    第一大段讀數(shù)據(jù)指令; 
    LoadStore; 
    第二大段寫(xiě)數(shù)據(jù)指令;

LoadStore指令作用:在第二大段寫(xiě)數(shù)據(jù)指令被訪問(wèn)前,保證第一大段讀數(shù)據(jù)指令執(zhí)行完畢。

  1. StoreLoad屏障:對(duì)于這樣的語(yǔ)句

    第一大段寫(xiě)數(shù)據(jù)指令; 
    StoreLoad; 
    第二大段讀數(shù)據(jù)指令;

StoreLoad指令作用:在第二大段讀數(shù)據(jù)指令被訪問(wèn)前,保證第一大段寫(xiě)數(shù)據(jù)指令執(zhí)行完畢。

針對(duì)volatile變量,JVM采用的內(nèi)存屏障是:

  1. 針對(duì)volatile修飾變量的寫(xiě)操作:在寫(xiě)操作前插入StoreStore屏障,在寫(xiě)操作后插入StoreLoad屏障;
  2. 針對(duì)volatile修飾變量的讀操作:在每個(gè)volatile讀操作前插入LoadLoad屏障,在讀操作后插入LoadStore屏障;

通過(guò)這種方式,就可以保證被volatile修飾的變量具有線程間的可見(jiàn)性和禁止指令重排序的功能了。

總結(jié)

講了這么多,我們來(lái)總結(jié)一下。

volatile關(guān)鍵字保證了兩個(gè)性質(zhì):

  • 可見(jiàn)性:可見(jiàn)性是指當(dāng)多個(gè)線程訪問(wèn)同一個(gè)變量時(shí),一個(gè)線程修改了這個(gè)變量的值,其他線程能夠立即看得到修改的值。
  • 有序性:對(duì)一個(gè)volatile變量的寫(xiě)操作,執(zhí)行在任意后續(xù)對(duì)這個(gè)volatile變量的讀操作之前。

單單緩存一致性協(xié)議無(wú)法實(shí)現(xiàn)volatile。

緩存一致性可以通過(guò)Store Buffer和Invalidate Queue兩種結(jié)構(gòu)進(jìn)行加速,但這兩種方式會(huì)造成一系列不一致性的問(wèn)題。

因此后續(xù)提出了內(nèi)存屏障的概念,分為讀屏障和寫(xiě)屏障,以此修正Store Buffer和Invalidate Queu產(chǎn)生的問(wèn)題。

通過(guò)讀屏障和寫(xiě)屏障,又發(fā)展出了LoadLoad屏障,StoreStore屏障,LoadStore屏障,StoreLoad屏障 JVM也是利用了這幾種屏障,實(shí)現(xiàn)volatile關(guān)鍵字。

參考:

  1. Java多線程編程核心指南
  2. https://www.jianshu.com/p/ef8de88b1343
  3. Paul E. McKenney Memory Barriers: a Hardware View for Software Hackers
  4. https://www.cnblogs.com/xiaolincoding/p/13886559.html

往期推薦


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉