El Buffer Cache

La lectura desde el disco [22] es mas lenta en comparación con el acceso a memoria (real). Además, es común leer la misma parte del disco varias veces durante periodos relativamente cortos de tiempo. Por ejemplo, uno podría leer primero un mensaje del correo electrónico, después leer la misma carta con un editor de texto cuando uno la esta respondiendo, y finalmente hacer que el programa la lea de nuevo cuando le indicamos copiarla a una carpeta. O, considere cuan seguido el comando ls es ejecutado en un sistema con muchos usuarios. Leyendo la información del disco una sola vez y luego manteniéndola en la memoria hasta que no sea necesaria, puede acelerar todas las lecturas posteriores con respecto a la primera. Esto es llamado "buffering" de disco (disk buffering), y la memoria usada para ese propósito es llamada buffer cache.

Debido a que la memoria es, desafortunadamente finita, y por lo tanto, un recurso escaso, el "buffer cache" usualmente no puede ser demasiado grande (no puede mantener todos los datos que uno siempre quiere usar). Cuando la "cache" se completa, los datos que no han sido usados por un periodo de tiempo prolongado son descartados y así la memoria es liberada para ser utilizada con nuevos datos.

El buffering de disco trabaja cuando existen escrituras también. Por un lado, los datos que son escritos son leídos nuevamente con mucha frecuencia (por ej. el código fuente de un programa es guardado a un archivo, y después es leído por el compilador), entonces, colocar los datos que son escritos en la caché es una buena idea. Por otro lado, colocar los datos en la caché, sin escribirlos a disco inmediatamente, acelera al programa que los guarda. Las escrituras pueden ser realizadas en segundo plano, sin disminuir la velocidad de ejecución de los otros programas.

La mayoría de los sistemas operativos tienen "buffer caché" (aunque algunas veces son llamados de manera diferente), pero no todos funcionan de acuerdo a los mismos principios. Algunos son de escritura directa (write-through): los datos son escritos a disco inmediatamente (y obviamente, son mantenidos en la caché). Otros son de escritura posterior (write-back), ya que las escrituras son realizadas momentos después. Escritura posterior es más eficiente que escritura directa, pero es más susceptible a errores: si la máquina cae, el suministro eléctrico es interrumpido en un mal momento, o un medio extraíble es removido sin ser desmontado, entonces usualmente los cambios realizados en la caché se pierden. Esta situación puede significar que el sistema de archivos (si existiese uno) no trabaje completamente bien, tal vez debido a que los datos que no pudieron ser escritos sean cambios importantes para el mantenimiento del sistema.

Debido a esto, nunca debería apagar el equipo sin emplear los procedimientos adecuados (ver Capítulo 8, Encendido y apagado Capitulo 8), como tampoco quitar un disco flexible de la unidad hasta que haya sido desmontado (si fue montado), o antes de que cualquier programa que esta haciendo uso del dispositivo no indique que ha terminado y, el "led" de la unidad de disquete ya no esta encendida. El comando sync descarga el buffer (flushes), por ejemplo, fuerza que los datos aun no grabados sean escritos al disco, y puede ser usado cuando uno quiere asegurarse que todas las escrituras se hayan realizado.En los sistemas UNIX tradicionales, hay un programa llamado update que esta ejecutándose en segundo plano, el cual se encarga de ejecutar el comando sync cada 30 segundos, por esto usualmente no es necesario usar sync. Linux tiene un demonio adicional, bdflush, el cual efectúa un sync mas imperfecto, pero con mas frecuentemente para evitar el repentino congelamiento debido a la sobrecarga de I/O que algunas veces "sync" produce.

Bajo Linux, bdflush is iniciado por update. No existen usualmente razones para preocuparse por bdflush, pero si bdflush termina su ejecución por alguna causa, el kernel alertará sobre esto, por lo que debe iniciarlo a mano (/sbin/update).

La caché no realiza realmente buffer de archivos, pero sí ** de bloques, los cuales son las unidades mas pequeñas de E/S a disco (en Linux usualmente son de 1 kB). De esta manera, también los directorios, super bloques, otros datos relacionados con ** en el sistema de archivos, y discos sin sistema de archivos son mantenidos en caché.

La eficacia de una caché es decidida principalmente por su tamaño. Una caché pequeña es casi inservible: tiene muy pocos datos, por lo que todos los datos en la caché serán descartados antes de que sean reutilizados. El tamaño crítico depende de la cantidad de datos escritos y leídos, y de cuan frecuente los mismos datos son accedidos. La única manera de saber el tamaño útil de una caché es experimentando.

Si la "cache" es de tamaño fijo no es muy bueno que sea demasiado grande porque eso podría hacer que la memoria libre sea demasiado pequeña y ocasionar "swapping" (lo cual es también muy lento). Para hacer que el uso de la memoria real sea mas eficiente, Linux usa automáticamente toda la memoria RAM como "buffer cache", pero también, automáticamente, disminuye el tamaño de la "cache" a medida que los programas van necesitando mas memoria.

Bajo Linux, usted no necesita configurar nada para hacer utilizar "cache", esto sucede de forma completamente automática. A excepción de los adecuados procedimientos a seguir para "cerrar?apagar?desconectar?bajar?deshabilitar" o quitar ¿diskettes? usted no tiene necesidad de preocuparse por nada.



[22] Excepto un disco RAM, por obvias razones.