disruptor
- 參考
- 特點
- 閃電 it's fast. very fast
- 600wTPS
- 異步處理
- 線程間通信
- 高吞吐,低延遲
- 有界內存隊列,環形隊列
- 如何處理併發
- 可見性:內存屏障
- 有序性:內存屏障
- 原子性:CAS
- 核心思想
- 生產者往隊列中添加數據前,先申請可用的空閒存儲單元,而且是批量地申請連續的n個存儲單元。當申請到之後再添加就不需要加鎖,不過申請的過程還是需要加鎖的。
- 消費者處理過程類似,也是申請一組連續單元。
- 有個弊端:如果生產者A申請到單元是3-6,生產者B申請到單元7-9,那麼在A沒有完全寫入之前,7-9是無法讀取的。
- cacheline優化
- CPU cache結構:https://www.processon.com/diagraming/5ea13602e401fd21c18997b3
- 64位的機器裏一個CacheLine是64字節。
- CPU 的cache在加載數據的時候,都是以CacheLine爲單位的。
- 情況1:
- 我有一個變量一直在用,希望一直在cache裏,別人都別來動我。那我把這個變量聲明爲final,並且使用padding補齊到64字節。只要被頻繁使用,這個變量就一直在cache裏不會被換出,快如閃電。
- 情況2:
- 每個變量都是一個CacheLine。只有修改這個變量的時候,纔會真正通知別的cpu要更新緩存。
- 如果多個變量在同一個CacheLine,當前我不關心的別的變量變了我也得更新CacheLine。
- 舉個例子。線程1在core1運行將x更新,然後線程2在core2運行,將y更新。
- 如果x和y都在一個CacheLine:線程1在core1運行,將x更新,需要通知core更新緩存,需要將x寫到各級cache,然後core2需要更新各級cache;然後線程2將y更新,同理需要將core2這邊的各級cache更新,然後core1各級緩存也得更新。相當於所有各級緩存更新了兩次。
- 如果x和y不在一個CacheLine:線程1更新x,不需要通知線程2,甚至都不需要更新各級主存。同理線程2更新y也不需要更新各級緩存。那簡直不要太快了。
- 這個是典型的用空間換時間的例子。