我還不知道取什麼名字

併發:同時擁有兩個或者多個線程,若是程序在單核處理器上運行,多個線程將交替地換入或者換出內存,這些線程是同時「存在」的,咩咯線程都處於執行過程當中的某個狀態,若是運行在多核處理器上,程序中的每一個線程都將分配到一個處理器核上,所以能夠同時運行。緩存

多個線程操做相同的資源,保證線程安全,合理使用資源。安全

高併發:高併發(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等

相關文章
相關標籤/搜索