pipe()を使ったCのプログラムを書いているのですが、パイプの
バッファサイズがデフォルトで4096バイトしかないため、性能
が出ません。そこでパイプのサイズを増やす方法を探しています。
bashで"ulimit -p 16" 等を試してみたのですが、Invalid argument
でエラーになってしまいます。
パイプのバッファサイズを16Kや32Kに増やす方法をご存知の方
がおられましたら、ご教授お願いいたします。
--
株式会社 日立マイクロソフトウェアシステムズ
システム第4設計部 MPEG応用開発グループ
古野 文一
mailto:fur...@hitachi-ms.co.jp
> pipe()を使ったCのプログラムを書いているのですが、パイプの
> バッファサイズがデフォルトで4096バイトしかないため、性能
> が出ません。そこでパイプのサイズを増やす方法を探しています。
kernelのソース (fs/pipe.c)あたりを軽く見た限りでは、
pipeのバッファのサイズはメモリページ1枚分に固定のようです。
x86系のlinuxだとページサイズは4kですけど、alphaではページサイズ
8kですから、linux/alphaならバッファサイズは8kになるでしょう。
(なんて消極的解決策)
または、パイプ以外のプロセス間通信機構を使ってみるというのも手でしょう。
named pipeなら、4kという制限はないはずです。でもfile systemを介すから
遅いかも。see fifo(4)
ソケットかSysV IPCのメッセージキューの方がいいかも知れません。
see also ipc(5) socket(7)
でかいの企画 佐々木茂彦
ssa...@dekaino.net
とりあえず速度優先ということでFIFOを使うのは躊躇していた
のですが、ものは試しで使ってみます。
IPCのメッセージキューは未経験なので勉強してみます。
ありがとうございました。
> とりあえず速度優先ということでFIFOを使うのは躊躇していた
> のですが、ものは試しで使ってみます。
> IPCのメッセージキューは未経験なので勉強してみます。
共有メモリ(mmapでもshmopでも)のが速くないですか?
で、同期だけpipeでやる(semopやmsgopでもよいけど)。
前田敦司
> 共有メモリ(mmapでもshmopでも)のが速くないですか?
> で、同期だけpipeでやる(semopやmsgopでもよいけど)。
あまり詳しくないもので、pipeって同期付き共有メモリという認識でいました。
ちなみにやろうとしていることはスレッド間のストリーミングデータの
受け渡しです。別プロセスではないので、もうグローバル領域にガバッと
領域確保しようかという気になっています(^_^;;
> > 共有メモリ(mmapでもshmopでも)のが速くないですか?
> > で、同期だけpipeでやる(semopやmsgopでもよいけど)。
>
> あまり詳しくないもので、pipeって同期付き共有メモリという認識でいました。
カーネルのバッファとの間でのコピーが起きますし、システムコールのオーバー
へッドもかかってしまいます。
> ちなみにやろうとしていることはスレッド間のストリーミングデータの
> 受け渡しです。別プロセスではないので、もうグローバル領域にガバッと
> 領域確保しようかという気になっています(^_^;;
同一プロセスのスレッド間ですか。ならメモリを使うべきでしょう。同期には
普通にpthread_cond_wait()なりsem_wait()なりを使えばよろしいでしょう。
readとwriteのようにインターフェースを絞って抽象化すると確かに分かりや
すくなりますが、それはご自分で
void port_send(port_t *port, void *data, size_t size)
とかport_receive()とかを作るとよろしいのでは。(コピーするかポインタ
を渡すかは多少思案のしどころかと思いますが。)
前田敦司