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

Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかShunsukeNakamura17
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化Kumazaki Hiroki
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法Kumazaki Hiroki
 
ダブル配列の実装方法
ダブル配列の実装方法ダブル配列の実装方法
ダブル配列の実装方法Higashiyama Masahiko
 
キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達Kumazaki Hiroki
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
詳説データベース輪読会: 分散合意その2
詳説データベース輪読会: 分散合意その2詳説データベース輪読会: 分散合意その2
詳説データベース輪読会: 分散合意その2Sho Nakazono
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解MITSUNARI Shigeo
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~Hideki Tsunashima
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについてmoai kids
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたMITSUNARI Shigeo
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズムTakuya Akiba
 

What's hot (20)

Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
 
ダブル配列の実装方法
ダブル配列の実装方法ダブル配列の実装方法
ダブル配列の実装方法
 
キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
詳説データベース輪読会: 分散合意その2
詳説データベース輪読会: 分散合意その2詳説データベース輪読会: 分散合意その2
詳説データベース輪読会: 分散合意その2
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~分散学習のあれこれ~データパラレルからモデルパラレルまで~
分散学習のあれこれ~データパラレルからモデルパラレルまで~
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム
 

More from Kumazaki Hiroki

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 論文紹介Kumazaki Hiroki
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
トランザクション入門
トランザクション入門 トランザクション入門
トランザクション入門 Kumazaki Hiroki
 
地理分散DBについて
地理分散DBについて地理分散DBについて
地理分散DBについて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
 

More from Kumazaki Hiroki (13)

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の話
 
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.