生活随笔
收集整理的這篇文章主要介紹了
多核分布式队列的实现:“偷”与“自私”的运用(1)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
多核分布式隊(duì)列的實(shí)現(xiàn):"偷"與"自私"的運(yùn)用
在討論本文的正題前,不得不先說一些閑話,嫌哆嗦者可以跳過"前言"部分不讀。
在發(fā)表了"老子是偉大的多核計(jì)算科學(xué)家" (鏈接:[url]http://blog.csdn.net/drzhouweiming/archive/2008/11/07/3246254.aspx[/url],為敘述方便,后面將這篇文章簡(jiǎn)稱為"老子")一文后,褒揚(yáng)者有許多,但是也引來了許多板磚。當(dāng)然大部分板磚都只是泛泛的批評(píng),沒有任何內(nèi)容。不過有些人覺得似乎有些牽強(qiáng)附會(huì),倒是引起了我的注意,確實(shí)這類文章可能確實(shí)容易給人牽強(qiáng)附會(huì)的感覺。 需要說明的是,本人并沒有覺得它是牽強(qiáng)附會(huì)的。首先申明一下,我并不是研究哲學(xué)的,也沒有詳細(xì)研究過老子的《道德經(jīng)》,但是我在設(shè)計(jì)多核算法時(shí),確實(shí)受到了《道德經(jīng)》中的思想啟發(fā)。舉兩個(gè)例子如下: 第一個(gè)例子是在設(shè)計(jì)多核查找算法(鏈接:[url]http://blog.csdn.net/drzhouweiming/archive/2008/10/27/3159501.aspx[/url]) 時(shí),最初我是用AVL樹作為多級(jí)查找結(jié)構(gòu)的子查找結(jié)構(gòu)的,當(dāng)時(shí)覺得AVL樹肯定會(huì)比數(shù)組更好,因?yàn)閷?duì)稍微大一點(diǎn)的數(shù)組進(jìn)行插入刪除的效率非常低,只能用在 很少數(shù)據(jù)的表上,不能對(duì)大量數(shù)據(jù)的表進(jìn)行管理。記得有一天看電視時(shí),湊巧看到在講老子的小國(guó)寡民思想,談到了結(jié)繩而治的問題,受此啟發(fā),對(duì)AVL樹比數(shù)組 更好的想法產(chǎn)生了懷疑,于是試著將查找子結(jié)構(gòu)改為用最原始的數(shù)組來實(shí)現(xiàn),結(jié)果發(fā)現(xiàn)即使對(duì)上百萬個(gè)規(guī)模的數(shù)據(jù)的表進(jìn)行處理,綜合性能也比用AVL樹更好。 第二個(gè)例子是在設(shè)計(jì)多核分布式內(nèi)存管理算法時(shí),采用了"搶"的方法,使得分配和釋放內(nèi)存不需要使用鎖。這也是受《道德經(jīng)》中的"無為"及"大道自 然"的思想影響,因?yàn)橹耙呀?jīng)發(fā)現(xiàn)"貪心"、"自私"、"偷"這幾種人性的本能在算法中得到廣泛使用,既然連"偷"都在多核算法中得到使用,那么它的孿生 兄弟"搶"應(yīng)該也可以在多核算法中得到使用,本著此思想,后來終于發(fā)現(xiàn)可以將"搶"的思想用在多核分布式內(nèi)存管理算法中,大大提高共享內(nèi)存分配和釋放的效 率。 對(duì)老子《道德經(jīng)》的解釋,歷來有各種不同的解釋。既然有些人只是在理論層面都可以進(jìn)行解釋,我現(xiàn)在把它的部分思想用到了具體的多核算法中,變成了在計(jì)算機(jī)里可以實(shí)際運(yùn)行的程序,對(duì)它解釋一下就變成了牽強(qiáng)附會(huì)的話,那么這種牽強(qiáng)附會(huì)我想越多越好。 閑話少敘,言歸正傳,下面就來談一個(gè)使用"偷"與"自私"的方法實(shí)現(xiàn)的多核分布式隊(duì)列的詳細(xì)實(shí)例,以看看如何將看似泛泛而談的思想變成可以運(yùn)行的程序的。
在"多核編程中的條件同步模式"(鏈接: [url]http://softwareblogs-zho.intel.com/2009/01/14/845/[/url])這篇文章中,講到了如何減少共享隊(duì)列中的鎖的使用次數(shù)的具體方法,在它的基礎(chǔ)上,可以構(gòu)造出一個(gè)高效的隊(duì)列池。 如果采用線程分組競(jìng)爭(zhēng)模式(參見"多核編程中的線程分組競(jìng)爭(zhēng)模式,鏈接:[url]http://blog.csdn.net/drzhouweiming/archive/2007/07/10/1684753.aspx[/url])來實(shí)現(xiàn)隊(duì)列池,那么每組線程對(duì)應(yīng)于隊(duì)列池中的一個(gè)子隊(duì)列,當(dāng)某個(gè)線程在操作自己所屬的子隊(duì)列時(shí),如果子隊(duì)列為空卻進(jìn)行出隊(duì)操作,那么此時(shí)可以從其他組線程所屬的子隊(duì)列中進(jìn)行出隊(duì)操作,這也就是"老子"一文中所說的"偷"的方法的使用。 有沒有更好的方法進(jìn)一步減少同步或者鎖的使用呢?答案是有的。偷別人的東西總不如掏自己口袋里的東西來得方便,之所以需要"偷",乃是因?yàn)樽约嚎诖锟湛铡H绻蠹叶几辉A?#xff0c;口袋都鼓鼓的了,自然不需要去"偷"別人的了。 當(dāng)然在計(jì)算機(jī)中,"富裕"的辦法就是給每個(gè)線程賦予一個(gè)私有隊(duì)列,這樣每個(gè)線程可以大部分時(shí)間都操作自己私有隊(duì)列,不需要同步操作,大大提高效率,這也就是"老子"一文中所說的"自私"方法的使用。 基于"偷"和"自私"兩種方法,就可以設(shè)計(jì)出一個(gè)適應(yīng)多核環(huán)境的分布式隊(duì)列。在分布式隊(duì)列中,每個(gè)操作隊(duì)列的線程都有一個(gè)私有隊(duì)列,另外為了解決私有隊(duì)列間的負(fù)載均衡問題,還需要一個(gè)隊(duì)列池來維護(hù)數(shù)據(jù)的負(fù)載均衡。 分布式隊(duì)列的數(shù)據(jù)結(jié)構(gòu)示意圖如下: 圖1:分布式隊(duì)列數(shù)據(jù)結(jié)構(gòu)示意圖 有了上面的數(shù)據(jù)結(jié)構(gòu)圖,具體來實(shí)現(xiàn)就可以分為兩個(gè)步驟:
- 1、 實(shí)現(xiàn)一個(gè)隊(duì)列池
- 2、 給每個(gè)線程賦予一個(gè)私有隊(duì)列
隊(duì)列池的實(shí)現(xiàn)可以采用前面講過方法實(shí)現(xiàn),這里就不詳述了,下面主要談?wù)勅绾谓o每個(gè)線程賦予一個(gè)私有隊(duì)列(也稱作本地化隊(duì)列)的詳細(xì)實(shí)現(xiàn)方法。
轉(zhuǎn)載于:https://blog.51cto.com/intelisn/130443
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的多核分布式队列的实现:“偷”与“自私”的运用(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。