出力をバッファリングしないとは?

[上に] [前に] [次に]
小次郎 [E-Mail] 2000/05/31(水) 12:48:34
Perlスクリプトの先頭に、よく「出力をバッファリングしないため」
ということで、$|=1; と記述していますが、これは具体的には
一体どのような効果があるのでしょうか? また「バッファリング」
とは何のことなのでしょうか?
よろしくご教授ください。

謎の人 2000/05/31(水) 13:13:23
CGIプロセスでバッファリングすると、デットロック状態になるって本に書いてありました...。

バッファリングとは、付加のかかる出力処理より本来の処理を優先させ、
後から、バッファリングしたデータを出力。ですか..。

B-Cus 2000/05/31(水) 20:56:13
> バッファリングとは、付加のかかる出力処理より本来の処理を優先させ、
> 後から、バッファリングしたデータを出力。ですか..。
# ↑のようなことをバッファリングって言うの?
少なくとも、ここ ($|=1) で言うところのバッファリングは
違います。$|=1 は、stdio のバッファリングを OFF にしている
だけです。なので、
> CGIプロセスでバッファリングすると、デットロック
> 状態になるって本に書いてありました...。
そういうことは起こりません。

できる限り $|=1 としないようにしましょう。マシンに負荷が
かかり、パケットを余計に飛ばしてしまいます。

細かいところまで知りたければ、
 - バッファリングとは何か
 - stdio のバッファリング (行単位バッファリング、完全
  バッファリング、バッファリングなし)
 - printf(3) と write(2) の関係 (UNIX なら)
 - apache のバッファリング (最近の apache はバッファリングしない)
 - TCP のバッファリング
を勉強すればいいですが、解説は他の人にまかせた。

とほほ 2000/06/01(木) 02:14:33
> 後から、バッファリングしたデータを出力。ですか..。
うーん、まぁ、そう言えないこともないような、あるような・・・

バッファリングは、次のようなスクリプトで体感できると思います。

open(OUT, "> file.txt");
# ファイルをオープンする。
print OUT "AAA";
# AAAを書き込んだように見せかけておいて、
# 実は、Perlのメモリ中に溜める(バッファリングする)だけ
open(IN, "file.txt"); print "1:" . <IN>; close(IN);
# だから、file.txtを表示しても何も表示されない。
$old = select(OUT); $| = 1; select($old);
# ってやると、OUTへの書き込みがバッファリングされなくなる
print OUT "BBB";
# 今度はバッファリングせずに、それまで溜まっていたデータ(AAA)も
# まとめて、ファイルに書き出される。
open(IN, "file.txt"); print "2:" . <IN>; close(IN);
# だから、file.txtを表示すると、今度は表示される。
close(OUT);

メモリ中にバッファリングされたデータがフラッシュされる(吐き出される)
タイミングは、close()された時は必ず、あとは、一定量のデータが
溜まった時とか、ファイルロック状態が変わった時とか・・・

> デットロック状態になるって本に書いてありました...。
Aさんが書いたデータを元にBさんがデータを書き、
Bさんが書いたデータを元にAさんが・・・
というプログラムなら、デッドロック状態になるかもしれませんが、
(今、無理矢理そういうケースを考えてみました^^;)
プログラムの組みかた次第ですね。

謎の人 2000/06/01(木) 09:00:17
B-Cusさんへ
認識を新たにします。
これからもご指導よろしくお願いします。

とほほさんへ
私の発言へのフォローありがとうございました。
やさしさを感じました。

小次郎さんへ
的外れな回答をして、ごめんなさい。
これからは、慎重にいきます。

小次郎 2000/06/01(木) 19:15:41
とほほさん、B-Cusさん、謎の人さん

レスをありがとうございました。
意外と難しいことなのですね。

結論としてはやはり、掲示板やカウンタなどのCGIスクリプトの
先頭部には必ず
$|=1;
と記述しておいたほうがいいのでしょうか?

S-pore [HomePage] 2000/06/01(木) 20:30:52
> レスをありがとうございました。

> 結論としてはやはり、掲示板やカウンタなどのCGIスクリプトの
> 先頭部には必ず
> $|=1;
> と記述しておいたほうがいいのでしょうか?

謎。

B-Cus 2000/06/01(木) 23:11:03
> 先頭部には必ず
> $|=1;
> と記述しておいたほうがいいのでしょうか?
いいえ、違います。必要な場合のみ記述すべきです。

halcyan 2000/06/02(金) 14:11:15
http://cgi.members.interq.or.jp/green/tkiduki/cgi-bin/bbs/plum.cgi?book=support&res=71
他人の掲示板へのリンクになってしまいますけど、
これなんか参考にされてはどうでしょう?

小次郎 2000/06/02(金) 17:24:44
[[解決]]
皆さん、ありがとうございました。
お蔭様でよく理解することができました。

[上に] [前に] [次に]