了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊
了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步!
了不起:那你最近學習的什么呢?
了不起學弟:最近在學習CPU偽共享,但是不太理解,能不能給我講講呢?
首先,我們先了解一下CPU的緩存模型。
CPU的緩存分為三層,一級緩存,二級緩存,三級緩存。
如果要獲取一個內存中的數據,首先會從一級緩存中獲取,如果一級緩存中沒有,就會從二級緩存中獲取,如果二級緩存中沒有,就會從三級緩存中獲取,如果三級緩存中沒有,就會從內存中獲取。
一級緩存是最快的,越到后面就越慢。那CPU的緩存,是由緩存行組成的,每個緩存行的大小是64字節,也就是說,如果我們要獲取一個數據,那么就會把這個數據所在的內存地址,以及這個數據所在的內存地址的前后64字節的數據,都會加載到緩存行中。
聊到這里,我就給大家看看常見的偽共享問題的案例。
假設有兩個線程a和b,同時有兩個long類型的變量A和B。兩個變量都是互相緊挨著的。那線程a要去操作A,就會把變量A和B一起帶入的緩存行,線程b要去操作變量B,也會同時把AB帶入緩存行。此時如果線程a把A做了修改,再通過BUS總線進行了通知,內存再做了修改。線程b重新從內存獲取變量B,那么此時這種還需要從內存獲取變量,這就是偽共享了。
偽共享:變量AB毫不相關,但是一旦其中一個變量被修改,另一個變量也會被重新加載。
偽共享的解決方案:
舉例:
private static class Padding{ private volatile long a; public volatile long a1,a2,a3,a4,a5,a6,a7; private volatile long b; }
2.使用@Contened注解在變量上,同時在jdk8中還需要在jvm啟動參數中加入-XX:-RestrictContended,jdk8以上的版本就不需要這個參數即可,這樣就可以解決偽共享的問題了。
private static class Padding{ @Contended private volatile long a; @Contended private volatile long b; }
今天就給大家分享了一下關于CPU偽共享的問題,大家如果對CPU緩存模型那塊還有疑問,可以多查找一下資料,比如MESI緩存一致模型等等。
本文鏈接:http://www.tebozhan.com/showinfo-26-153-0.html每天一道面試題-CPU偽共享
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 為什么你不應該使用Div作為可點擊元素
下一篇: 使用AIGC工具提升安全工作效率