leveldb(2) 并發(fā)寫(xiě)入

寫(xiě)入流程

  1. 先加鎖
  2. 往隊(duì)列里加入數(shù)據(jù)(有可能有別的線程也加入數(shù)據(jù))
  3. wait等待隊(duì)首數(shù)據(jù)的線程被喚醒(此時(shí)其它數(shù)據(jù)可以寫(xiě)入隊(duì)列)
while (!w.done && &w != writers_.front()) {
?    w.cv.Wait();
  }
  1. 持有隊(duì)首數(shù)據(jù)的線程被喚醒忧侧,獲取最新的sequence
  2. 獲取當(dāng)前隊(duì)列里的最后一個(gè)數(shù)據(jù)
  3. 將當(dāng)前隊(duì)首至隊(duì)尾的數(shù)據(jù)(為了批量寫(xiě)入)整合
  4. 解鎖(此時(shí)后面的線程又可以寫(xiě)入隊(duì)列拥诡,因?yàn)殛?duì)首到隊(duì)尾的數(shù)據(jù)已經(jīng)被緩存),且第一個(gè)插入的線程為新的隊(duì)首瞒瘸,wait等待喚醒(步驟2)
  5. 插入數(shù)據(jù)
  6. 上鎖操作隊(duì)列拳锚,將此線程隊(duì)首至隊(duì)尾的數(shù)據(jù)都置為已讀,并且喚醒相關(guān)數(shù)據(jù)的線程(這樣喚醒的時(shí)候發(fā)現(xiàn)w.done猾漫,自己的數(shù)據(jù)已經(jīng)和別人的一起寫(xiě)進(jìn)去了点晴,所以直接返回)
  7. 喚醒此時(shí)新的隊(duì)首

leveldb多線程寫(xiě)的關(guān)鍵

經(jīng)過(guò)系統(tǒng)性的分析,我們了解到leveldb實(shí)現(xiàn)高性能安全讀寫(xiě)的幾個(gè)關(guān)鍵點(diǎn):

  1. 利用隊(duì)列將寫(xiě)入線程排隊(duì)有序執(zhí)行悯周,寫(xiě)操作實(shí)現(xiàn)了邏輯上的單線程操作粒督;
  2. 在寫(xiě)入文件和MemTable過(guò)程是無(wú)鎖狀態(tài),此時(shí)可以同時(shí)寫(xiě)入和讀取數(shù)據(jù)禽翼,合并多個(gè)數(shù)據(jù)寫(xiě)入進(jìn)一步提升寫(xiě)入性能屠橄;
  3. 利用原子指針代替鎖避免了鎖本身帶來(lái)的線程切換開(kāi)銷;
  4. 如果通過(guò)迭代器遍歷節(jié)點(diǎn)時(shí)闰挡,因?yàn)閷?xiě)入和讀取指針都是原子的锐墙,所以也不存在安全問(wèn)題;

同時(shí)讀寫(xiě)為何是安全的

  1. 整個(gè)寫(xiě)入過(guò)程操作鏈表的時(shí)候有兩個(gè)步驟长酗,分別是先讓節(jié)點(diǎn)指向后向節(jié)點(diǎn)溪北,然后再讓前向節(jié)點(diǎn)指向自己,第一步因?yàn)闆](méi)有實(shí)際操作鏈表夺脾,所以本身就是安全的之拨,只有第二步執(zhí)行的過(guò)程如果線程切換或者同時(shí)讀取(畢竟都是多核的機(jī)器)才會(huì)有可能存在不安全的可能;
  2. 無(wú)論是寫(xiě)入還是讀取(通過(guò)迭代器順序讀取除外)咧叭,都是先要seek蚀乔,即定位,seek是從高到低方式訪問(wèn)鏈表逐漸逼近期望節(jié)點(diǎn)菲茬,而節(jié)點(diǎn)插入是從低到高插入鏈表吉挣,一旦seek過(guò)程訪問(wèn)了還沒(méi)有插入完畢的節(jié)點(diǎn)時(shí)派撕,該節(jié)點(diǎn)的低于當(dāng)前高度的鏈表已經(jīng)插入完畢,所以也不存在安全問(wèn)題听想;
  3. 單向鏈表插入實(shí)際上只有一步操作腥刹,只要這個(gè)操作是原子的可以保證安全。
  4. 因?yàn)镸emTable沒(méi)有刪除操作汉买,永遠(yuǎn)是添加操作衔峰,也進(jìn)一步鞏固了該設(shè)計(jì)方案
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛙粘,隨后出現(xiàn)的幾起案子垫卤,更是在濱河造成了極大的恐慌,老刑警劉巖出牧,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穴肘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舔痕,警方通過(guò)查閱死者的電腦和手機(jī)评抚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伯复,“玉大人慨代,你說(shuō)我怎么就攤上這事⌒ト纾” “怎么了侍匙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)叮雳。 經(jīng)常有香客問(wèn)我想暗,道長(zhǎng),這世上最難降的妖魔是什么帘不? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任说莫,我火速辦了婚禮,結(jié)果婚禮上寞焙,老公的妹妹穿的比我還像新娘唬滑。我一直安慰自己,他們只是感情好棺弊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著擒悬,像睡著了一般模她。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懂牧,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天侈净,我揣著相機(jī)與錄音尊勿,去河邊找鬼。 笑死畜侦,一個(gè)胖子當(dāng)著我的面吹牛元扔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旋膳,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼澎语,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了验懊?” 一聲冷哼從身側(cè)響起擅羞,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎义图,沒(méi)想到半個(gè)月后减俏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碱工,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年娃承,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怕篷。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡历筝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匙头,到底是詐尸還是另有隱情漫谷,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布蹂析,位于F島的核電站舔示,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏电抚。R本人自食惡果不足惜惕稻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝙叛。 院中可真熱鬧俺祠,春花似錦、人聲如沸借帘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肺然。三九已至蔫缸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間际起,已是汗流浹背拾碌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工吐葱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人校翔。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓弟跑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親防症。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孟辑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ReentrantLock 介紹 一個(gè)可重入的互斥鎖,它具有與使用{synchronized}方法和語(yǔ)句訪問(wèn)的隱式...
    tomas家的小撥浪鼓閱讀 4,056評(píng)論 1 4
  • 一個(gè)簡(jiǎn)單的單例示例 單例模式可能是大家經(jīng)常接觸和使用的一個(gè)設(shè)計(jì)模式告希,你可能會(huì)這么寫(xiě) publicclassUnsa...
    Martin說(shuō)閱讀 2,230評(píng)論 0 6
  • 我本磐石 如何能出水扑浸? 可面對(duì)你們的狂渴 我于心不忍 將擊打磐石的念頭 放進(jìn)你們心中 生命在哪里?信靠在哪里燕偶? 我...
    唐金秀閱讀 1,490評(píng)論 17 25
  • 最近閱讀的效率并不是非常高喝噪,經(jīng)常是拿著一本書(shū),在反復(fù)的看看看指么,但是不知道看到哪里去了酝惧,并且對(duì)于作者的構(gòu)思一期為什么...
    曉丹的日更挑戰(zhàn)閱讀 374評(píng)論 0 4
  • 20180203星期六 天氣 今天早晨早早就起床了,5點(diǎn)就準(zhǔn)備出發(fā)了… 晚六點(diǎn)到家伯诬。匆匆忙忙的一天馬上就要結(jié)束了...
    璇戎爸爸閱讀 278評(píng)論 0 0