并發:同時擁有兩個或者多個線程,如果程式在單核處理器上運作,多個線程将交替地換入或者換出記憶體,這些線程是同時“存在”的,咩咯線程都處于執行過程中的某個狀态,如果運作在多核處理器上,程式中的每個線程都将配置設定到一個處理器核上,是以可以同時運作。
多個線程操作相同的資源,保證線程安全,合理使用資源。
高并發:高并發(High Concurrency)是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時并行處理很多請求。
伺服器能同時處理很多請求,提高程式性能。
CPU多級緩存(緩存一緻性MESI)
為什麼需要CPU cache: CPU的頻率太快了,快到主存跟不上,這樣在處理器時鐘周期内,CPU常常需要等待主存,浪費資源。是以cache的出現,是為了緩解CPU和記憶體之間速度的不比對問題。
CPU cache有什麼意義:
空間局部性:
時間局部性:
用于保證多個CPU cache之間緩存共享資料的一緻
MESI(伊利諾斯協定)是一種廣泛的支援寫回政策的緩存一緻性協定,該協定被應用在Intel奔騰CPU中。
MESI協定中的狀态
CPU中每個緩存行(cache line)使用4種狀态進行标記(使用額外的兩位(bit)表示)
M:被修改(Modified)
該緩存行隻被緩存在該CPU的緩存中,并且是被修改過的(dirty),即與主存中的資料不一緻,該緩存行中的記憶體需要在未來的某個時間點(允許其它CPU讀取主存中相應記憶體之前)寫回(write back)主存。當被寫回主存之後,該緩存行的狀态會變成獨享(exclusive)狀态。
E:獨享的(Exclusive)
該緩存行隻被緩存在該CPU的緩存中,它是未被修改過的(clean),與主存中資料一緻。該狀态可以在任何時刻當有其它CPU讀取到該記憶體時變為共享狀态(shared)。
S:共享的(Shared)
該狀态意味着該緩存行可能被多個CPU緩存,并且各個緩存中的資料與主存資料一緻(clean),當有一個CPU修改該緩存行中,其它CPU中該緩存行可以廢棄(變為無效狀态(Invalid))。
I:無效的(Invalid)
該緩存行是無效的(可能是其它CPU修改了該緩存)
操作:
在一個典型系統中,可能會有幾個緩存(在多核系統中,每個核心都會有自己的緩存)共享主存總線,每個相應的CPU會發出讀寫請求,而緩存的目的是為了減少CPU讀寫共享主存的次數。
1.一個緩存除在Invalid狀态外都可以滿足CPU的讀請求,一個Invalid的緩存行必須從主存中讀取(變成S或E狀态)來滿足該CPU的讀請求。
2.一個寫請求隻有在該緩存行是M或者E狀态時才能被執行,如果緩存行處于S狀态,必須将其它緩存中該緩存行變成Invalid狀态(也即是不允許不同CPU同時修改同一緩存行,即使修改該緩存行中不同位置的資料也不允許),該操作經常用廣播的方式來完成。
3.緩存可以随時将一個非M狀态的緩存行廢棄,或者變成Invalid狀态,而一個M狀态的緩存行必須先被寫回主存
4.一個處于M狀态的緩存行必須時刻監聽所有試圖讀該緩存行相應主存的操作,這種操作必須在緩存将該緩存行寫回主存并将狀态變成S狀态之前被延遲執行。(先寫再讀)
5.一個處于S狀态的緩存行也必須監聽其它緩存使該緩存行無效或者獨享該緩存行的請求,并将該緩存行變為無效(Invalid)。(如果有其它緩存要獨享該緩存行,那麼此緩存就要使它無效)
6.一個處于E狀态的緩存行也必須監聽其它緩存讀主存中該緩存行的操作,一旦有這種操作,該緩存行需要變成S狀态
M和E狀态和該緩存行的真正狀态是一緻的,而S狀态可能是非一緻的,如果一個緩存将處于S狀态的緩存行廢棄了,而另一個緩存實際上可能已經獨享了改緩存行,但是緩存卻不會将該緩存行升遷為E狀态,這是因為其它緩存不會廣播他們廢棄掉該緩存行的通知,同樣由于緩存并沒有儲存該緩存行的copy數量,是以沒有辦法确定自己是否已經獨享了該緩存行。
是以,如果一個CPU想修改一個處于S狀态的緩存行,總線事務需要将所有該緩存行的copy變成Invalid狀态,而修改E狀态的緩存不需要使用總線事務。
Java記憶體模型-同步八種操作
lock(鎖定):作用于主記憶體的變量,把一個變量辨別為一條線程獨占狀态
unlock(解鎖):作用于主記憶體的變量,把一個處于鎖定狀态的變量釋放出來,釋放後的變量才可以被其他線程鎖定
read(讀取):作用于主記憶體的變量,把一個變量值從主記憶體傳輸到線程的工作記憶體中,以便随後的load動作使用
load(載入):作用于工作記憶體的變量,它把read操作從主記憶體中得到的變量值放入工作記憶體的變量副本中
use(使用):作用于工作記憶體的變量,把工作記憶體中的一個變量值傳遞給執行引擎
assign(指派):作用于工作記憶體的變量,它把一個從執行引擎接收到值指派給工作記憶體的變量
store(存儲):作用于工作記憶體的變量,把工作記憶體中的一個變量的值傳送到主記憶體中,以便随後的write的操作
write(寫入):作用于主記憶體的變量,它把store操作從工作記憶體中一個變量的值傳送到主記憶體的變量中
Postman:Http請求模拟工具
Apache Bench(AB):Apache附帶的工具,測試網絡性能
JMeter:Apache組織開發的壓力測試工具
代碼:Semaphore,CountDownLatch等
轉載于:https://www.cnblogs.com/MoisAbby/p/8783601.html