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

A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用Takashi Kambayashi
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話Yuta Shimada
 
並行実行制御の最適化手法
並行実行制御の最適化手法並行実行制御の最適化手法
並行実行制御の最適化手法Sho Nakazono
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIShota Imai
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...NTT DATA Technology & Innovation
 
分散システムの限界について知ろう
分散システムの限界について知ろう分散システムの限界について知ろう
分散システムの限界について知ろうShingo Omura
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたMITSUNARI Shigeo
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法Kumazaki Hiroki
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方joisino
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Takahiko Ito
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-Takuya Akiba
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 

What's hot (20)

A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
並行実行制御の最適化手法
並行実行制御の最適化手法並行実行制御の最適化手法
並行実行制御の最適化手法
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
 
分散システムの限界について知ろう
分散システムの限界について知ろう分散システムの限界について知ろう
分散システムの限界について知ろう
 
Paxos
PaxosPaxos
Paxos
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
 
最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
Marp入門
Marp入門Marp入門
Marp入門
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
 
B-link-tree
B-link-treeB-link-tree
B-link-tree
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 

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 (14)

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 Queue
Lockfree QueueLockfree Queue
Lockfree 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.