lunes, 1 de junio de 2009

Entrada/Salida con buffer

Las llamadas al nùcleo del sistema (system calls) para realizar operaciones de E/S ocupan una gran cantidad de tiempo, comparadas con una llamada a función. Una llamada al núcleo consiste en utilizar funciones del núcleo del sistema operativo de una forma semejante a como se manejan las funciones "normales" en un programa.

Para realizar una llamada al núcleo del sistema se requiere un trabajo extra, comparándolo con una llamada a función, necesitándose almacenar información adicional durante la llamada y el retorno, además de la sobrecarga necesaria para encontrar un manejador de la llamada al núcleo, traspasar argumentos, etc.

La sobrecarga en las llamadas al nùcleo se puede disminuir mediante la "bufferizaciòn": se puede transferir un ùnico caràcter de/hacia un buffer desde el proceso de usuario; una vez que el buffer se ha llenado (para ficheros de salida) o vaciado (para ficheros de entrada) se puede transferir la totalidad del buffer lleno de caracteres.

Este procedimiento reduce el tiempo de ejecución de un programa, pero puede tener otros efectos. En particular, si putchar pone caracteres en un buffer, estos caracteres no aparecerán en la pantalla a medida que vayan siendo enviados por putchar; es más, ni siquiera lo harán después de que se haya producido el retorno de putchar, con la molestia de que.no aparece eco inmediato en pantalla. "

Si un programa termina anormalmente por cualquier causa, la salida que tenía bufferizada se quedará sin enviar al fichero de salida.

Del mismo modo, los errores que se estén produciendo en la escritura no aparecerán hasta que se hayan escrito los datos del buffer, lo cual podría suceder bastante después de que la llamada a putc haya enviado los datos.

La "bufferización" de entrada causa generalmente pocos problemas, salvo en el caso particular de que más de un proceso esté leyendo simultáneamente el mismo fichero.

Realmente no hace demasiada falta controlar la bufferización de los datos; dejándolo en manos de la librería estándar de E/S podemos confiar en que la librería "hará las cosas bien" sin necesidad de control (por ejemplo no bufferizará los datos de salida a un terminal).

No obstante, la librerìa stàndar de E/S posee funciones que permiten validar o invalidar la "bufferizaciòn" sobre un fichero, asì como una funciòn que fuerza a la librerìa de E/S a que envìe de inmediato los datos retenidos en el buffer. La función setbuf

setbuf(fp, buffer)

FILE *fp;

char *buffer;


informa a la librería estándar de E/S de que utilice el array buffer de BUFSIZ caracteres (definido en la ) para bufferización. Si buffer es igual a NULL entonces el fichero no estará bufferizado. setbuf debería llamarse antes de que se vaya a realizar cualquier operación de E/S sobre el fichero.
La función

fflush(fp)
FILE *fp;

fuerza que cualquier dato bufferizado del fichero fp sea escrito en el fichero, fflush devuelve EOF para indicar un error (por ejemplo, la imposibilidad de grabar los datos en el fichero) o cero en el caso contrario.

No hay comentarios:

Publicar un comentario