パイプバッファはどれくらい大きいですか?

パイプバッファはどれくらい大きいですか?

コメントでメイクファイルの「|true」が「||true」と同じ効果を持つ理由が何なのか混乱しています。ユーザーウェストジェム書いた:

避けるべきもう1つの理由| trueは、コマンドがパイプバッファを埋めるのに十分な出力を生成する場合はtrueを読み取るのを待つのをブロックすることです。

パイプバッファのサイズを知る方法はありますか?

ベストアンサー1

パイプバッファの容量はシステムによって異なります(同じシステムでも異なる場合があります)。パイプの容量を見つけるための迅速で簡単なクロスプラットフォーム方法があるかどうかはわかりません。

たとえば、Mac OS 。パイプバッファで使用されます(参照:xnu/bsd/sys/pipe.hxnu/bsd/kern/sys_pipe.c; FreeBSDから来たため、同じ動作が発生する可能性があります。

Linuxパイプ(7)マニュアルページLinux 2.6.11では、パイプ容量は65536バイトで表示され、以前は単一のシステムページ(例:(32ビット)x86システムでは4096バイト)で表示されます。コード(include/linux/pipe_fs_i.hfs/pipe.c)は16個のシステムページ(つまり、システムページが4KiBの場合64KiB)を使用しているように見えますが、パイプごとのバッファは通過できます。ポカントルパイプへ(最大容量は基本的に1048576バイトですが変更される可能性があります/proc/sys/fs/pipe-max-size))


ここで少し強く打つ/真珠私のシステムのパイプ容量をテストするために使用した組み合わせは次のとおりです。

#!/bin/bash
test $# -ge 1 || { echo "usage: $0 write-size [wait-time]"; exit 1; }
test $# -ge 2 || set -- "$@" 1
bytes_written=$(
{
    exec 3>&1
    {
        perl -e '
            $size = $ARGV[0];
            $block = q(a) x $size;
            $num_written = 0;
            sub report { print STDERR $num_written * $size, qq(\n); }
            report; while (defined syswrite STDOUT, $block) {
                $num_written++; report;
            }
        ' "$1" 2>&3
    } | (sleep "$2"; exec 0<&-);
} | tail -1
)
printf "write size: %10d; bytes successfully before error: %d\n" \
    "$1" "$bytes_written"

以下は、さまざまな書き込みサイズを持つMac OS X 10.6.7システムで実行したときに見つかった結果です(16KiBを超える書き込みに対する変更点を参照)。

% /bin/bash -c 'for p in {0..18}; do /tmp/ts.sh $((2 ** $p)) 0.5; done'
write size:          1; bytes successfully before error: 16384
write size:          2; bytes successfully before error: 16384
write size:          4; bytes successfully before error: 16384
write size:          8; bytes successfully before error: 16384
write size:         16; bytes successfully before error: 16384
write size:         32; bytes successfully before error: 16384
write size:         64; bytes successfully before error: 16384
write size:        128; bytes successfully before error: 16384
write size:        256; bytes successfully before error: 16384
write size:        512; bytes successfully before error: 16384
write size:       1024; bytes successfully before error: 16384
write size:       2048; bytes successfully before error: 16384
write size:       4096; bytes successfully before error: 16384
write size:       8192; bytes successfully before error: 16384
write size:      16384; bytes successfully before error: 16384
write size:      32768; bytes successfully before error: 65536
write size:      65536; bytes successfully before error: 65536
write size:     131072; bytes successfully before error: 0
write size:     262144; bytes successfully before error: 0

Linux 3.19の同じスクリプト:

/bin/bash -c 'for p in {0..18}; do /tmp/ts.sh $((2 ** $p)) 0.5; done'
write size:          1; bytes successfully before error: 65536
write size:          2; bytes successfully before error: 65536
write size:          4; bytes successfully before error: 65536
write size:          8; bytes successfully before error: 65536
write size:         16; bytes successfully before error: 65536
write size:         32; bytes successfully before error: 65536
write size:         64; bytes successfully before error: 65536
write size:        128; bytes successfully before error: 65536
write size:        256; bytes successfully before error: 65536
write size:        512; bytes successfully before error: 65536
write size:       1024; bytes successfully before error: 65536
write size:       2048; bytes successfully before error: 65536
write size:       4096; bytes successfully before error: 65536
write size:       8192; bytes successfully before error: 65536
write size:      16384; bytes successfully before error: 65536
write size:      32768; bytes successfully before error: 65536
write size:      65536; bytes successfully before error: 65536
write size:     131072; bytes successfully before error: 0
write size:     262144; bytes successfully before error: 0

注:PIPE_BUFCヘッダーファイルで定義された値(およびパスの設定value _PC_PIPE_BUF)、パイプの容量を指定するのではなく、原子的に書き込むことができる最大バイト数を指定します(参照:POSIX書き込み(2))。

から引用include/linux/pipe_fs_i.h:

/* Differs from PIPE_BUF in that PIPE_SIZE is the length of the actual
   memory allocation, whereas PIPE_BUF makes atomicity guarantees.  */

おすすめ記事