televisores televisor tecnologia samsung que pulgadas pantalla mejor funciona comprar como c linux size buffer pipe

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í??


Es programable ahora

A partir de Linux 2.6.35 puede usar fcntl(2) con la operación F_SETPIPE_SZ para configurar el búfer de tubería hasta /proc/sys/fs/pipe-max-size . Esto es por defecto 1 MB; ver proc(5).


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.



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