タグ

forkに関するhiroyukimのブックマーク (20)

  • /dev/urandom を fork して読み込んでもいいんかって話 - tokuhirom's blog

    tokuhirom /dev/urandom って開いたまま fork して読み込んだらまずいんですっけ? 親 process で /dev/urandom 開いたまま、fork してそれぞれの子プロセスで読んだら同じの取れる? kazuho 同じの取れないですね 一般論なファイルについてもそう つまり、open file descriptionは同一なので、readしたらその中にあるfile offsetは進むので (edited)

  • CRubyのGVLとビジーループ - kyabの日記

    mrubyのVMのマルチスレッド対応がgithubにて議論されています。 multi-thread support on the RiteVM #1657 自分もthread-safeなVMが欲しいなぁと思っています。STM32F4DiscoveryにFreeRTOS載せて使ってみたい。 並行・並列処理の戦国時代? さて、マルチコアが普通になったし、WebアプリのC10K問題があるので並行・並列処理は昨今のトピックです(多分)。 ただマルチスレッドプログラミングは難しすぎ!というは昔から言われていたことです。 で、もうちょい並行・並列処理を書きやすく出来ないのかよ?ということでErlang,go,Scala(Actor),EventMachine,Thread pool ,node.js,deferred,future,java.util.concurrent色々出てきました (言語とライ

    CRubyのGVLとビジーループ - kyabの日記
  • システムコールを経由する生のLinuxスレッド | POSTD

    Linuxのスレッドは、洗練された美しい設計です。スレッドは仮想アドレス空間とファイルディスクリプタテーブルを共有するプロセスに過ぎません。プロセスによって生成されたスレッドは、メイン”スレッドの”親プロセスに追加された子プロセスです。これらは同じプロセス管理のシステムコールを通して処理されるので、スレッドに関するシステムコールのセットを分ける必要性を取り除きます。これはファイルディスクリプタと同様に洗練された方法です。 一般的に、UNIX系のシステムではfork()を使ってプロセスを生成します。新しいプロセスは、オリジナルのコピーとして独自のアドレス空間とファイルディスクリプタテーブルを取得します。(Linuxではコピーオンライトを使用して、この部分を効率的に処理します。)しかし、これは非常に高度なスレッドの生成方法なので、Linuxでは別の clone() システムコールを使用します。

    システムコールを経由する生のLinuxスレッド | POSTD
  • 並行処理導入 MVar(Parallel and Concurrent Programming in Haskell Chapter 7) - MEMOcho-

    英語の原文はこちらのページで読める http://chimera.labs.oreilly.com/books/1230000000929/ch07.html この章以降は並行処理について 第7章はMVarを使った並行処理の方法について 別スレッドで処理を開始するにはforkIOを使う forkIO :: IO () -> IO ThreadId型からわかるようにforkIOは実行結果を返さない よって別スレッドで行った処理の結果を取得するには データを橋渡しするものが必要であり、それがMVar ここではforkIOを使った簡単な例として A,Bを出力するというのが挙げられている main = do hSetBuffering stdout NoBuffering forkIO (replicateM_ 1000 (putChar 'A')) replicateM_ 1000 (putCh

    並行処理導入 MVar(Parallel and Concurrent Programming in Haskell Chapter 7) - MEMOcho-
  • libtrusterdのldd機能の負荷テストが失敗したことで子プロセスの扱いが少し理解が進んだ件: misc

    おはようございます。先週の実家生活は、初日から次男がロタにかかるなど、どうなることかと心配されましたが、無事乗り切る事が出来、自宅に帰って4月からの新しいクラスで息子たちは保育園生活を始めました。kjunichiです。 背景 libtrusterdでldd機能の負荷テストをしたらNG。 単発だと問題ない。だからこそ、このldd機能をマージしたのだったものの、h2loadで負荷テストを行うと、途中から動かなくなる。 手元のOSXではh2loadで、リクエストを増やしていったところ、260リクエスト前後でNGとなった。 何度か、リクエスト数を調整している際にpsコマンドで、 (bash) が大量に表示され、手がかりをつかむことが出来た 分かった事 黙ってForkすると forkすると、親に子プロセスの終了時にシグナルが通知される。waitpidで、子プロセスのプロセスIDを指定すると、この通知

    libtrusterdのldd機能の負荷テストが失敗したことで子プロセスの扱いが少し理解が進んだ件: misc
  • forkとゾンビプロセス

    とあるアプリから外部コマンドを実行する機能を実装していたんだけど、ふと気がついたらゾンビプロセスが大量にできていて焦った。 とあるアプリはデーモンプロセスでずっと生きている 外部コマンドは終了を待たなくていいし出力も取らなくていい ゾンビができちゃうダメな実装 とにかく実行すればいいってことで単純に次のようなコードを書いていた。 forkしてexecするだけという至って単純な実装(実際にはSTDOUTを/dev/nullに向けるとか色々あるけど)。 # 外部コマンドを実行する # コマンドの出力とか終了には興味がない def run_command(command) fork do puts "child: pid=#{Process.pid}, ppid=#{Process.ppid}" exec(command) end end puts "app: pid=#{Process.pid

  • サービス終了のお知らせ

    サービス終了のお知らせ いつもYahoo! JAPANのサービスをご利用いただき誠にありがとうございます。 お客様がアクセスされたサービスは日までにサービスを終了いたしました。 今後ともYahoo! JAPANのサービスをご愛顧くださいますよう、よろしくお願いいたします。

  • コンピューター:C言語講座:マルチスレッドについて

    コンピューター:C言語講座:マルチスレッドについて マルチスレッドの特徴 一般的なサーバプログラムでは、多数のクライアントからの処理をできるだけリアルタイムに処理するために、何らかの形で並列処理を行うことが多いものです。たとえば、データベースサーバで、ある検索処理に時間がかかっている間ほかのクライアントが接続すらできない、という状態ではサーバとして失格でしょう。 並列処理を実現する方法としては、 ・プログラム自体を並列処理可能に記述する ・プロセスをもともと多数起動しておく ・fork()を使って子プロセスを起動するマルチプロセス処理 ・マルチスレッドを使用する などが考えられます。プログラム自体をリアルタイム性を考慮しながら記述するのはなかなか大変で、しかもソースが複雑になりメンテナンス性も問題が多くなりがちです。プロセスをもともと多数起動するのは簡単ですが、クライアントがどのプロセスに

  • Typolevel Scala Compiler - ( ꒪⌓꒪) ゆるよろ日記

    最近Scala Complierをforkするのが流行っているようですね。 paulp/policy · GitHub typelevel.scala | Typelevel Scala and the future of the Scala ecosystem 「俺のコンパイラか?欲しけりゃくれてやる、探せ!この世の全てをそこにおいてきた!」 男達はscalacをforkし、夢を追い続ける。世は正に大コンパイラ時代! 乗るしかないこのビッグウェーブに!! 俺もScalaをforkしてTypolevel Scala Compilerを作ったぜ!! コンパイラ王に、俺はなるッ!!! yuroyoro/typolevel · GitHub 久しぶりのScalaネタがこれとか救いようの無い老害だなテメーは

    Typolevel Scala Compiler - ( ꒪⌓꒪) ゆるよろ日記
  • Java の理論と実践: フォークを活用する、第 2 回 Java 7のParallelArrayクラスを使ってソートと検索の速度を上げる

    IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.

    Java の理論と実践: フォークを活用する、第 2 回 Java 7のParallelArrayクラスを使ってソートと検索の速度を上げる
  • Java の理論と実践: Java 7で登場するフォーク/ジョインのフレームワークを使って細粒度並列処理の活用方法を学ぶ

    IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.

    Java の理論と実践: Java 7で登場するフォーク/ジョインのフレームワークを使って細粒度並列処理の活用方法を学ぶ
  • Rubyの並列処理とグローバルインタプリタロックの関係 | SONICMOOV LAB

    hottyです。 ソニックムーブ Advent Calendar 2013 12/11(水)の記事になります。 今回はRubyの並列処理について書こうと思います。 この記事には過ちがあると指摘されました(さぁどこでしょうか)。詳しくは追記を! Rubyの処理系は1.8まではユーザレベルで行うグリーンスレッドでしたが、 1.9からはMRIにYARVという処理系が組み込まれ、 カーネルがスレッドの管理を行うネイティブスレッドになりました。 では、早速ですがThreadクラスで複数のスレッドを作って並列処理を行ってみましょう。 [sourcecode lang="ruby"] list = ["A", "B", "C", "D"] io = File.open("result.log", &quo

    Rubyの並列処理とグローバルインタプリタロックの関係 | SONICMOOV LAB
  • Fork/Join で並列和 - 倭マン's BLOG

    前回 Java 7 を使う環境設定を行ったので、ついでにちょっと Java 7 をいじってみます*1。 今回見ていくのは java.util.concurrent パッケージに追加された Fork/Join フレームワークです。 Fork/Join は大量の計算を小さい部分に分けてマルチスレッドで計算する手法です。 で、この記事では整数のリスト (List<Integer>) を受け取ってその要素全ての和を計算するコードを見ていきます。 参考 URL Java チュートリアル 「Fork/JoinJavadoc ForkJoinPool ForkJoinTask RecursiveTask GPars Reference Documentation 「3.6. Fork-Joinjava.util.concurrent パッケージ : Java 7 Java 7 で Fork/Jo

    Fork/Join で並列和 - 倭マン's BLOG
  • Java7 の Frok/Join Framework を使って、しりとりをしてみました。 - 地平線に行く

    この前、「最も長く続くしりとり何か」という問題は再帰で解けることに気づきました。 そして、再帰なら Java7 の Fork/Join Framework です! というわけで、書いてみました! しりとりのアルゴリズム 「最も長いしりとりは何か」という問題は、再帰を使って解けます。 例えば、「しりとり、りんご、ごりら、ごーる…」という単語の集合=A を使ってできる最も長いしりとりは… 「しりとり」→ {集合A から「しりとり」を除いた集合}=B を使ってできる最も長いしりとり 「しりとり」→「りんご」→ {集合B から「りんご」を除いた集合}=C を使ってできる最も長いしりとり 「しりとり」→「りんご」→ 「ごりら」→ {集合C から「ごりら」を除いた集合}=D1 を使ってできる最も長いしりとり 「しりとり」→「りんご」→ 「ごーる」→ {集合C から「ごーる」を除いた集合}=D2 を使っ

    Java7 の Frok/Join Framework を使って、しりとりをしてみました。 - 地平線に行く
  • fork以外の手段で子プロセスを生成する - 射撃しつつ前転 改

    子プロセスで別のプログラムを走らせてその結果を受け取りたい時、C言語ではよくforkとexecの組み合わせを使う。しかし、考えてみれば、なんでforkでわざわざ一度プロセスをコピーして、子プロセス側で今まで使ってたfile descriporとかを始末してから次のプログラムを実行しないといけないんだろう。サーバなら自分自身をコピーする、というようなforkの使い方は自然なような気もするが、ちょっとした便利スクリプトを走らせて結果を受け取る、と言うような用途にはforkとexecは面倒くさい。直接新しいプロセスで新しいプログラムを実行してくれるようなシステムコールがあればいいのに。(popenは入力か出力のどちらかしかできないので力不足の場合がある。) そういった話をしていたら、シャチョーがLinuxのdo_forkはコピーする範囲をかなり詳細に指定できるヨと教えてくれた。これなら確かに、プ

    fork以外の手段で子プロセスを生成する - 射撃しつつ前転 改
  • 7-4. ネットワークサービスは必ずforkしよう

    IPA ISEC セキュア・プログラミング講座

  • プロのサーバ管理者がApacheのStartServers, (Min|Max)SpareServers, MaxClientsを同じにする理由 - blog.nomadscafe.jp

    kazuhoさんが「プロのサーバ管理者の間では存在価値が疑問視されて久しい (Min|Max)SpareServers だと思う」と書いたり、hirose31さんが去年のYAPC::Asiaで{Start,{Min,Max}Spare}Servers,MaxClientsは同じにしているよと発表したり、実際前職のサーバはそのように設定されていたのですが、自分でうまく説明ができてなかったので、調べながら書いてみた。 当はイントラブログ用に書いていたものですが、がんばったので転載。 前提として、CPUの使用率におけるsystemとfork Re: クラウドがネットワークゲーム開発者にもたらしてくれたもの - blog.nomadscafe.jpでも書いている通りforkってのはサーバにとって重い部類の処理になります。つまり負荷の高いときにforkを大量に行うのはしてはならないことの1つです。

  • child_process.fork()は全然fork(2)じゃないけど面白い。 - Qiita

    親子は"message"イベントを通じて通信できる。通信できるデータはプリミティブ値の他、JSONオブジェクトが許されている。プロセスは2つできているけどゾンビ化したりしないしちゃんとwaitpidするみたいだ。 欠点としては、UNIX的なfork(2)と違ってdaemon化には使えないこと。cihld_process.exec()もexec(2)とは全く違うのでUNIX的なプロセス管理はまったくできなくなっている。手軽だけど細かな制御ができないのは困るなあ。 以下は1秒ごとにメッセージを送りあうスクリプト。 親プロセス parent.js: #!/usr/bin/env node var child_process = require("child_process"); var child = child_process.fork("./child"); child.on("messag

    child_process.fork()は全然fork(2)じゃないけど面白い。 - Qiita
  • Child process | Node.js v22.9.0 Documentation

    Source Code: lib/child_process.js The node:child_process module provides the ability to spawn subprocesses in a manner that is similar, but not identical, to popen(3). This capability is primarily provided by the child_process.spawn() function: const { spawn } = require('node:child_process'); const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`);

  • CoW 要点まとめ

    CoW とは CoW = Copy-On-Write [ CoW - Wikipedia ] プロセスのコピーを作成 (fork) するとき、書き換えることのないメモリページは、両方のプロセス(元のプロセスと生成されたプロセス)で共用し、書き換える可能性のあるメモリページは、新たなメモリページを割り当ててコピーを作成する 鉄則 fork するプロセスを生成する場合、親子間でメモリ共有した方が良い forkする前に確保したメモリ領域は子プロセスとの間で共有される 共有されたメモリ領域に対して書き込みを行うと共有は解除(コピー)される forkした後に確保したメモリ領域は子プロセスごとに確保される(共有されない) どのプロセスでも同じように参照するだけの(書き換えない)データは、fork前に確保して共有した方が全体でのメモリ使用量を小さく保てる。つまり、fork 数を多くしたりできる。そして、

    CoW 要点まとめ
    hiroyukim
    hiroyukim 2013/05/23
    fork先でオブジェクトキャッシュ等を使用するとCow率が下がって個々のworkderのメモリ占有率があがり結果としてworker数を下げる必要性が生じるかも。
  • 1