1. 程式人生 > >cpu快取偽共享

cpu快取偽共享

/**
 * @描述
 * @引數 $
 * @返回值 $
 * @建立人 [email protected]
 * @建立時間 $
 * @修改人和其它資訊
 */
public class FadeShare implements Runnable{



    //陣列長度
    public  static int arrayLength = 4;
    ///陣列
    public static VolatileLong []longs = new VolatileLong[arrayLength];
    //計算次數
    public final static long count_time = 500L * 1000L * 1000L;
    //操作的角標   ---------------------!!!不能宣告成靜態因為那樣代表一個物件,否則執行緒在用的時候每次都要去主存中載入多餘資料在快取,獲取改值進行計算,佔用巨大時間
    public final     int opIndex;
    //對陣列的元素進行賦值:
    static{
        for (int i = 0; i < longs.length; i++) {
            longs[i] = new FadeShare.VolatileLong();
        }
    }
    public  FadeShare(int i){
        this.opIndex = i;
    }


    /**
     * 設計4個執行緒,執行同一個計算量 計算前後時間
     * @param args
     * @throws InterruptedException
     */
    public static  void main(String args []) throws InterruptedException {

        //java 準備清空快取
        Thread.sleep(10000);
        final  long start = System.nanoTime();

        Thread  [] threads = new Thread[arrayLength];
        for(int i = 0 ;i< arrayLength; i++){
            threads[i] = new Thread(new FadeShare(i));
        }

        for (Thread thread : threads){
            thread.start();
        }
        for (Thread thread : threads){
            thread.join();
        }

        System.out.println( System.nanoTime() - start );


    }



    @Override
    public void run() {

        Long i = count_time;
        while ( 0 != --i ){
                longs[opIndex].value = i;

        }


    }

    //48Bit  註釋掉後陣列剩下 8個位元組 以及物件頭12 位元組 會 載入 3個 到一個快取行,其它執行緒執行時候會造成偽共享,只能到記憶體讀取資料
    public final static  class VolatileLong{
        public volatile long value = 0l;
//        public long p1,p2,p3,p4;
//        public int p5;

    }



}

相關推薦

cpu快取共享

/** * @描述 * @引數 $ * @返回值 $ * @建立人 [email protected] * @建立時間 $ * @修改人和其它資訊 */ public class FadeShare implements Runnable{

共享快取行填充以及CPU快取機制

關於偽共享的一篇好文,轉載自: 1.認識CPU Cache CPU Cache概述 隨著CPU的頻率不斷提升,而記憶體的訪問速度卻沒有質的突破,為了彌補訪問記憶體的速度慢,充分發揮CPU的計算資源,提高CPU整體吞吐量,在CPU與記憶體之間引入了一級Cach

快取行、cpu共享快取行填充

由於在看disruptor時瞭解到快取行,以及快取行填充的問題,所以各處瞭解記在這裡 一、快取行 CPU 為了更快的執行程式碼。於是當從記憶體中讀取資料時,並不是只讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 CPU ,快取記憶體

百度開源分散式id生成器uid-generator原始碼剖析 共享(false sharing),併發程式設計無聲的效能殺手 一個Java物件到底佔用多大記憶體? 寫Java也得了解CPU--共享

百度uid-generator原始碼 https://github.com/baidu/uid-generator   snowflake演算法 uid-generator是基於Twitter開源的snowflake演算法實現的。 snowflake將long的64位分為了3部分,時間戳、

百度uid-generator原始碼 共享(false sharing),併發程式設計無聲的效能殺手 一個Java物件到底佔用多大記憶體? 寫Java也得了解CPU--共享

https://github.com/baidu/uid-generator   snowflake演算法 uid-generator是基於Twitter開源的snowflake演算法實現的。 snowflake將long的64位分為了3部分,時間戳、工作機器id和序列號,位數分配如下。

併發程式設計---填充快取行消除共享

快取行最常見的是64位元組。 需要獨佔的屬性的左填充7個位元組,右填充7個位元組。 由於JAVA7中會優化掉無用欄位。 所以要採用繼承的方式繞過優化。 class LhsPadding{ protected long p1,p2,p3,p4,p5,p6,p7; } class V

快取行出發理解volatile變數、共享False sharing、disruptor

volatile關鍵字 當變數被某個執行緒A修改值之後,其它執行緒比如B若讀取此變數的話,立刻可以看到原來執行緒A修改後的值 注:普通變數與volatile變數的區別是volatile的特殊規則保證了新值能立即同步到主記憶體,以及每次使用前可以立即從記憶體重新整理,

cpu共享問題

          CPU內部也會有自己的快取,內部的快取單位是行,叫做快取行。在多核環境下會出現CPU之間的記憶體同步問題(比如一個核載入了一份快取,另外一個核也要用到同一份資料),如果每個核每次需要時都往記憶體中存取,這會帶來比較大的效能損耗,這個問題一般是通過MESI

轉載-cpu共享問題

 CPU內部也會有自己的快取,內部的快取單位是行,叫做快取行。在多核環境下會出現CPU之間的記憶體同步問題(比如一個核載入了一份快取,另外一個核也要用到同一份資料),如果每個核每次需要時都往記憶體中存取,這會帶來比較大的效能損耗,這個問題一般是通過MESI協議來解決的。

共享問題-java快取行填充

原理:解決偽共享的辦法是使用快取行填充,使一個物件佔用的記憶體大小剛好為64bytes或它的整數倍,這樣就保證了一個快取行裡不會有多個物件。 JDK1.8  @Contended 執行時,必須加上虛擬機器引數-XX:-RestrictContended,@Cont

CPU Cache的優化:解決共享問題

無鎖的快取框架: Disruptor 除了使用CAS和提供了各種不同的等待策略來提高系統的吞吐量外。Disruptor大有將優化進行到底的氣勢,它甚至嘗試解決CPU快取的偽共享問題。什麼是偽共享問題呢?我們知道,為了提高CPU的速度,CPU有一個快取記憶體Cac

基於JVM原理、JMM模型和CPU快取模型深入理解Java併發程式設計

許多以Java多執行緒開發為主題的技術書籍,都會把對Java虛擬機器和Java記憶體模型的講解,作為講授Java併發程式設計開發的主要內容,有的還深入到計算機系統的記憶體、CPU、快取等予以說明。實際上,在實際的Java開發工作中,僅僅瞭解併發程式設計的建立、啟動、管理和通訊等基本知識還是不夠的。一

tomcat+nginx+memecached快取session共享出現onBackupWithoutLoadedSession

使用的tomcat+nginx+memecahced共享session,前期執行的好好的,後來一直出現警告資訊 *PM de.javakaffee.web.msm.LockingStrategy onBackupWithoutLoadedSession WARNING: Found

共享

一、偽共享的定義: 偽共享的非標準定義為:快取系統中是以快取行(cache line)為單位儲存的,當多執行緒修改互相獨立的變數時,如果這些變數共享同一個快取行,就會無意中影響彼此的效能,這就是偽共享。 二、CPU快取機制 CPU 快取的百度百科定義為: CPU 快取(Cache Memory)是位於

基於JVM原理JMM模型和CPU快取模型深入理解Java併發程式設計

許多以Java多執行緒開發為主題的技術書籍,都會把對Java虛擬機器和Java記憶體模型的講解,作為講授Java併發程式設計開發的主要內容,有的還深入到計算機系統的記憶體、CPU、快取等予以說明。實際上,在實際的Java開發工作中,僅僅瞭解併發程式設計的建立、啟動、管理和通訊等基本知識還是不夠的。一方面,如果

@sun.misc.Contended 解決共享問題

快取系統中是以快取行(cache line)為單位儲存的。快取行是2的整數冪個連續位元組,一般為32-256個位元組。最常見的快取行大小是64個位元組。當多執行緒修改互相獨立的變數時,如果這些變數共享同一個快取行,就會無意中影響彼此的效能,這就是偽共享。快取行上的寫競爭是

高併發、低延遲之C#玩轉CPU快取記憶體(附示例)

寫在前面 好久沒有寫部落格了,一直在不斷地探索響應式DDD,又get到了很多新知識,解惑了很多老問題,最近讀了Martin Fowler大師一篇非常精彩的部落格The LMAX Architecture,裡面有一個術語Mechanical Sympathy,姑且翻譯成軟硬體協同程式設計(Hardware an

.NET高效能程式設計之C#玩轉CPU快取記憶體(附示例)

寫在前面 好久沒有寫部落格了,一直在不斷地探索響應式DDD,又get到了很多新知識,解惑了很多老問題,最近讀了Martin Fowler大師一篇非常精彩的部落格The LMAX Architecture,裡面有一個術語Mechanical Sympathy,姑且翻譯成軟硬體協同程式設計(Hardware a

Java 7與共享的新仇舊恨

我有個疑問,就是怎麼才能確保底層能夠正確的填充? 下面是我通過工具JOL生成的物件佈局: # Running 64-bit HotSpot VM. # Using compressed oop with 3-bit shift. # Using compressed klass with 3-bit

從Java視角理解系統結構(三)共享

從Java視角理解系統結構連載, 關注我的微博(連結)瞭解最新動態 從我的前一篇博文中, 我們知道了CPU快取及快取行的概念, 同時用一個例子說明了編寫單執行緒Java程式碼時應該注意的問題. 下面我們討論更為複雜, 而且更符合現實情況的多核程式設計時將會碰到的問題. 這些問題更容易犯, 連j