SlideShare a Scribd company logo
1 of 31
Download to read offline
Split-ordered lists: lock-free extensible hash tables O.Shalev and N.Shavit. In Journal of the ACM, 53(3):379-405,NY,USA,2006, ACM Press
概要 複数のスレッドから並列にアクセスしても構造が破壊されないハッシュテーブル ロックを用いず高いスケーラビリティを実現 テーブルの拡張にもロックを用いない
既存研究 細粒度ロックハッシュテーブル DougLea 氏によるバケット単位でのロックによる並列ハッシュテーブル ,[object Object],広く実用されている並列ハッシュとして比較対象 リニアハッシュテーブル ハッシュサイズを変更した際の影響範囲を最小限に抑えるハッシュテーブル ハッシュテーブルアルゴリズムとしては比較的古いけれどこれから紹介するものの先祖
細粒度ロックハッシュテーブル バケット単位でロックを行うハッシュマップ ロック対象バケットをハッシュで決定 リサイズは再帰的 (?) にロックを獲得しながら行う 0 1 2 3 4 5 6 7 鍵 鍵 鍵
細粒度ロックハッシュテーブル バケット単位でロックを行うハッシュマップ ロック対象バケットをハッシュで決定 リサイズは再帰的 (?) にロックを獲得しながら行う 赤い鍵をロックした場合 0, 3, 6 番のバケットがロック 黄色い鍵をロックした場合 1, 4, 7 番のバケットがロック 青い鍵をロックした場合 2, 5 番のバケットがロック 0 1 2 3 4 5 6 7 鍵 鍵 鍵
細粒度ロックハッシュテーブル 同一のロックを持つスレッドは一度に一つしか存在しない スレッドは同時に一つのロックしか持たないのでデッドロックもしない データ保持量に対してロック数を増やす実装もありうる 赤い鍵をロックした場合 0, 3, 6 番のバケットがロック 黄色い鍵をロックした場合 1, 4, 7 番のバケットがロック 青い鍵をロックした場合 2, 5 番のバケットがロック 0 1 2 3 4 5 6 7 鍵 鍵 鍵
リニアハッシュテーブル ハッシュのリサイズ時に移動するアイテムを最少に抑えるハッシュテーブル これ自身は特に並列性への配慮は無し 0 1 2 3 Hash(x) mod 4 == 0 Hash(x) mod 4 == 1 Hash(x) mod 4 == 2 Hash(x) mod 4 == 3
リニアハッシュテーブル 例 ) ハッシュをリサイズして 1 だけ拡大する Mod の係数を倍々で増やしていく 計算後の値が存在しないバケットを指すなら Mod を 1 減らして計算した値を採用する 0 1 2 3 Hash(x) mod 8 == 0 Hash(x) mod 4 == 1 Hash(x) mod 4 == 2 Hash(x) mod 4 == 3 4 追加
リニアハッシュテーブル 下の例では、新しく追加されたバケットに既存のバケットからアイテムを移動させた 0 1 2 3 Hash(x) mod 8 == 0 Hash(x) mod 8 == 1 or 5 Hash(x) mod 8 == 2 or 6 Hash(x) mod 8 == 3 or 7 4 Hash(x) mod 8 == 4
リニアハッシュテーブル 下の例では、新しく追加されたバケットに既存のバケットからアイテムを移動させた Mod 8 に変わる事によって移動する必要が生じたのは Mod 4 == 0 だったバケットのみ 0 1 2 3 Hash(x) mod 8 == 0 Hash(x) mod 8 == 1 or 5 Hash(x) mod 8 == 2 or 6 Hash(x) mod 8 == 3 or 7 4 Hash(x) mod 8 == 4 移動不要
Split-ordered Hashtable リニアハッシュの概念から拡張し、ハッシュサイズが変わっても一切のノード移動が無いよう工夫 「バケットの間をアイテムが移動するのではなく、アイテムの間をバケットが移動する」という文章が印象的
Split-ordered list すべてのアイテムを一つの線形リストに投入 線形リスト内は hash 値で昇順に並んでいる バケットの先頭を表す Sentinel  ノードも同一の線形リストに投入 Sentinel ノードへのショートカットをテーブルとして保持 List は LockfreeList を使うため並列に操作しても壊れない 更に操作失敗時に iterator が先頭に飛ぶ欠点を最寄りの Sentinel ノードへ飛ぶように改善
概念図 一本の線形リストにデータと Sentinel ノードが両方入る 水色がデータ、緑色がハッシュ値 リストの中身はハッシュに沿って昇順 Sentinel ノードはバケットの値をビット逆転した物を使う 説明のため hash 最大値は 1byte にします 0 1 2 3 00 80 40 c0 02 48 6d 7f 8a 74 00000010 ↓ 01000000 00000001 ↓ 10000000 00000011 ↓ 11000000
データの挿入 ,[object Object]
ハッシュ値に対応するテーブルにアクセス
図左の縦長のテーブル
テーブルにSentinelノードへのポインタが書いてあるため対応するノードへジャンプ
図中の赤い線
Sentinelノードの指すポインタを手繰っていけばハッシュの昇順にデータが並んでいるため、対応する場所に挿入 0 1 2 3 00 80 40 c0 02 48 6d 7f 8a 74 69
データの挿入 ,[object Object]
ハッシュ値に対応するテーブルにアクセス
図左の縦長のテーブル
テーブルにSentinelノードへのポインタが書いてあるため対応するノードへジャンプ
図中の赤い線
Sentinelノードの指すポインタを手繰っていけばハッシュの昇順にデータが並んでいるため、対応する場所に挿入 0 1 2 3 00 80 40 c0 02 48 6d 7f 8a 74 69
テーブルの拡張 Sentinel ノードの間に挟まるアイテムの数が一定数を超えた場合にテーブルを拡張する リニアハッシュと違い必ず倍々オーダー あらかじめテーブルはそれなりの広さが用意してあり、コピー無しで拡張可能 , そのためロック不要 それ以上の拡大は後述します 0 1 2 3 00 80 40 c0 02 48 6d 69 7f 8a 74 4 5 6 7
テーブルの拡張 0 1 2 3 00 80 40 c0 02 48 6d 69 7f 8a 74 4 5 6 7 ,[object Object]
テーブル上に無かったらその一個左の Sentinel ノードを探索 ,[object Object]
目的の場所を見つけたら挿入
テーブルの拡張 0 1 2 3 00 80 40 c0 02 48 6d 69 7f 8a 74 4 5 6 7 62 無い! ,[object Object]
テーブル上に無かったらその一個左の Sentinel ノードを探索 ,[object Object]

More Related Content

More from Kumazaki Hiroki

トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法Kumazaki Hiroki
 
キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達Kumazaki Hiroki
 
What is jubatus? How it works for you?
What is jubatus? How it works for you?What is jubatus? How it works for you?
What is jubatus? How it works for you?Kumazaki Hiroki
 
よくわかるHopscotch hashing
よくわかるHopscotch hashingよくわかるHopscotch hashing
よくわかるHopscotch hashingKumazaki Hiroki
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 

More from Kumazaki Hiroki (13)

トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
 
Jubatus hackathon2
Jubatus hackathon2Jubatus hackathon2
Jubatus hackathon2
 
キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達
 
What is jubatus (short)
What is jubatus (short)What is jubatus (short)
What is jubatus (short)
 
What is jubatus? How it works for you?
What is jubatus? How it works for you?What is jubatus? How it works for you?
What is jubatus? How it works for you?
 
よくわかるHopscotch hashing
よくわかるHopscotch hashingよくわかるHopscotch hashing
よくわかるHopscotch hashing
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
MerDy
MerDyMerDy
MerDy
 
Bloom filter
Bloom filterBloom filter
Bloom filter
 
SkipGraph
SkipGraphSkipGraph
SkipGraph
 
Lockfree list
Lockfree listLockfree list
Lockfree list
 
Lockfree Priority Queue
Lockfree Priority QueueLockfree Priority Queue
Lockfree Priority Queue
 
Lockfree Queue
Lockfree QueueLockfree Queue
Lockfree Queue
 

Split-ordered linked list: lock free hash table