新聞中心
前言:
了不起:又到了每天一到面試題的時(shí)候了!學(xué)弟,最近學(xué)習(xí)的怎么樣啊

白云鄂網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年開(kāi)始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
了不起學(xué)弟:最近學(xué)習(xí)的還不錯(cuò),每天都在學(xué)習(xí),每天都在進(jìn)步!
了不起:那你最近學(xué)習(xí)的什么呢?
了不起學(xué)弟:最近在學(xué)習(xí)CPU偽共享,但是不太理解,能不能給我講講呢?
正文:
首先,我們先了解一下CPU的緩存模型。
CPU的緩存分為三層,一級(jí)緩存,二級(jí)緩存,三級(jí)緩存。
如果要獲取一個(gè)內(nèi)存中的數(shù)據(jù),首先會(huì)從一級(jí)緩存中獲取,如果一級(jí)緩存中沒(méi)有,就會(huì)從二級(jí)緩存中獲取,如果二級(jí)緩存中沒(méi)有,就會(huì)從三級(jí)緩存中獲取,如果三級(jí)緩存中沒(méi)有,就會(huì)從內(nèi)存中獲取。
一級(jí)緩存是最快的,越到后面就越慢。那CPU的緩存,是由緩存行組成的,每個(gè)緩存行的大小是64字節(jié),也就是說(shuō),如果我們要獲取一個(gè)數(shù)據(jù),那么就會(huì)把這個(gè)數(shù)據(jù)所在的內(nèi)存地址,以及這個(gè)數(shù)據(jù)所在的內(nèi)存地址的前后64字節(jié)的數(shù)據(jù),都會(huì)加載到緩存行中。
聊到這里,我就給大家看看常見(jiàn)的偽共享問(wèn)題的案例。
假設(shè)有兩個(gè)線程a和b,同時(shí)有兩個(gè)long類型的變量A和B。兩個(gè)變量都是互相緊挨著的。那線程a要去操作A,就會(huì)把變量A和B一起帶入的緩存行,線程b要去操作變量B,也會(huì)同時(shí)把AB帶入緩存行。此時(shí)如果線程a把A做了修改,再通過(guò)BUS總線進(jìn)行了通知,內(nèi)存再做了修改。線程b重新從內(nèi)存獲取變量B,那么此時(shí)這種還需要從內(nèi)存獲取變量,這就是偽共享了。
偽共享:變量AB毫不相關(guān),但是一旦其中一個(gè)變量被修改,另一個(gè)變量也會(huì)被重新加載。
偽共享的解決方案:
- 使用緩存行填充,也就是說(shuō),我們?cè)谧兞緼B之間,加入一些無(wú)用的變量,讓AB不在同一個(gè)緩存行中,這樣就不會(huì)出現(xiàn)偽共享的問(wèn)題了。
舉例:
private static class Padding{
private volatile long a;
public volatile long a1,a2,a3,a4,a5,a6,a7;
private volatile long b;
}2.使用@Contened注解在變量上,同時(shí)在jdk8中還需要在jvm啟動(dòng)參數(shù)中加入
-XX:-RestrictContended,jdk8以上的版本就不需要這個(gè)參數(shù)即可,
這樣就可以解決偽共享的問(wèn)題了。private static class Padding{
@Contended
private volatile long a;
@Contended
private volatile long b;
}結(jié)尾:
今天就給大家分享了一下關(guān)于CPU偽共享的問(wèn)題,大家如果對(duì)CPU緩存模型那塊還有疑問(wèn),可以多查找一下資料,比如MESI緩存一致模型等等。
網(wǎng)頁(yè)名稱:每天一道面試題-CPU偽共享
鏈接URL:http://m.5511xx.com/article/dhpcsip.html


咨詢
建站咨詢
