disruptor 原理 核心思想

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也不需要更新各級緩存。那簡直不要太快了。
      • 這個是典型的用空間換時間的例子。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章