タグ

forkに関するgfxのブックマーク (17)

  • Rubyでforkを利用したマルチプロセスでコアを使い切りたい気持ち - Qiita

    Rubyで書かれたちょっと重たいバッチ処理があって速くする必要があったので、fork(2)とpipe(2)を使ったマルチプロセス化でコアを活かした並列処理に書き直した話します。 以下の記事に詳しく書いてあるので、TL;DRはそちらを見てな? Forking and IPC in Ruby, Part I Forking and IPC in Ruby, Part II なるほどUnixプロセス ― Rubyで学ぶUnixの基礎 - 達人出版会 Threadじゃいかんの? — GILについて 並行プログラミングとしてまず最初に思いつくのはマルチスレッド化ですが、RubyにおいてはGVL(Giant VM lock)があるためマルチコアを活かすことは難しいのです。 ネイティブスレッドを用いて実装されていますが、 現在の実装では Ruby VM は Giant VM lock (GVL) を有し

    Rubyでforkを利用したマルチプロセスでコアを使い切りたい気持ち - Qiita
  • UNIX上でのC++ソフトウェア設計の定石 (3) - memologue

    鉄則3: マルチスレッドのプログラムでのforkはやめよう マルチスレッドのプログラムで、「自スレッド以外のスレッドが存在している状態」でfork*1を行うと、さまざまな問題を引き起こす可能性があります。「問題」の典型例としては、子プロセスのデッドロックが挙げられます。問題の詳細を把握しないまま、マルチスレッドのプログラムで不用意にforkするのはやめましょう! 何が起きるか 実例から見てみましょう。次のコードを実行すると、子プロセスは実行開始直後のdoit() 呼び出し時、高い確率でデッドロックします。 void* doit(void*) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); struct timespec ts = {10, 0}; nanoslee

    UNIX上でのC++ソフトウェア設計の定石 (3) - memologue
    gfx
    gfx 2014/08/07
  • Perlの変数はCoWで共有されてもいずれCopyされるという話 - heboi blog

    https://gist.github.com/nihen/7085103 http://www.perlmonks.org/?node_id=905667 https://rt.perl.org/rt3//Public/Bug/Display.html?id=119937 http://d.hatena.ne.jp/kazuhooku/20100909/1284005880 大きいマスターデータなどを親プロセスで読み込んでおいて、その後forkし、子プロセスでCoWで共有する、そんな幻想を抱いていた時期が僕にもありました。 PerlのGCのための参照カウンタは、変数の内部にカウンターをもっているため、そのカウンターに増減があるとCoWで共有されていたメモリのうちカウンターと同一のページ内のメモリは文字通りCopyされる。 通常のコード内でそのことに気をつけたとしても、子プロセスが死ぬとき

    Perlの変数はCoWで共有されてもいずれCopyされるという話 - heboi blog
    gfx
    gfx 2013/10/22
  • Python の subprocess の preexec_fn の実装と fork のスレッドセーフティー問題

    methane @methane @riywo fork してから exec する前に実行して欲しい関数を指定します。具体的には os.setsid とか指定します。(最近の Python だと start_new_session キーワード引数指定できますが) 2013-03-24 02:11:06

    Python の subprocess の preexec_fn の実装と fork のスレッドセーフティー問題
  • GNU/Linuxにおけるプロセス

    GNU/Linuxでは、スケジュールの単位はプロセスである。スレッドというのは、ちょっと特殊なプロセスにすぎない。 Windowsでは、スケジュールの単位はスレッドである。プロセスというのは、スレッドを束ねる要素でしかない。たしかに、プロセスには優先度を設定できる。ただしこれは、スレッドの優先度が、スレッドに設定されている優先度とスレッドが属するプロセスに設定されている優先度から計算されるだけである。プロセスは実行の単位ではない。 プロセスを作るためのLinux Kernel APIとして、fork(), clone(), vfork()がある。Linux kernelでは、それぞれsys_fork(), sys_clone(), sys_vfork()として提供されている。また、その下にdo_fork()があって、実際の処理はこの関数がやっていたりする。ただし直接使うことはない。というの

  • ffmpegとlibavの背景事情

    ffmpegをインストールしようとしたら、なにやらちょうど一年前あたり、大規模なforkが起こったらしい。いまや、ffmpegとlibavに分裂している。forkは自由なソフトウェアではいたって普通の出来事だ。大抵の場合、開発者の間での意見の不一致により起こる自然な現象だ。自由なソフトウェアであれば、fork自体はそれほど悪いことではない。どちらも自由であるので、双方の開発者がIRCやMLで広角泡を飛ばしながら喧嘩しつつ、何事もなかったかのように相手のコードをこちらのコードベースにマージできる。なぜならば、どちらも自由なソフトウェアという共通点を持っているからだ。 しかし、ffmpegは、だいぶ巨大なソフトウェアだ。おそらく、現時点でこれ以上にでかい動画と音声のソフトウェアは、mplayerしかあるまい。mplayerはffmpegを包括しつつ、さらに変態的なことをしている。これについては

    gfx
    gfx 2012/03/27
  • forkを攻略しよう 〜第1回〜 - Mandy Code

    なんか先週結構Parallel::ForkManagerやらParallel::Preforkやらについてすごく議論というか話をしたので、自分もあまり得意ではないんですがforkについての僕の考え方をまとめておこうと思います。 forkってなんぞ。 Does a fork(2) system call to create a new process running the same program at the same point. It returns the child pid to the parent process, 0 to the child process, or undef if the fork is unsuccessful. File descriptors (and sometimes locks on those descriptors) are shared

    forkを攻略しよう 〜第1回〜 - Mandy Code
    gfx
    gfx 2012/03/06
  • GitHub - karupanerura/p5-AnyEvent-ForkManager: A simple parallel processing fork manager with AnyEvent

  • Parallel::Preforkのサンプルコードを読み解く - Mandy Code

    どうも、ひたすらに更新が遅くてすいませんすいません。 最近ものすごく勉強になることが多いんですがなかなかひとまとまりの文章にすることが難しいです。 でもどっかに書いてあるだろ、と思ってしまうのはよくないのでTips的にこまめに書けたらいいですね。 さて、題ですが、先日大量のサーバーにsshしてデータを取ってきて一覧表示するようなのを書いてた時、ものすごい時間かかったので並列処理をしようと思っていろいろ教えてもらったり調べてもらったりしました。 その中でzigorouさんにわざわざParallel::Preforkを使ったサンプルコードを書いて頂いたので、じっくり読んだら細かいところに気が遣ってあるなぁというコードだと思ったので、細かく読みといてみたいと思います。 全文はこちら。 まず冒頭部分、 my $pp = Parallel::Prefork->new(+{ max_workers

    Parallel::Preforkのサンプルコードを読み解く - Mandy Code
    gfx
    gfx 2011/12/22
  • DBIとforkの関係 - heboi blog

    実際ググれば正解はいっぱい出てくるしここに自分もコメントで書いてたりしていまさら書く必要もないかなと思ってたけど一応自分のブログでもまとめておくということで。 一般的な解 DBIx::ConnectorとかDBIx::Handler経由でかならず$dbhを取得してからDBIを使う。 もしくはfork-safeなORM(DBIx::Class, DBIx::Skinny, Teng)を使う。 DBIを直接使っている場合 一般的なコネクションを保持するクライアントと同様にDBIもforkした子供が親のコネクションをそのまま使うことはバグの原因になります。特にトランザクションの処理等で重大な問題が起こる可能性がある。 解決策は、 DBIのコネクションを親で作らないで、子供で独自に作る 親で作ってしまったコネクションを子供が安全にDESTROYし、再接続する のどちらかになります。ここで問題は2で

    DBIとforkの関係 - heboi blog
    gfx
    gfx 2011/11/17
  • 革命の日々! systemの挙動について

    ちょっとakrさんと議論する機会があったのでメモ 現状のRubyだと子プロセス実行中に Ctrl-Cが効かないという問題がある http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/31007 実際に、困っているひともいて。Rubyのtarに含まれているmake testが子プロセスをつくって子供がテストして結果をかえすというスタイルなので、Ctrl-Cで中断できなくて開発者は日々イライラしている。 で、このスレッドで、そうなっている理由が明らかに。 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/31117 ところで、別件であるがperl の真似をしたといいつつ、perlはSIGHUPをマスクしてはいない。 ちょっと気になったので実装をいくつか調べてみた。

    gfx
    gfx 2011/11/12
    "(perlは)forkしたあとでSIG_IGNしてるからレースがある"
  • Perlゼミ(サンプルコードPerl入門)

    Perl入学式 全6回のPerl入門講座。東京、大阪、沖縄、札幌で開催。(東京は4月と10月スタート、それ以外は5月スタート) YAPC::Japan Perlを軸としたITに関わる全ての人のためのカンファレンス。 東京 吉祥寺.pm 五反田.pm 大阪 なにわPerl 沖縄 沖縄.pm

  • Fork::setTimeout - Kentaro Kuribayashi's blog

    g:subtech:id:cho45:detailさんが、AnyEventでJavaScriptのsetTimeout()的なものを書いていたので(AnyEvent::setTimeout - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。 - subtech)、forkで同じようなことをしてみました。 https://github.com/kentaro/Fork-setTimeout/blob/master/t/01_settimeout.t use Fork::setTimeout; my $timer = setTimeout(sub { warn "1sec!"; }, 1000); とか書けます。setTimeout()にわたしたcoderefをforkした子プロセスで実行しつつタイマーオブジェクトを返して、そいつがスコープを抜けるタイミングで適当にwaitpidした

  • Node v0.5.0ででたforkを試してみる - PolyPeaceLight

    require('child_process').forkはWorkerと同じAPIを使っているぽいです。 fork APIの定義 var worker = require('child_process').fork(modulePath, arguments, options); argumentsh: 配列で、生成された子プロセス側ではprocess.argvで受け取ることができます。 options: documentではcustomFdsの上書きに使うとあります。 こんな感じで使います main.js var cp = require('child_process') , cnum = 10 , workers = [] // メッセージ転送関数 , postOffice = function(m){ console.log('id ('+m.from+') says ['+m.b

    Node v0.5.0ででたforkを試してみる - PolyPeaceLight
  • Re 常識を覆すソートアルゴリズム!その名も"sleep sort"! - kazuhoのメモ置き場

    常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte streamを読んで、自分が書くとしたらこんな感じかなーと思った。多重化して select 使う必要ないよねということで。 use Time::HiRes qw(sleep); sub sleep_sort { # create pipe pipe(my $rfh, my $wfh) or die "pipe failed: $!"; # spawn the processes my @pids; while (@_) { my $value = shift; my $pid = fork; die "fork failed: $!" unless defined $pid; if ($pid == 0) { # child process $| = 1; sleep $value

    Re 常識を覆すソートアルゴリズム!その名も"sleep sort"! - kazuhoのメモ置き場
    gfx
    gfx 2011/05/20
    2番目のがトリッキーすぎてなにやってるのか一瞬わからなかったw
  • InactiveDestroyのアホな使い方 - D-6 [相変わらず根無し]

    InactiveDestroyのアホな使い方 2011年4月22日 18:32 D | ブログ記事のURL | コメント(0) | トラックバック(0) WebAppで DBIをなんらかの方法でDBに接続して、で、リクエストが終わったら接続を解除して・・・とかしたいとするじゃないですか。具体的な実装はScope::Containerでもなんでもいいんですけど。 それでなんかしらんけど、アクセスするたびに三つずつDB接続が残る、という現象に遭遇したわけですよ。最初は普通に「あれ、Scope::Containerの使い方間違ってたか」とか思ってたんですが、何をしてもダメだし、Scope::Containerに手を加えて現在の保持してる変数を抜き出しても何もない。DBI::db へのリファレンスがないのに接続が切れないなんて・・・と途方に暮れることと数時間。 ・・・やっちまったよ。ワーカーも同じ

  • Writing a prefork server / daemon using Parallel::Prefork - Articles Advent Calendar 2010 English

    Parallel::Prefork is a module I wrote back in the year 2008, which is basically an imitation of the excellent Parallel::ForkManager but with support for signal handling, an indispensable feature if you want to write a network server or a daemon program with features like graceful shutdown or runtime reconfiguration. The code below illustrates the basic usage of Parallel::Prefork. Upon the intantia

  • 1