පයිප්ප බෆරයක ධාරිතාව පද්ධති හරහා වෙනස් වේ (එකම පද්ධතියක පවා වෙනස් විය හැකිය). පයිප්පයක ධාරිතාවය සොයා බැලීමට ඉක්මන්, පහසු සහ හරස් වේදිකා ක්රමයක් ඇති බව මට විශ්වාස නැත.
උදාහරණයක් ලෙස මැක් ඕඑස් එක්ස් බයිට් 16384 ක ධාරිතාවක් පෙරනිමියෙන් භාවිතා කරයි, නමුත් පයිප්පයට විශාල ලිවීමක් කළහොත් බයිට් 65336 ධාරිතාවයට මාරු විය හැකිය, නැතහොත් දැනටමත් කර්නල් මතකය ඕනෑවට වඩා තිබේ නම් තනි පද්ධති පිටුවක ධාරිතාවයට මාරු වේ. පයිප්ප බෆර මගින් භාවිතා කරනු ලැබේ (බලන්න xnu/bsd/sys/pipe.h
, සහ xnu/bsd/kern/sys_pipe.c
; මේවා ෆ්රීබීඑස්ඩී වෙතින් වන බැවින්, එම හැසිරීම ද එහි සිදුවිය හැකිය).
එක් ලිනක්ස් පයිප්ප (7) මෑන් පිටුවක් පවසන්නේ ලිනක්ස් 2.6.11 සිට පයිප්ප ධාරිතාව බයිට් 65536 ක් වන අතර ඊට පෙර තනි පද්ධති පිටුවක් (උදා: (32-බිට්) x86 පද්ධති මත බයිට් 4096). කේතය ( include/linux/pipe_fs_i.h
, සහ fs/pipe.c
) පද්ධති පිටු 16 ක් භාවිතා කරන බව පෙනේ (එනම් 64 කිබී පද්ධති පිටුවක් 4 කිබී නම්), නමුත් එක් එක් පයිප්පයේ බෆරය පයිප්පයේ fcntl හරහා සකස් කළ හැකිය (උපරිම ධාරිතාව 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"
මැක් ඕඑස් එක්ස් 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
ලිනක්ස් 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_BUF
සී ශීර්ෂ ලිපිගොනු වල අර්ථ දක්වා ඇති අගය (සහ සඳහා වන pathconf අගය _PC_PIPE_BUF
), පයිප්පවල ධාරිතාව නියම නොකරයි, නමුත් පරමාණුකව ලිවිය හැකි උපරිම බයිට් ගණන ( POSIX write (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. */