c - televisor - El tamaño del búfer de tubería es 4k o 64k?
tv sony 4k 55 pulgadas (5)
Leí en varios lugares que el tamaño del búfer predeterminado para una tubería es de 4kB (por ejemplo, here ), y mi ulimit -a
tiende a confirmar esa afirmación:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15923
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8 // 8 * 512B = 4kB
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Pero cuando uso un pequeño programa para probar el tamaño del búfer (al escribir en la tubería hasta que se bloquee write ()), veo un límite de 64kB.
Ver este programa:
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
int main(void)
{
int tube[2];
char c = ''c'';
int i;
fprintf(stdout, "Tube Creation/n");
fprintf(stdout, "Theoretical max size: %d/n", PIPE_BUF);
if( pipe(tube) != 0)
{
perror("pipe");
_exit(1);
}
fprintf(stdout, "Writing in pipe/n");
for(i=0;; i++)
{
fprintf(stdout, "%d bytes written/n", i+1);
if( write(tube[1], &c, 1) != 1)
{
perror("Write");
_exit(1);
}
}
return 0;
}
Y su salida:
$ ./test_buf_pipe
Tube Creation
Theoretical max size: 4096
Writing in pipe
1 bytes written
2 bytes written
3 bytes written
4 bytes written
[...]
65535 bytes written
[blocks here]
¡Sugiere fuertemente que el tamaño del buffer de tubería es en realidad de 64k! ¿¿Que está sucediendo aquí??
En mi experiencia, la prueba de escritura única produjo un tamaño total de 65536, sin embargo, cuando escribí 2700 a la vez, solo podía escribir 16 veces, y luego el siguiente intento se detiene. Me imagino que la escritura "atómica" debe estar dentro de un bloque 4K, y que para cada una de mis escrituras, va al siguiente bloque completo para satisfacer la solicitud. Entonces, en efecto, el tamaño de tubería utilizable depende del tamaño de sus escrituras.
Está bien. Desde el kernel 2.6.11, el tamaño de la here en Linux es de 64kB. Por qué ulimit lo reporta como 4Kb, no estoy seguro, pero eso está mal.
Las otras respuestas le dicen que el tamaño del tubo es de 64 KB. La razón por la que PIPE_BUF es de 4 KB es que PIPE_BUF es el tamaño más grande para el que se garantiza que las escrituras son atómicas. Consulte http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html
Parece que el kernel usa hasta 16 buffers, lo que se suma a 64k. Consulte este link para obtener una explicación de la salida de ulimit frente al tamaño del búfer real