SlideShare a Scribd company logo
1 of 58
Lockfree List
Lockfree List って? ,[object Object],[object Object]
挿入処理 A B C D リストの繋ぎ替え処理が一瞬で片付くように工夫して、検索処理の邪魔をしない CompareAndSwap( 以下 CAS) でポインタを差し替える
挿入処理 A B C D リストの繋ぎ替え処理が一瞬で片付くように工夫して、検索処理の邪魔をしない CompareAndSwap( 以下 CAS) でポインタを差し替える CAS
挿入処理 A B C D リストの繋ぎ替え処理が一瞬で片付くように工夫して、検索処理の邪魔をしない CompareAndSwap( 以下 CAS) でポインタを差し替える 成功
挿入処理 A B C D CAS を使う事によって、同一の場所に同時に複数の挿入が発生しても CAS E CAS
挿入処理 A B C D 片方が必ず失敗する 失敗 E 成功
挿入処理 A B C D 失敗したらもう一度接続先を改めてやりなおす E 失敗したのでやりなおし
挿入処理 A B C D 失敗したらもう一度接続先を改めてやりなおす E CAS
挿入処理 A B C D これで直列化できる E 成功
削除処理 A B C 挿入処理と同様に、ポインタを CAS で繋ぎ変える 削除
削除処理 A B C 挿入処理と同様に、ポインタを CAS で繋ぎ変える CAS
削除処理 A C B こうして追い出した後に B を delete - CASのおかげで、複数のスレッドが一つのノードを取り合っても複数回deleteせずに済む delete
削除処理 A C こうして追い出した後に B を delete - CASのおかげで、複数のスレッドが一つのノードを取り合っても複数回deleteせずに済む
しかし問題が ,[object Object],A B C D 削除 削除
しかし問題が ,[object Object],A B C D CAS CAS
しかし問題が ,[object Object],[object Object],A B C D delete delete
しかし問題が ,[object Object],[object Object],[object Object],A D
しかし問題が ,[object Object],A B C D E 削除 挿入
しかし問題が ,[object Object],A B C D E CAS CAS
しかし問題が ,[object Object],[object Object],A B C D E delete
しかし問題が ,[object Object],[object Object],[object Object],A C D E
そこで削除を2段階操作とする ,[object Object],[object Object],[object Object],[object Object]
そうなると? A B C D α :ここまでイタレーションし削除マーキング
そうなると? A B C D α :そして CAS による削除を試みる CAS
そうなると? A B C D α :成功したなら良し
そうなると? ,[object Object],[object Object],A B C D α :ここまでイタレーションし削除マーキング β :ここまでイタレーションし削除マーキング
そうなると? ,[object Object],[object Object],A B C D α : CAS を試みる β : CAS を試みる
そうなると? ,[object Object],[object Object],A B C D α : B のポインタがマーキングされているので CAS に失敗する β : A のポインタは変わらないので CAS に成功する
そうなると? ,[object Object],[object Object],A C D α :リストの先頭からイタレーションし直す
そうなると? ,[object Object],[object Object],A C D α :削除マークを発見
そうなると? ,[object Object],[object Object],A C D α : CAS を試みる
そうなると? ,[object Object],[object Object],[object Object],A C D α : CAS 成功
そうなると? ,[object Object],[object Object],[object Object],A D
そうなると? ,[object Object],A B C D E 削除 挿入
そうなると? ,[object Object],A B C D E α :削除マーキング β : CAS を試みる
そうなると? ,[object Object],A B C D E α :削除マーキング β :マークのせいで CAS 失敗
そうなると? ,[object Object],A B C D E α : CAS を試みる
そうなると? ,[object Object],A B C D E α : CAS 成功 β :リストの頭から再びイタレート
そうなると? ,[object Object],A C D E β :リストの頭から再びイタレート
そうなると? ,[object Object],A C D E β : CAS を試みる
そうなると? ,[object Object],[object Object],A C D E β : CAS 成功
ポイント ,[object Object],[object Object],[object Object],[object Object]
問題点 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
話題 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ABA問題って? A B C D α :ここまでイタレーションし削除マーキング
ABA問題って? A B C D α :そのまましばらく休眠
ABA問題って? A B C D α :そのまましばらく休眠 β :別の用事でイタレーションしてくる
ABA問題って? A B C D α :そのまましばらく休眠 β :マークを確認したので削除
ABA問題って? A B C D α :そのまましばらく休眠 β :マークを確認したので削除
ABA問題って? A B C D α :そのまましばらく休眠 γ : B の後に新規ノード X を挿入する
ABA問題って? A B X D α :そのまましばらく休眠 γ :挿入時に運悪く α が参照中のノードを使いまわしてしまう
ABA問題って? A B X D α :やっと目覚める
ABA問題って? A B X D α : C の削除を再開する
ABA問題って? A B X D α : CAS を発行 CAS C が保存されていた時と同じポインタを指してしまっている
ABA問題って? A B X D α :アドレスが一致しているので CAS 成功 削除する気の無かった X が削除されてしまう
ABA問題って? ,[object Object],[object Object],[object Object]
ABA問題って? ,[object Object],[object Object],[object Object],[object Object],[object Object]

More Related Content

What's hot

プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
 

What's hot (20)

プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
Lockfree Queue
Lockfree QueueLockfree Queue
Lockfree Queue
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
Chokudai search
Chokudai searchChokudai search
Chokudai search
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
CuPy解説
CuPy解説CuPy解説
CuPy解説
 
競プロでGo!
競プロでGo!競プロでGo!
競プロでGo!
 

More from 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 hashing
Kumazaki Hiroki
 

More from Kumazaki Hiroki (15)

An overview of query optimization in relational systems 論文紹介
An overview of query optimization in relational systems 論文紹介An overview of query optimization in relational systems 論文紹介
An overview of query optimization in relational systems 論文紹介
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
トランザクション入門
トランザクション入門 トランザクション入門
トランザクション入門
 
地理分散DBについて
地理分散DBについて地理分散DBについて
地理分散DBについて
 
Cache obliviousの話
Cache obliviousの話Cache obliviousの話
Cache obliviousの話
 
トランザクションを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
 
MerDy
MerDyMerDy
MerDy
 
Bloom filter
Bloom filterBloom filter
Bloom filter
 
SkipGraph
SkipGraphSkipGraph
SkipGraph
 
Lockfree Priority Queue
Lockfree Priority QueueLockfree Priority Queue
Lockfree Priority Queue
 

Lockfree list

  • 2.
  • 3. 挿入処理 A B C D リストの繋ぎ替え処理が一瞬で片付くように工夫して、検索処理の邪魔をしない CompareAndSwap( 以下 CAS) でポインタを差し替える
  • 4. 挿入処理 A B C D リストの繋ぎ替え処理が一瞬で片付くように工夫して、検索処理の邪魔をしない CompareAndSwap( 以下 CAS) でポインタを差し替える CAS
  • 5. 挿入処理 A B C D リストの繋ぎ替え処理が一瞬で片付くように工夫して、検索処理の邪魔をしない CompareAndSwap( 以下 CAS) でポインタを差し替える 成功
  • 6. 挿入処理 A B C D CAS を使う事によって、同一の場所に同時に複数の挿入が発生しても CAS E CAS
  • 7. 挿入処理 A B C D 片方が必ず失敗する 失敗 E 成功
  • 8. 挿入処理 A B C D 失敗したらもう一度接続先を改めてやりなおす E 失敗したのでやりなおし
  • 9. 挿入処理 A B C D 失敗したらもう一度接続先を改めてやりなおす E CAS
  • 10. 挿入処理 A B C D これで直列化できる E 成功
  • 11. 削除処理 A B C 挿入処理と同様に、ポインタを CAS で繋ぎ変える 削除
  • 12. 削除処理 A B C 挿入処理と同様に、ポインタを CAS で繋ぎ変える CAS
  • 13. 削除処理 A C B こうして追い出した後に B を delete - CASのおかげで、複数のスレッドが一つのノードを取り合っても複数回deleteせずに済む delete
  • 14. 削除処理 A C こうして追い出した後に B を delete - CASのおかげで、複数のスレッドが一つのノードを取り合っても複数回deleteせずに済む
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24. そうなると? A B C D α :ここまでイタレーションし削除マーキング
  • 25. そうなると? A B C D α :そして CAS による削除を試みる CAS
  • 26. そうなると? A B C D α :成功したなら良し
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46. ABA問題って? A B C D α :ここまでイタレーションし削除マーキング
  • 47. ABA問題って? A B C D α :そのまましばらく休眠
  • 48. ABA問題って? A B C D α :そのまましばらく休眠 β :別の用事でイタレーションしてくる
  • 49. ABA問題って? A B C D α :そのまましばらく休眠 β :マークを確認したので削除
  • 50. ABA問題って? A B C D α :そのまましばらく休眠 β :マークを確認したので削除
  • 51. ABA問題って? A B C D α :そのまましばらく休眠 γ : B の後に新規ノード X を挿入する
  • 52. ABA問題って? A B X D α :そのまましばらく休眠 γ :挿入時に運悪く α が参照中のノードを使いまわしてしまう
  • 53. ABA問題って? A B X D α :やっと目覚める
  • 54. ABA問題って? A B X D α : C の削除を再開する
  • 55. ABA問題って? A B X D α : CAS を発行 CAS C が保存されていた時と同じポインタを指してしまっている
  • 56. ABA問題って? A B X D α :アドレスが一致しているので CAS 成功 削除する気の無かった X が削除されてしまう
  • 57.
  • 58.