JMM課程小結(摘抄整理)

2022-06-22 18:36:10 字數 3815 閱讀 6530

intel 用mesi

現代cpu的資料一致性實現 = 快取鎖 + 匯流排鎖【早期的唯一實現】

讀取快取以cache line為基本單位,目前64bytes

位於同一快取行的兩個不同資料,被兩個不同cpu鎖定,產生互相影響的偽共享問題

偽共享問題:可以通過補位對齊解決(原理同上,快取行64位,所以資料的前後只要留有佔位的變數就可以避免和其他資料同個快取行)

package

top.gabin.jmm;

/*** cpu,硬體級別的快取是一行讀取的,一般是64位

* * 如果4位元組的x和4位元組的y同時儲存在同乙個快取行中

* * 那麼當對x做寫操作的時候,需要阻塞對y的操作

* 對y的操作也要阻塞x的操作

* * 所以理論上,如果能夠將鎖需要讀取的資料獨立在乙個快取行中,或者在同乙個快取行的其他資料唯讀,則可以提高讀寫效率 */

public

class

cpucachelinepadding

static

class

datacontainer1

public

static

void main(string args) throws

interruptedexception

private

static

void test1() throws

interruptedexception

});t1.start();

thread t2 = new thread(() ->

});t2.start();

t1.join();

t2.join();

}private

static

void test2() throws

interruptedexception

});t1.start();

thread t2 = new thread(() ->

});t2.start();

t1.join();

t2.join();

}}

一、cpu為了提高指令執行效率,會在一條指令執行過程中(比如去記憶體讀資料(慢100倍)),去同時執行另一條指令,前提是,兩條指令沒有依賴關係

package

top.gabin.jmm;

/*** cpu重排序的問題

* * 如果指令1和指令2之間沒有依賴關係,那麼在cpu執行的時候,可能先執行指令2,再去執行指令1

* * 比如說一般乙個方法的jvm彙編指令第乙個是去載入this物件,從記憶體中讀取的速度遠低於cpu 暫存器執行的時間,這時候可能

* 第二條指令只需要執行1ms,那麼有可能,cpu會選擇先執行第二條指令

* * 這個在多執行緒中可能存在乙個執行順序的問題,

* 比如

* * 執行緒1

* b=1

* x=a

* * 執行緒2

* a=1

* y=b

* * 看上去執行緒1的兩行**和執行緒2的兩行**沒有直接關聯,所以存在cpu指令亂序的可能性, */

public

class

disorder );

thread t2 = new thread(() ->);

t1.start();

t2.start();

t1.join();

t2.join();

if (x == 0 && y == 0) }}

public

static

void shortwait(long

interval)

while (start + interval >=end);

}}

二、寫操作也可以進行合併

原理:cpu中存在乙個4槽快取 :writecombinebuffer,比l1級別的快取訪問速度更快。滿4位可以觸發一次合併寫,下面是乙個證明合併寫更快的例子

package

top.gabin.jmm;

/*** 存在乙個wcbuffer的快取,四個槽

* * 這個快取比cpu的l1快取更快

* * 如果能觸發合併寫,寫的速度將會更快 */

public

class

writecombine

}public

static

long

runcaseone()

return system.nanotime() -start;

}public

static

long

runcasetwo()

i =iterations;

while (--i != 0)

return system.nanotime() -start;

}}

硬體記憶體屏障 x86

sfence: store| 在sfence指令前的寫操作當必須在sfence指令後的寫操作前完成。

lfence:load | 在lfence指令前的讀操作當必須在lfence指令後的讀操作前完成。

mfence:modify/mix | 在mfence指令前的讀寫操作當必須在mfence指令後的讀寫操作前完成。

原子指令,如x86上的」lock …」 指令是乙個full barrier,執行時會鎖住記憶體子系統來確保執行順序,甚至跨多個cpu。software locks通常使用了記憶體屏障或原子指令來實現變數可見性和保持程式順序

jvm級別如何規範(jsr133)【8大原子性操作描述已廢棄,但實現未修改】

loadload屏障: 對於這樣的語句

load1;

loadload;

load2,

在load2及後續讀取操作要讀取的資料被訪問前,保證load1要讀取的資料被讀取完畢。

storestore屏障:

對於這樣的語句

store1;

storestore;

store2,

在store2及後續寫入操作執行前,保證store1的寫入操作對其它處理器可見。

loadstore屏障:

對於這樣的語句

load1;

loadstore;

store2,

在store2及後續寫入操作被刷出前,保證load1要讀取的資料被讀取完畢。

storeload屏障:

對於這樣的語句

store1;

storeload;

load2,

​ 在load2及後續所有讀取操作執行前,保證store1的寫入對所有處理器可見。

volatile的實現細節

位元組碼層面 acc_volatile

jvm層面 volatile記憶體區的讀寫 都加屏障

storestorebarrier

volatile 寫操作

storeloadbarrier

loadloadbarrier

volatile 讀操作

loadstorebarrier

synchronized實現細節

位元組碼層面 acc_synchronized monitorenter monitorexit

jvm層面 c c++ 呼叫了作業系統提供的同步機制

:88571740

課程筆記 優秀課程筆記整理

目錄 cs231n 李巨集毅老師機器學習課程 pytorch學習筆記 深度學習概述 神經網路基礎之邏輯回歸 神經網路基礎之python與向量化 淺層神經網路 深層神經網路 深度學習的實用層面 優化演算法 超引數除錯 batch正則化和程式設計框架 機器學習策略 上 機器學習策略 下 卷積神經網路基礎...

web程式設計課程小結

本學期學習了網路程式設計課程,但是並沒有涉及到socket等內容,所以準確來說應該算是web程式設計課,以下是對本學期課程學習要點的一些總結 html css 1 學習了常用的一些簡單標籤,然後製作了單列布局 僅使用了html 的網頁。2 學習css,引入了dom的概念,學習設定元素的屬性。3 在前...

ASE 課程最後小結

這是軟體工程課程最後的小結。在這個軟體工程課程中,我參與了 judy a julia debugger 的課程專案,中間遇到了許多困難,也收穫了許多。在開課前,給自己的能力評分是 comprehension design implementation personal software proces...