タグ

ブックマーク / kumagi.hatenadiary.org (9)

  • ロックフリー性の証明について - くまメモ

    http://www.slideshare.net/kumagi/lock-free-safe?next_slideshow=1 とか過去に自分で書いておきながら、その当時の自分の認識が甘かった事もあるのでここに一度書き出しておく。 Lock-Freeは「ロックを使わない事」ではない STMの事をもってしてLock-Freeと呼んでる文脈はいっぱいあるけれど、STMの実装にロックを使う事は一般的だし、それは正しい専門用語で言う所のLock-Freeとは呼ばない。 Lock-Freeとは「どんなスケジューリングが為されようともどれかの操作が進行する」という進行保証(Progress Guarantee)を表している。 スケジューリング? マルチコアCPUでもシングルコアCPUでも、OSは実行中のプログラムを任意のタイミングで強制的に一時停止させて他のプログラムにCPUリソースを割り当てる事が

    ロックフリー性の証明について - くまメモ
    hiroyukim
    hiroyukim 2019/06/14
  • non-blockingの意味するところ - くまメモ

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

    non-blockingの意味するところ - くまメモ
    hiroyukim
    hiroyukim 2019/06/14
  • Stackを使ってQueueを作る - くまメモ

    有名な話かと思ったら意外と知られていなかったのでメモ。 FILOを使ってFIFOを作るとも言います。StackでQueue作れてもQueueでStackを作る方法が思いつかないので誰か教えて下さい。もしくはこういう学問があったら紹介して頂けると嬉しいです。 簡単な説明としては、2つのStackを用意して、enqueueするときには1つ目にpush()し、dequeueするときには2つ目からpop()するだけ。 ただし2つ目のStackが空の場合は1つ目のスタックが空になるまで2つ目のスタックに移し替える。 template<typename T> class MyQueue { std::stack<T> in, out; MyQueue(){} void enqueue(const T& v) { in.push(v); } T dequeue() { if (out.empty())

    Stackを使ってQueueを作る - くまメモ
    hiroyukim
    hiroyukim 2013/02/03
  • DSIRNLP勉強会で発表しました - くまメモ

    @overlastさんのお誘いにより招待講演という形でDSIRNLP勉強会で発表をしました。 IRともNLPとも関係のない話ですが、冬のLock-free祭りという題目でお腹いっぱい話せました。 発表資料はこちら 冬のLock free祭り safe View more presentations from Kumazaki Hiroki ↑だとアニメーションが死んでてイミフになってるので↓がおすすめです。一番良いのはPowerPoint2007以降で再生することですが。 http://www.slideboom.com/presentations/460931/%E5%86%AC%E3%81%AELock-Free%E7%A5%AD%E3%82%8A_safe アニメーション有りなら深く考えずめくっていくだけでおおよその雰囲気は掴めるんじゃないかと思います。 総ページ数190枚の大作です

    DSIRNLP勉強会で発表しました - くまメモ
    hiroyukim
    hiroyukim 2012/10/09
  • max_queue 最大値をいち早く返すデータ構造 - くまメモ

    ちょっとマニアックなデータ構造を紹介 その名もmax queue、使い勝手はほとんどFIFOなqueueと一緒で、enqueue()もdequeue()もO(1)だけどそれに加えて「入ってるデータのうち最大の値」もO(1)の計算量で算出するという代物。 兄弟分で最小の物を返すmin queueや、両方の機能を備えたmin-max queueもあるけどmax queueが判れば自明なので割愛。 最大の値を覚えておけば良いだけに思えるけど、最大の値がdequeueされてしまった場合にO(n)の時間を掛けて再び探索してたら条件を満たせない。 max-queueでは最大の値を覚えておくため専用のqueue(以後最大値queueと呼ぶ)を内部でもう一持つ。 この青い線がqueueに入ってるデータ列で高さがデータの大きさを表す、下に書かれている薄い線の入ったデータ列が最大値queue。 こちらの最大

    max_queue 最大値をいち早く返すデータ構造 - くまメモ
    hiroyukim
    hiroyukim 2012/10/08
    あとでしっかり読もう
  • Lock-free スナップショットの撮り方を説明してみる - くまメモ

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

    hiroyukim
    hiroyukim 2012/08/31
  • LevelDB雑感 - くまメモ

    LevelDBが公開されて少し経ちました。 全体ではLog Structured Merge Treeという物を実装しているようですが詳しいところは知りません。 実装を少し読んだのですが内部で使われているSkipListにいくつも思い切った設計がありました。 (参考)togetter「LevelDBを読む人たち」 http://togetter.com/li/136983 SkipListそのものはMulti Reader / Single Writerな実装なのですが おもしろい事にReaderとWriterが同時に走っても大丈夫なように作られています。 Reader-Reader : 共存可能 Reader-Writer : 共存可能 Writer-Writer : 共存不可 Readerが常に走り続けている状況を想定した上で、Writerの足を止めたくないんでしょうね。 為される事の

    LevelDB雑感 - くまメモ
    hiroyukim
    hiroyukim 2011/12/02
  • Non-blocking STMについて頑張って説明してみる - くまメモ

    STMはソフトウェアトランザクショナルメモリの略です。 ↓とりあえずwikipedia http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%A1%E3%83%A2%E3%83%AA 日でSTMの話題を検索すると「楽観的ロックでしょ?」といった発言を見かける事が多く、確かに実用的な手法の多くはロックベースだったりしていますが、正直なところロックベースな手法のSTMはデータベースでのトランザクションと似ているフシがあったりしてデータベースに詳しい人からするとそれほど驚くような手法ではない事が多いのです。その

    Non-blocking STMについて頑張って説明してみる - くまメモ
    hiroyukim
    hiroyukim 2011/12/02
  • perfでぺろぺろしていたら詰まった - くまメモ

    perfという大変優秀なプロファイラがあります。どう優秀かというと ・gprofと違い、-pgなど付けなくとも既存のバイナリに対して実行できます ・バイナリに対して実行できるという事はあらゆる言語の実行を観察できます sudo apt-get install linux-tools まずこれで必要なツールは入ります。 試しに何かのパフォーマンスを見てみましょう $ perf stat ruby -e'100000.times{|n|p n}' 実行にかかったCPUサイクル数、分岐の数、分岐予測ミス数、キャッシュ参照数、キャッシュミス数などがズラズラ出ます。IPCなども計算されてプログラムの性質がわかります。 これでは物足りない人は、自分の好みの通りにセッティングを変えることもできます。 $ perf list で観測可能なモノのリストが表示されるので、その中から好きなものをコンマで繋いで例

    perfでぺろぺろしていたら詰まった - くまメモ
  • 1