एक पाइप बफर की क्षमता पूरे सिस्टम में भिन्न होती है (और एक ही सिस्टम पर भिन्न भी हो सकती है)। मुझे यकीन नहीं है कि एक पाइप की क्षमता को देखने के लिए एक त्वरित, आसान और क्रॉस प्लेटफॉर्म तरीका है।
उदाहरण के लिए, Mac OS X, डिफ़ॉल्ट रूप से 16384 बाइट्स की क्षमता का उपयोग करता है, लेकिन यदि 65% पाइप में बड़े लेखन हो जाते हैं, तो 65336 बाइट कैपेसिटी पर स्विच कर सकते हैं, या यदि बहुत कर्नेल मेमोरी पहले से ही है तो सिंगल सिस्टम पेज की क्षमता पर स्विच करेंगे। पाइप बफ़र्स द्वारा उपयोग किया जा रहा है (देखें xnu/bsd/sys/pipe.h
, और xnu/bsd/kern/sys_pipe.c
; चूंकि ये FreeBSD से हैं, वही व्यवहार वहां भी हो सकता है)।
एक लिनक्स पाइप (7) मैन पेज का कहना है कि लिनक्स 2.6.11 के बाद से पाइप की क्षमता 65536 है और इससे पहले एक एकल सिस्टम पेज (जैसे 4096 बाइट्स पर (32-बिट) x86 सिस्टम)। कोड ( include/linux/pipe_fs_i.h
और fs/pipe.c
) 16 सिस्टम पेजों का उपयोग करने लगता है (यानी 64 KiB अगर एक सिस्टम पेज 4 KiB है), लेकिन प्रत्येक पाइप के लिए बफर को पाइप पर एक 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 सिस्टम पर विभिन्न लेखन आकारों के साथ इसे चलाते हुए पाया गया है (16KBB से बड़ा लिखने के लिए परिवर्तन पर ध्यान दें):
% /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 लिखना (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. */