タグ

lock-freeに関するkamipoのブックマーク (18)

  • Lock-free スナップショットの撮り方を説明してみる - くまメモ

    マルチスレッドなどの環境下で時間経過によって勝手に変化する複数の変数を読みたい場面は多くあります。 しかしCPUは一度に一つしか値を読み書きできないので、簡単には出来ません。 何故なら読んでるそばから値が変動してでたらめな値を読むかも知れないからです。 変動してるものを読むのだから読む側が完璧じゃなくても仕方ないという妥協は有り得ますが 特定のある一瞬の時刻での状態を写真のようにパチリとフィルムに収められたら嬉しいですよね。 一番簡単なのはロックを取りながら読む事ですが、ロックは諸般の事情により使えない事とします。 前提 値が勝手に変動するという状況が分かりにくいと思うので、適当な例えとして卵の孵化を想像してみましょう。 「卵」→「ヒビ」→「ひよこ」 の順でランダムに勝手に進んで行きます。止めることは出来ませんし後戻りもしません。 こんな卵が複数ある孵化器の監視を任されたとします。卵の状態

    Lock-free スナップショットの撮り方を説明してみる - くまメモ
  • 冬のLock-Free祭り

    Please select the category that most closely reflects your concern about the presentation, so that we can review it and determine whether it violates our Terms of Use or isn't appropriate for all viewers.

  • Lock-free Stack - くまメモ

    ではLock-free Stackについて図とプログラムを交えながら説明します。C++ではなくCを使います。 これは複数スレッドからロックによる排他無しで共有できるスタックで、外部には node* top; void push(const T*, node** top); bool pop(T*, node** top); を提供します。*1 このスタックはbottomへと繋がる線形リストをベースとして動作するため、配列ベースのスタックにパフォーマンスで劣ることもあります。*2 その線形リストを構成するノードのデータ構造から見てみましょう。 struct node{ T data; node* next; }; ごく典型的な線形リストのノードと同じです。 道具の紹介 lock-freeデータ構造を構成する場合に頻出のCompare And Swap。 C言語の擬似コードで書くと以下のような

    Lock-free Stack - くまメモ
  • non-blockingの意味するところ - くまメモ

    海外の文献を読み漁っていると気づくのですが 2003年を境にこの文脈で使われる言葉の定義が変わります。 ↑2003年ごろまでの構図 ↑現在の構図。*1 non-blocking = obstruction-free という理解でもおおよそ間違いではないとは思いますが 論文を読むに当たって non-blocking = ロックを使わないアルゴリズム全般 obstruction-free = 非lock-freeだけどロックだけはしない というニュアンスの違いを感じます。 以後、現在の構図の方を前提に話します。ご注意ください。 まずは3つの分類の違いから wait-free 操作が「他のスレッドの動向に関わらず有限ステップで完了できる」場合、そのアルゴリズムはwait-freeと呼ばれます。starvation-freeと呼んだりもします。 実際には初めからここに分類されるアルゴリズムは多くあ

    non-blockingの意味するところ - くまメモ
  • ABA問題 - Wikipedia

    この記事には参考文献や外部リンクの一覧が含まれていますが、脚注による参照が不十分であるため、情報源が依然不明確です。 適切な位置に脚注を追加して、記事の信頼性向上にご協力ください。(2023年1月) ABA問題(英: ABA problem)とは、マルチスレッドプログラミングにおいて同期化の過程で発生する問題であり、ある記憶域を二回読み出し、二回の読み出しが同じ値であることを「変更がない」とみなすことにしたとき、二回の読み出しの間に別のスレッドが値を変更し、他の作業を行った後また元の値に戻すと、最初のスレッドが誤って「変更がなかった」とみなしてしまうというものである。 ABA 問題は、複数のスレッドや(or プロセス)が共有されたメモリにアクセスする場合に生じる。下記のイベントの流れは、ABA 問題を発生させる。 プロセス が共有メモリから値 A を読み出す はプリエンプトされ、プロセス

  • CAS based Lock-Free Queue - マルチコア時代の"データ構造とアルゴリズム"再入門

    データ構造とアルゴリズム再入門 はじめに ・並{行|列} & {Lock|Wait}Free ・ABA & ABA' ・volatile & メモリバリア ・プリミティブ ・CAS ・MCAS ・STM ・メモリ管理:free & GC ・Toots List & Skiplist [単方向List] ・リスト ・細粒度リスト ・Lazyリスト ・Lock-Freeリスト ・Lock-Freeリスト2 [SkipList] ・スキップリスト ・Lazyスキップリスト ・Lock-freeスキップリスト [双方向List] Queue & PriorityQueue [UnBounded Queue] ・Queue ・CAS based Lock-Free Queue ・LL/SC based Lock-Free Queue [Unbounded Priority Queue] ・Heap

  • LL/SC based Lock-Free Queue - マルチコア時代の"データ構造とアルゴリズム"再入門

    データ構造とアルゴリズム再入門 はじめに ・並{行|列} & {Lock|Wait}Free ・ABA & ABA' ・volatile & メモリバリア ・プリミティブ ・CAS ・MCAS ・STM ・メモリ管理:free & GC ・Toots List & Skiplist [単方向List] ・リスト ・細粒度リスト ・Lazyリスト ・Lock-Freeリスト ・Lock-Freeリスト2 [SkipList] ・スキップリスト ・Lazyスキップリスト ・Lock-freeスキップリスト [双方向List] Queue & PriorityQueue [UnBounded Queue] ・Queue ・CAS based Lock-Free Queue ・LL/SC based Lock-Free Queue [Unbounded Priority Queue] ・Heap

  • 並列プログラミング(その2) : DSAS開発者の部屋

    3.Memory Ordering シングルプロセッサのマルチスレッドでは、volatile変数をフラグにして簡単な同期を書くことができました。 例えば、次のような感じです。(コンパイラはvolatile変数へのアクセスの順序を入れ替えないものとします) volatile int done = 0; volatile struct { int foo; int bar; } foobar; void writer(void) { foobar.foo = fizz(); foobar.bar = bazz(); done = 1; } void reader(void) { int foo, bar; while (!done) sleep(1); foo = foobar.foo; bar = foobar.bar; } これは、マルチプロセッサ環境では上手くいかないことがあります。今時

    並列プログラミング(その2) : DSAS開発者の部屋
  • 並列プログラミング(その3) : DSAS開発者の部屋

    4.Atomicなメモリ書き換え その1で、単純なLoad/StoreについてのAtomicについて説明しました。 こんどは、Read-Modify-Writeについてについて考えます。 Read-Modify-Writeを複数のスレッドが実行する際、マルチプロセッサ環境で 同期を取るには、そのプロセッサのメモリモデルに沿った同期機構が必要です。 そのため、大抵のCPUには、AtomicなLoad&Store命令を持っています。LoadとStoreが Atomicであるということは、LoadしてからStoreするまでの間に他のプロセッサが LoadもStoreもできない(=バスロックしている)ということです。 例えば、ロック変数を一つ用意して、それが0だったらだれもロックしていないので 1に書き換えてロック可能、1だったら誰かがロックしているので0になるのを待つ、 ということにします。XC

    並列プログラミング(その3) : DSAS開発者の部屋
  • 『マルチスレッドプログラム(その5くらい?)』

    もう、マルチスレッド飽きてきた・・・・ 気を取り直して、前回お話したLOCK FREEの概念を使って スタックを作り直してみましょう。 基的な内容は変わりません。 構造体もまるっきし同じです。 template <class T> class lock_free_stack : protected boost::noncopyable { protected: struct snode_type{ T* value; snode_type* next; snode_type(T* nin_value,snode_type* nin_next) : value( nin_value ) , next( nin_next ) {} }; snode_type* tail; snode_type* dummy; unsigned int counter; public: //constract

    『マルチスレッドプログラム(その5くらい?)』
  • 無視できないフラグメンテーション問題への解答は?(2/2) - @IT

    1月版 無視できないフラグメンテーション問題への解答は? 小崎資広 2010/2/10 ユーザー空間でRCU? membarrier()システムコールとは Mathieu Desnoyersによって、「introduce sys_membarrier(): process-wide memory barrier」と題されたパッチが投稿されました。 sys_membarrier()は、その名のとおり、メモリバリア(注3)を発行するシステムコールです。「メモリバリアぐらいユーザー空間から勝手に発行すればいいじゃないか。システムコールにする必要性がまったくないよ」と思うかもしれませんが、これにはちゃんと理由があります。 ちょっと長くなりますが、まずは背景をば。 MathieuはLTTngの作者として有名で、最近は、LTTng(関連記事)への高速なユーザー空間トレーシング機能の追加に力を入れていま

  • マルチコア時代のLock-free入門 - yamasaのネタ帳

    日、並カンにてLock-freeアルゴリズムについて発表しました。発表資料は以下になります。 なお、今回の発表で割愛したメモリバリアの詳細については、以下の発表資料を参照ください。 そろそろvolatileについて一言いっておくか また、Hazard pointerやタグ付きポインタを使用したサンプルコードを以下に置いています。こちらも参考にどうぞ。 yamasa/lockfree - GitHub マルチコア時代のLock-free入門View more presentations or Upload your own.

    マルチコア時代のLock-free入門 - yamasaのネタ帳
  • Load-Link/Store-Conditional - Wikipedia

    load-link(ロード・リンク、(LL、他に load-linked(ロードリンクト)または load and reserve(ロード・アンド・リザーヴ))と store-conditional(ストア・コンディショナル、(SC)は組み合わせて使用されるコンピュータの命令。これによりロックなしのアトミックなリード・モディファイ・ライト操作[1]が可能となる。 load-link 命令は指定されたメモリ位置の現在の内容を返す。その後の store-conditional 命令は同じメモリ位置へ新たな値を書き込むが、前回の load-link 命令以降にそのメモリ位置の内容が書き換えられていないときだけ書き込みが行われる。何らかの更新がなされていたら、たとえ load-link 命令で読み取った値と同じ内容が書かれていたとしても store-conditional 命令は失敗する。従って、

  • Lock-freeとWait-freeアルゴリズム - Wikipedia

    Lock-freeとWait-freeアルゴリズムとは、共有データにロックをかけてアクセスを防ぐアルゴリズムとは違い、複数のスレッドが同時並行的に、ある対象データを壊すことなしに読み書きすることを可能にするアルゴリズムである。Lock-free とはスレッドがロックしないことを意味しており、全てのステップにおいてシステムが必ず進行する。これはLock-free ではミューテックスやセマフォといった、排他制御のためのプリミティブを使ってはならないことを意味する。なぜならロックを持っているスレッドの実行が中断した場合、全体の進行を阻止しうるからである。Wait-free とは、他のスレッドの動作に関係なく、スレッドがいかなる操作も有限のステップで操作を完了させられることを指す。あるアルゴリズムがLock-freeであるがWait-freeでないことはありうる。Wait-free なアルゴリズム

  • Lock-Free Algorithm, CriticalSection, IHostCrst - NyaRuRuが地球にいたころ

    スレッド化で「普通は」気をつけるべきこと 「高木浩光@自宅の日記」より. ギャー、ここも杜撰だった。(モニタリング用のコードとはいえ。) int connectionTriedCount = 0; int handshakeSucceededCount = 0; int extractionSucceededCount = 0; connectionTriedCount++; handshakeSucceededCount++; extractionSucceededCount++; java.util.concurrent.atomic.AtomicInteger を使ってみよう。 import java.util.concurrent.atomic.AtomicInteger; ... AtomicInteger connectionTriedCount = new AtomicInt

    Lock-Free Algorithm, CriticalSection, IHostCrst - NyaRuRuが地球にいたころ
  • lucille development blog » Blog Archive » 64-bit Lock-free queue implementation

    http://lucille.atso-net.jp/svn/angelina/algo/lock-free/ [EN] Here’s my implementation of Simon Doherty, Maurice Herlihy, Victor Luchangco and Mark Moir, Bringing practical lock-free synchronization to 64-bit applications. PODC 2004. pp. 31–39. http://www.cs.brown.edu/research/projects/transactional_memory.html – [JP] 64-bit 対応な lock-free queue を実装してみました。 この論文の特徴は、 o 64-bit 対応 o スレッド数をあらかじめ知ら

  • コンペア・アンド・スワップ - Wikipedia

    コンペア・アンド・スワップ(Compare-and-Swap、CAS)は、CPUの特別な命令の一種。不可分操作として、あるメモリ位置の内容と指定された値を比較し、等しければそのメモリ位置に別の指定された値を格納する。この操作の結果、置換が行われたかどうかを示す必要があり、単純な真理値を返すか、そのメモリ位置から読み込んだ内容(書き込んだ内容ではない)を返す。 CAS命令は、マルチプロセッサシステムでセマフォなどを実装するのに使われる。マルチプロセッサシステムでLock-freeとWait-freeアルゴリズムを実装するのにも使われる。 Maurice Herlihy (1993年) は、CAS命令が単なるリード、ライトやテスト・アンド・セットでは実装できないことを示した[1]。 CAS命令を利用したアルゴリズムは、一般にあるキーとなるメモリ位置を読み取り、その古い値を記憶しておく。その古い

  • 1
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy