.. include:: ../../my-header_2.txt

Buffers de entrada/salida
--------------------------

Las llamadas al sistema de entrada-salida de UNIX/Linux siguen un modelo muy sencillo orientado al byte. ``read()`` y ``write()`` leen y escriben un número de bytes, sin más consideraciones acerca del formato. Si el programador tiene que manejar objetos de entrada/salida de diferentes tipos, como cadenas de caracteres o números, necesita algo más cómodo. Las bibliotecas de entrada/salida, en concreto la biblioteca estándar de C, existen para facilitar la vida al programador, suavizando la sintaxis de las llamadas al sistema y proporcionando mecanismos para manejar cómodamente formatos y tipos de datos.

Supón que te piden que construyas una función como ``scanf`` para un lenguaje que carece de biblioteca de entrada/salida. Está claro que tienes que echar mano de la llamada al sistema ``read()``. Enseguida te plantearás la siguiente cuestión: para leer un dato de un formato determinado, por ejemplo un número o un *string*, ¿cuántos bytes debería leer en la llamada ``write()``? 

Una respuesta a esta respuesta podría ser: de uno en uno, como en ``stee``. Ten en cuenta, sin embargo, que cada llamada al sistema operativo supone cierto trabajo extra, como ya vimos. Es cierto que los procesadores de hoy en día son muy rápidos y manejan con mucha agilidad el cambio de modo de operación, el acceso al vector de interrupciones y el cambio de contexto en la pila, pero ``scanf()`` y ``printf()`` se diseñaron hace casi medio siglo, cuando los procesadores eran mucho más lentos. Además, si la entrada/salida se hace sobre un fichero en el disco, el acceso es por bloques. 

De modo que los diseñadores optaron por molestar las menos veces posible al sistema operativo, e implementaron buffers de cierto tamaño que se llenan de una vez::

    read(0, buffer, TAM_BUFFER);

para que luego las llamadas a ``scanf()`` entreguen el contenido del buffer hasta agotarlo. Lo mismo es aplicable a ``printf()``. 

Esto es exactamente lo que hacemos en nuestra vida diaria. Si nos preparamos un café y queremos echarle un par de azucarillos, compraremos un paquete de cien. Ir a la tienda tiene un coste, así que inconscientemente optimizamos nuestra estrategia: minimizamos el número de visitas a la tienda, pero no nos traeremos tantos azucarillos que no podamos almacenar, o quizás cambie nuestro gusto y dejemos de echar azúcar al café y no lleguemos a gastarlos… 

¿Es realmente más eficiente utilizar la biblioteca? Si no has obtenido resultados concluyentes en tus experimentos, quizás debamos suponer que el sistema operativo también pone algo de su parte, como veremos.

.. include:: ../../my-footer_2.txt
