1. 程式人生 > >併發資料結構- 1.8 優先佇列&1.9 總結

併發資料結構- 1.8 優先佇列&1.9 總結

原文連結譯文連結,譯者:郭振斌,校對:周可人

1.8 優先佇列

併發的優先佇列是一個可線性化到順序優先佇列的資料結構,能夠通過常用的優先佇列語義提供insert和delete-min操作。

基於堆的優先佇列

許多文獻中提到的併發優先佇列結構,其實是本書前面提到的可線性化堆結構。再一次的,這種結構的基本思想是在個別堆節點上使用細粒度鎖,使執行緒在並行下也能夠儘可能的訪問資料結構的不同部分。設計這種併發堆的關鍵問題,在於傳統自底向上的insert和自頂向下的delete-min操作有可能造成死鎖。Biswas和Brown[17]提出基於鎖的堆演算法,通過專門的“清理”執行緒解決死鎖。Rao和Kumar[116]建議通過一個將insert和delete-min操作都自頂向下處理的演算法[17]來解決問題。Ayani[11]在他們演算法基礎上做了改善,即通過一種方式在堆兩側進行連續插入。Jones[68]提出一種基於類似斜堆的方案[116]。

Hunt et al.[61]提出一種基於堆的演算法,解決了上述方案的許多侷限性,尤其是針對在堆遍歷中需要獲取多個鎖的問題。此演算法處理上是在一個標記堆大小的變數上加鎖一小段時間和堆的第一個或者最後一個元素上加鎖。為了提升並行性,插入自底向上遍歷堆,而刪除自頂向下,且不會產生死鎖。插入也採用了自左向右技術,就像[11]允許訪問堆兩側,從而最小化衝突。

此外,Huang和Weihl[60]提出了一種基於斐波那契堆[34]並行版本的併發優先佇列。

Herlihy[50], Barnes [12], and Israeli and Rappoport [65]提出了非阻塞可線性化的基於堆的優先佇列演算法。Sundell 和 Tsigas[133]提出了一個基於無鎖版Pugh 併發跳錶的無鎖優先佇列。

基於樹的佇列池

Huang、Weihl[60]和Johnson[66]這樣描述併發優先池:(併發優先池是)鬆散語義的優先佇列,不保證delete-min操作的可線性化。他們的設計都是基於修正版的併發B+樹實現。Johnson引入了一個集合待刪除值的“刪除容器”,從而降低在併發執行delete-min操作時的負載。Shavit和Zemach [130]提出了一個在Pugh併發跳錶中引入“刪除容器”機制的類似(佇列)池。一般情況下,較弱的池語義可以提升併發。在[130]他們還提出,如果允許的鍵容量是有限的(作業系統中通常如此),那麼一個基於結合漏斗節點的二叉樹的優先池可以擴充套件到上百個(相比數十個)處理器。

1.9 結語

我們概述了在共享記憶體多處理器下設計併發資料結構的相關問題,還調研了此領域的一些重要貢獻。概述中清楚的說明了設計併發資料結構的諸多顯著挑戰,在撰寫本文時,併發資料結構的成熟度還遠遠落後於順序結構。然而,在發現關鍵問題和開發新技術方面已經取得了顯著進展,以促進設計有效的併發資料結構;學術界和工業界重新在通過增強硬體來支援同步上產生興趣,我們感到倍受鼓舞。鑑於新認識,新技術和更強大的硬體支援,我們相信併發資料結構設計會在不久的將來出現重大的進步。