পাইপ বাফারের ক্ষমতা বিভিন্ন সিস্টেমে পরিবর্তিত হয় (এবং এমনকি এটি একই সিস্টেমেও পরিবর্তিত হতে পারে)। আমি নিশ্চিত নই যে পাইপের সক্ষমতা সন্ধানের জন্য দ্রুত, সহজ এবং ক্রস প্ল্যাটফর্মের উপায় আছে।
উদাহরণস্বরূপ, ম্যাক ওএস এক্স, ডিফল্টরূপে 16384 বাইটের ধারণক্ষমতা ব্যবহার করে, তবে পাইপটিতে বড় লেখালেখি করা গেলে 65336 বাইট ক্যাপাসিটিতে স্যুইচ করতে পারে, বা খুব বেশি কার্নেল মেমরি ইতিমধ্যে থাকলে একক সিস্টেমের পৃষ্ঠায় স্যুইচ করতে পারে পাইপ বাফার দ্বারা ব্যবহৃত হচ্ছে (দেখুন xnu/bsd/sys/pipe.h
এবং xnu/bsd/kern/sys_pipe.c
যেহেতু এগুলি ফ্রিবিএসডি থেকে আসে তাই সেখানেও একই আচরণ হতে পারে)।
একটি লিনাক্স পাইপ ()) ম্যান পৃষ্ঠাতে বলা হয়েছে যে পাইপ ক্ষমতাটি লিনাক্স ২. by.১১ এর পর থেকে 5৫৫36 since বাইট এবং এর আগে একটি একক সিস্টেমের পৃষ্ঠা (যেমন 4096 বাইট (32-বিট) x86 সিস্টেমে)। কোডটি ( include/linux/pipe_fs_i.h
এবং fs/pipe.c
) 16 টি পৃষ্ঠা পৃষ্ঠা ব্যবহার করছে বলে মনে হয় (যেমন কোনও সিস্টেম পৃষ্ঠা 4 কিবি হয় তবে 64 কিবি) তবে প্রতিটি পাইপের জন্য বাফারটি পাইপের উপর একটি 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
সি হেডার ফাইলগুলিতে সংজ্ঞায়িত মান (এবং এর জন্য প্যাথকোনফ মান _PC_PIPE_BUF
) পাইপগুলির সক্ষমতা নির্দিষ্ট করে না, তবে সর্বাধিক সংখ্যক বাইট যা পরমাণুভাবে রচনা করা যায় (দেখুন পসিক্স লিখন (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. */