精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

剖析Disruptor:為什么會這么快?(一)鎖的缺點

開發 后端
“Disruptor究竟是什么?"。目前我正準備在回答這個問題,但首先回答"為什么它會這么快?"

artin Fowler寫了一篇非常好的文章,里面不僅提到了Disruptor,而且還解釋了Disruptor 如何應用在LMAX的架構里。里面有提及了一些目前沒有涉及的概念,但最經常問到的問題是 “Disruptor究竟是什么?"。

目前我正準備在回答這個問題,但首先回答"為什么它會這么快?"

這些問題持續出現,但是我不能沒有說它是干什么的就說它為什么會這么快,不能沒有說它為什么這樣做就說它是什么東西。

所以我陷入了一個僵局,一個如何寫博客的僵局。

要打破這個僵局,我準備以最簡單方式回答第一個問題,如果幸運的話,在以后博文里,如果需要解釋的話我會重新提回:Disruptor提供了一種線程之間信息交換的方式。

作為一個開發者,因為"線程"一詞的出現,我的警鐘已經敲響,它意味著并發,而并發是困難的。

并發 01

想象有兩個線程嘗試修改同一個變量value:

情況一:線程1先到達

  1. 變量value的值變為”blah”。
  2. 然后當線程2到達時,變量value的值變為”blahy”。

情況二:線程2先到達

  1. 變量value的值變為”fluffy”。
  2. 然后當線程1到達時,值變為”blah”。

情況三:線程1與線程2交互

  1. 線程2得到值"fluff"然后賦給本地變量myValue。
  2. 線程1改變value的值為”blah”。
  3. 然后線程2醒來并把變量value的值改為”fluffy”

情況三顯然是唯一一個是錯誤的,除非除非你認為wiki編輯的幼稚做法是正確的(Google Code Wiki,我一直在關注你)。其他兩種情況主要是看你的意圖和想要達到的效果。線程2可能不會關心變量value的值是什么,主要的意圖就是在后面加上字符 ‘y'而不管它原來的值是什么,在這種前提下,情況一和情況二都是正確的。

但是如果線程2只是想把"fluff"改為”fluffy”,那么情況二和三都不正確。假定線程2想把值設為”fluffy”,有幾種辦法可以解決這個問題:

辦法一:悲觀鎖

(“No Entry”的標志對于在沒有在英國開車的人看得明白不?)

悲觀鎖和樂觀鎖這兩個詞通常在我們談論數據庫讀寫時經常會用到,但原理可以應用到在獲得一個對象的鎖的情況。

只要線程2一獲得Entry 的互斥鎖,它就會阻擊其它線程去改變它,然后它就可以隨意做它要做的事情,設置值,然后做其它事情。

你可以想象這里非常耗性能的,因為其它線程在系統各處徘徊著準備要獲得鎖然后又阻塞。線程越多,系統的響應性就會越慢.

辦法二:樂觀鎖

在這種情況,當線程2需要去寫Entry時才會去鎖定它.它需要檢查Entry自從上次讀過后是否已經被改過了。如果線程1在線程2讀完后到達并把值改為”blah”,線程2讀到了這個新值,線程2不會把"fluffy"寫到Entry里并把線程1所寫的數據覆蓋.線程2會重試(重新讀新的值,與舊值比較,如果相等則在變量的值后面附上’y’),這里在線程2不會關心新的值是什么的情況.或者線程2會拋出一個異常,或者會返回一個某些字段已更新的標志,這是在期望把”fluff”改為”fluffy”的情況.舉一個第二種情況的例子,如果你和另外一個用戶同時更新一個Wiki的頁面,你會告訴另外一個用戶的線程 Thread 2,它們需要重新加載從Thread1來新的變化,然后再提交它們的內容。

潛在的問題:死鎖

鎖定會帶來各種各樣的問題,比如死鎖,想象有2個線程需要訪問兩個資源

如果你濫用鎖技術,兩個鎖都在獲得鎖的情況下嘗試去獲得另外一個鎖,那就是你應該重啟你的電腦的時候了。(校注:作者還挺幽默)

很明確的一個問題:鎖技術是慢的..

關于鎖就是它們需要操作系統去做裁定。線程就像兩姐妹在為一個玩具在爭吵,然后操作系統就是能決定他們誰能拿到玩具的父母,就像當你跑向你父親告訴他你的姐姐在你玩著的時候搶走了你的變形金剛-他還有比你們爭吵更大的事情去擔心,他或許在解決你們爭吵之前要啟動洗碗機并把它擺在洗衣房里。如果你把你的注意力放在鎖上,不僅要花時間來讓操作系統來裁定。Disruptor論文中講述了我們所做的一個實驗。這個測試程序調用了一個函數,該函數會對一個 64位的計數器循環自增5億次。當單線程無鎖時,程序耗時300ms。如果增加一個鎖(仍是單線程、沒有競爭、僅僅增加鎖),程序需要耗時 10000ms,慢了兩個數量級。更令人吃驚的是,如果增加一個線程(簡單從邏輯上想,應該比單線程加鎖快一倍),耗時224000ms。使用兩個線程對計數器自增5億次比使用無鎖單線程慢1000倍。并發很難而鎖的性能糟糕。我僅僅是揭示了問題的表面,而且,這個例子很簡單。但重點是,如果代碼在多線程環境中執行,作為開發者將會遇到更多的困難:

  • 代碼沒有按設想的順序執行。上面的場景3表明,如果沒有注意到多線程訪問和寫入相同的數據,事情可能會很糟糕。
  • 減慢系統的速度。場景3中,使用鎖保護代碼可能導致諸如死鎖或者效率問題。

這就是為什么許多公司在面試時會多少問些并發問題(當然針對Java面試)。不幸的是,即使未能理解問題的本質或沒有問題的解決方案,也很容易學會如何回答這些問題。

#p#

Disruptor如何解決這些問題。

首先,Disruptor根本就不用鎖。

取而代之的是,在需要確保操作是線程安全的(特別是,在多生產者的環境下,更新下一個可用的序列號)地方,我們使用CAS(Compare And Swap/Set)操作。這是一個CPU級別的指令,在我的意識中,它的工作方式有點像樂觀鎖——CPU去更新一個值,但如果想改的值不再是原來的值,操作就失敗,因為很明顯,有其它操作先改變了這個值。

注意,這可以是CPU的兩個不同的核心,但不會是兩個獨立的CPU。

CAS操作比鎖消耗資源少的多,因為它們不牽涉操作系統,它們直接在CPU上操作。但它們并非沒有代價——在上面的試驗中,單線程無鎖耗時 300ms,單線程有鎖耗時10000ms,單線程使用CAS耗時5700ms。所以它比使用鎖耗時少,但比不需要考慮競爭的單線程耗時多。

回到Disruptor,在我講生產者時講過ClaimStrategy。在這些代碼中,你可以看見兩個策略,一個是SingleThreadedStrategy(單線程策略)另一個是 MultiThreadedStrategy(多線程策略)。你可能會有疑問,為什么在只有單個生產者時不用多線程的那個策略?它是否能夠處理這種場景?當然可以。但多線程的那個使用了AtomicLong(Java提供的CAS操作),而單線程的使用long,沒有鎖也沒有CAS。這意味著單線程版本會非常快,因為它只有一個生產者,不會產生序號上的沖突。

我知道,你可能在想:把一個數字轉成AtomicLong不可能是Disruptor速度快的唯一秘密。當然,它不是,否則它不可能稱為“為什么這么快(第一部分)”。

但這是非常重要的一點——在整個復雜的框架中,只有這一個地方出現多線程競爭修改同一個變量值。這就是秘密。還記得所有的訪問對象都擁有序號嗎?如果只有一個生產者,那么系統中的每一個序列號只會由一個線程寫入。這意味著沒有競爭、不需要鎖、甚至不需要CAS。在ClaimStrategy中,如果存在多個生產者,唯一會被多線程競爭寫入的序號就是 ClaimStrategy 對象里的那個。

這也是為什么Entry中的每一個變量都只能被一個消費者寫。它確保了沒有寫競爭,因此不需要鎖或者CAS。

回到為什么隊列不能勝任這個工作

因此你可能會有疑問,為什么隊列底層用RingBuffer來實現,仍然在性能上無法與 Disruptor 相比。隊列和最簡單的ring buffer只有兩個指針——一個指向隊列的頭,一個指向隊尾:

如果有超過一個生產者想要往隊列里放東西,尾指針就將成為一個沖突點,因為有多個線程要更新它。如果有多個消費者,那么頭指針就會產生競爭,因為元素被消費之后,需要更新指針,所以不僅有讀操作還有寫操作了。

等等,我聽到你喊冤了!因為我們已經知道這些了,所以隊列常常是單生產者和單消費者(或者至少在我們的測試里是)。

隊列的目的就是為生產者和消費者提供一個地方存放要交互的數據,幫助緩沖它們之間傳遞的消息。這意味著緩沖常常是滿的(生產者比消費者快)或者空的(消費者比生產者快)。生產者和消費者能夠步調一致的情況非常少見。

所以,這就是事情的真面目。一個空的隊列:

一個滿的隊列:

(校對注:這應該是一個雙向隊列)

隊列需要保存一個關于大小的變量,以便區分隊列是空還是滿。否則,它需要根據隊列中的元素的內容來判斷,這樣的話,消費一個節點(Entry)后需要做一次寫入來清除標記,或者標記節點已經被消費過了。無論采用何種方式實現,在頭、尾和大小變量上總是會有很多競爭,或者如果消費操作移除元素時需要使用一個寫操作,那元素本身也包含競爭。

基于以上,這三個變量常常在一個cache line里面,有可能導致false sharing。因此,不僅要擔心生產者和消費者同時寫size變量(或者元素),還要注意由于頭指針尾指針在同一位置,當頭指針更新時,更新尾指針會導致緩存不命中。這篇文章已經很長了,所以我就不再詳述細節了。

這就是我們所說的“分離競爭點問題”或者隊列的“合并競爭點問題”。通過將所有的東西都賦予私有的序列號,并且只允許一個消費者寫Entry對象中的變量來消除競爭,Disruptor 唯一需要處理訪問沖突的地方,是多個生產者寫入 Ring Buffer 的場景。

總結

Disruptor相對于傳統方式的優點:

  1. 沒有競爭=沒有鎖=非常快。
  2. 所有訪問者都記錄自己的序號的實現方式,允許多個生產者與多個消費者共享相同的數據結構。
  3. 在每個對象中都能跟蹤序列號(ring buffer,claim Strategy,生產者和消費者),加上神奇的cache line padding,就意味著沒有為偽共享和非預期的競爭。

校訂:需要注意Disruptor2.0使用了與本文中不一樣的名字。如果對類名感到困惑,請參考我的變更匯總。

原文鏈接:http://mechanitis.blogspot.com/2011/07/dissecting-disruptor-why-its-so-fast.html(有墻)

http://ifeve.com/disruptor-locks-are-bad/

譯文鏈接:http://ifeve.com/locks-are-bad/

 

責任編輯:陳四芳 來源: ifeve.com
相關推薦

2013-06-14 10:12:22

共享并行

2013-06-19 10:55:40

Disruptor并發框架

2013-06-18 10:30:45

Disruptor框架

2020-03-30 15:05:46

Kafka消息數據

2020-02-27 21:03:30

調度器架構效率

2024-02-26 21:15:20

Kafka緩存參數

2020-02-27 15:44:41

Nginx服務器反向代理

2022-01-04 08:54:32

Redis數據庫數據類型

2024-11-26 08:52:34

SQL優化Kafka

2023-08-29 07:46:08

Redis數據ReHash

2020-10-15 09:19:36

Elasticsear查詢速度

2021-05-27 20:56:51

esbuild 工具JavaScript

2012-08-17 10:01:07

云計算

2023-03-21 08:02:36

Redis6.0IO多線程

2019-02-18 08:10:53

2023-11-02 10:22:29

gRPC后端通信

2024-07-24 08:38:07

2021-03-18 14:34:34

達達集團京東云電商

2020-04-27 07:13:37

Nginx底層進程

2020-10-21 09:17:52

Redis面試內存
點贊
收藏

51CTO技術棧公眾號

欧美网站在线| 国产精品亚洲一区二区三区在线观看| 国产剧情在线观看一区二区| 欧美精品在线极品| 亚洲の无码国产の无码步美| 欧美黑人巨大xxxxx| 国产精品电影一区二区| 国产精品国色综合久久| 久久久久久91亚洲精品中文字幕| 欧美丝袜丝交足nylons172| 欧美一区二区三区日韩| 2022亚洲天堂| 手机av在线播放| 久久久久久久久久久99999| 国产欧美韩国高清| 圆产精品久久久久久久久久久 | 精品欧美日韩| 欧美一级黄视频| 伊人成人网在线看| 久久精品99久久久久久久久| 男男做爰猛烈叫床爽爽小说 | 午夜亚洲一区| 欧美成人免费小视频| 在线 丝袜 欧美 日韩 制服| 国产一区二区三区黄网站| 色婷婷综合久久久中文一区二区| 男人日女人的bb| 永久av在线| 久久久不卡网国产精品二区| 51午夜精品| 在线视频 91| 亚洲欧美日本视频在线观看| 欧美疯狂性受xxxxx另类| 欧美色图17p| 国产一区二区三区网| 日韩高清免费观看| 99久久久无码国产精品性波多 | 久久久久99| 欧美激情在线观看| 疯狂试爱三2浴室激情视频| 免费成人结看片| 日韩精品免费在线播放| 亚洲欧美日韩色| 伊人精品久久| 精品美女一区二区三区| 91性高潮久久久久久久| 91丨精品丨国产| 欧美日本不卡视频| 欧美一级特黄a| 91大神在线观看线路一区| 日韩欧中文字幕| 成人在线观看黄| 婷婷电影在线观看| 黑人巨大精品欧美一区二区| 欧美亚洲日本一区二区三区 | 亚洲成a人v欧美综合天堂| 国产性生活免费视频| 国产精品实拍| 亚洲精品中文字幕乱码三区| 黄色小视频大全| 色av手机在线| 亚洲aⅴ怡春院| 欧美一级在线看| 亚洲黄色免费看| 色婷婷精品久久二区二区蜜臂av | 超碰人人爱人人| 在线观看的网站你懂的| 一区二区视频免费在线观看| 隔壁人妻偷人bd中字| 国产调教在线| 色一区在线观看| 亚欧美在线观看| 国色天香久久精品国产一区| 欧美va在线播放| 西西大胆午夜视频| 精品久久91| 久久精品人人做人人爽| 免费在线观看av网址| 99精品免费视频| 日韩美女在线看| 91福利在线观看视频| 国产成人丝袜美腿| 成人国产亚洲欧美成人综合网| 深夜成人福利| 日本亚洲欧美| 免费福利在线观看| 老**午夜毛片一区二区三区 | 热色播在线视频| 色欧美片视频在线观看| 国内国产精品天干天干| 日韩中文在线| 国产xxxxxxxxx| 2024亚洲男人天堂| 四虎永久免费网站| caoporn97在线视频| 亚洲午夜精品网| 精品久久久久久久免费人妻| 亚州国产精品视频| 我不卡影院28| 91精品国产高清久久久久久久久| 中文字幕欧美在线观看| 国产精品自拍三区| 欧美日韩国产不卡在线看| 午夜在线播放| 精品久久久国产精品999| 国产情侣av自拍| 欧美videos粗暴| 日韩欧美国产精品一区| 一区二区三区少妇| 色狮一区二区三区四区视频| 欧美黄色三级网站| 国内av在线播放| 波多野结衣亚洲一区| 正在播放国产精品| 三上悠亚亚洲一区| 亚洲第一视频网站| 国产免费一区二区三区四区| 老司机精品久久| 国产精品二区三区| 久操视频在线免费播放| 亚洲国产精品久久久男人的天堂 | 日韩专区中文字幕一区二区| 97se国产在线视频| 日本三级视频在线播放| 色婷婷久久久亚洲一区二区三区| 中文字幕无码毛片免费看| 欧美综合在线视频观看| 欧美一级视频在线观看| 亚洲国产精品久久久久久久| 成人欧美一区二区三区视频网页| 蜜臀久久99精品久久久酒店新书| 欧美日韩看看2015永久免费 | 久久成年人视频| 日韩久久久久久久久久| 久久久欧美精品sm网站| 国内外成人激情视频| 老司机在线精品视频| 欧美激情视频给我| www.97超碰| 亚洲理论在线观看| 日本高清免费在线视频| 国产精品精品| 91免费在线视频网站| 最新av网站在线观看| 91福利区一区二区三区| 一二三不卡视频| 国产日韩亚洲| 久热国产精品视频一区二区三区 | 成人黄色av网| 毛片网站在线免费观看| 欧美精品三级在线观看| 波多野结衣久久久久| 精品无人区卡一卡二卡三乱码免费卡 | 欧美多人乱p欧美4p久久| 99精品久久久久久中文字幕| 亚洲欧美一区二区久久 | 亚洲一区二区三区四区电影| 欧美成人激情视频| 亚洲第一色网站| 香蕉av福利精品导航| 男男做爰猛烈叫床爽爽小说| 99成人在线| 欧美一区二区三区电影在线观看 | 日韩一区二区在线观看视频 | 色综合久久久久久久久久久| 欧美丰满少妇人妻精品| 久久av在线| 亚洲黄色成人久久久| 天堂久久一区| 欧美成人免费观看| 神马久久久久久久久久| 色综合网站在线| 日本二区三区视频| 粉嫩蜜臀av国产精品网站| 水蜜桃色314在线观看| 久久99蜜桃| 成人在线视频网站| 四虎影视成人| 亚洲精品中文字幕女同| 一区二区乱子伦在线播放| 中文字幕一区二区在线播放| 性猛交╳xxx乱大交| 午夜在线视频观看日韩17c| 亚洲春色在线| aiai久久| 国产精品高潮呻吟视频| 日本不卡影院| 亚洲区在线播放| aaaa一级片| 欧美性xxxx在线播放| 久久嫩草捆绑紧缚| 99久久99久久精品国产片果冻| 免费一级特黄录像| 亚洲精品精选| 夜夜爽www精品| 狼人精品一区二区三区在线| 国产精品免费看久久久香蕉| 欧美videosex性欧美黑吊| 亚洲性xxxx| 肥臀熟女一区二区三区| 欧美色欧美亚洲另类二区| 久久综合色综合| 国产精品无码永久免费888| 国产成人精品一区二区三区在线观看 | 综合久久五月天| 男人天堂网在线视频| 欧美三级电影精品| 特一级黄色大片| 亚洲视频在线一区| 波多野结衣片子| 懂色av一区二区三区蜜臀| 无人在线观看的免费高清视频 | 日韩亚洲在线视频| 欧美一区高清| 视频一区视频二区视频三区视频四区国产 | 激情av综合网| 精品久久久久久久无码| 亚洲第一伊人| www.一区二区.com| 日韩精品不卡一区二区| 久久一区二区三区av| 欧美一区一区| 国产精品主播视频| 偷拍自拍在线看| 午夜精品一区二区三区av| 日本高清中文字幕在线| 亚洲人成人99网站| 天天干天天草天天射| 日韩欧美一区电影| 国产理论片在线观看| 欧美性色黄大片| 久久久成人免费视频| 午夜精品123| 日本特黄一级片| 亚洲自拍偷拍图区| 久久国产精品波多野结衣| 亚洲男人的天堂网| 亚洲欧美小视频| 成人免费小视频| 黑人狂躁日本娇小| 国产精品高潮呻吟| 成年人视频软件| 国产精品色婷婷久久58| 欧美成人另类视频| 国产欧美中文在线| 蜜桃久久精品成人无码av| 久久久国产精品午夜一区ai换脸| 香蕉视频黄色在线观看| 91在线播放网址| 亚洲第一页av| 久久精品夜色噜噜亚洲aⅴ| 亚洲av无码国产精品麻豆天美| 久久久久久电影| 亚洲AV无码成人精品区明星换面| 国产欧美精品一区二区色综合| 国产男男chinese网站| 97久久精品人人做人人爽| 97人妻天天摸天天爽天天| 久久一区二区三区国产精品| 亚洲国产无码精品| 国产精品久久综合| 手机在线免费看毛片| 一区二区免费视频| 一级aaa毛片| 富二代精品短视频| 亚洲成人av网址| 欧美日韩高清一区二区三区| 国产三级小视频| 亚洲国产高清福利视频| 免费在线观看污视频| 一区二区欧美久久| 成人日日夜夜| 97国产真实伦对白精彩视频8| 伊人久久综合一区二区| 国产精品aaa| 色妞ww精品视频7777| 久久精品国产精品国产精品污| 国产日韩视频在线| 性做爰过程免费播放| 99av国产精品欲麻豆| 色婷婷成人在线| 国产成人精品www牛牛影视| 强迫凌虐淫辱の牝奴在线观看| 欧美激情一区二区三区不卡| 免费视频网站www| 一本色道久久综合亚洲91| 91麻豆一区二区| 亚洲精品720p| 欧美人xxx| 97免费在线视频| 欧美另类激情| 精品不卡一区二区三区| 奇米影视亚洲| 免费在线黄网站| 日韩精品久久理论片| 9191在线视频| 国产女人aaa级久久久级| 久久精品这里只有精品| 日本高清不卡一区| 丰满大乳国产精品| 久久精品久久久久电影| 伊人久久精品一区二区三区| 99一区二区| 日韩在线看片| 久久综合久久色| 成人黄页在线观看| 国产美女福利视频| 在线亚洲一区二区| 日韩一级片免费观看| 久久精品国产一区二区电影| 国产日韩另类视频一区| 国产精品免费一区二区三区观看 | www.射射射| 久久99精品久久久久久久久久久久| 色诱av手机版| 亚洲欧美日本韩国| 中文字幕1区2区3区| 亚洲男人天堂手机在线| 国产丝袜在线播放| 亚洲精品欧美一区二区三区| sdde在线播放一区二区| 日韩网址在线观看| 成人黄色在线视频| 欧美日韩亚洲国产另类| 欧美精品xxxxbbbb| 天堂аⅴ在线地址8| 国产精品爱啪在线线免费观看| 欧美巨大xxxx| 国产欧美日韩小视频| 国产精品资源网| 黑人狂躁日本娇小| 欧美日韩中文字幕精品| 九色视频网站在线观看| 国自在线精品视频| 77成人影视| 男人天堂网站在线| 国产一本一道久久香蕉| 91麻豆精品久久毛片一级| 欧美中文字幕亚洲一区二区va在线 | 亚洲国产精品久久久| 国产99re66在线视频| 不卡视频一区| 亚洲特级毛片| 国产高潮视频在线观看| 亚洲成人综合在线| 无码精品视频一区二区三区| 91av视频在线| 国产91久久精品一区二区| 国模杨依粉嫩蝴蝶150p| 久久精品一级爱片| 综合久久中文字幕| 日韩在线观看网址| 国产999精品在线观看| 亚洲欧美一二三| 国产精品一区二区三区乱码| 欧美成人精品欧美一级| 精品欧美久久久| 亚洲深夜视频| 日韩av大全| 精品一区二区三区视频| 欧美激情精品久久久久久免费 | 青青青手机在线视频观看| 奇米一区二区三区四区久久| 国产精品免费大片| 亚洲免费999| 一区二区国产视频| 香蕉av在线播放| 国产精品第七十二页| 久久亚洲在线| 久久久国产精品久久久| 精品国产1区2区| 91sp网站在线观看入口| 91九色视频在线| 99国产精品99久久久久久粉嫩| 免费a级黄色片| 538在线一区二区精品国产| 免费在线观看的电影网站| 农村寡妇一区二区三区| 美女尤物国产一区| 久久久精品视频在线| 亚洲欧美国产va在线影院| 免费日韩成人| 日韩经典中文字幕| 大黑人交xxx极品hd| 岛国精品一区| 91中文在线视频| 最新日韩av| 精品熟妇无码av免费久久| 日韩一区二区在线观看视频 | 久久久久久久久久久国产| 理论片一区二区在线| 人人干人人干人人| 亚洲成在线观看| 尤物视频在线免费观看| 国产一区二区精品免费| 麻豆专区一区二区三区四区五区| 久久国产一级片| 日韩亚洲欧美成人| 婷婷国产精品| 99热这里只有精品2|