eliax

Pregunta a eliax: ¿Qué es un Cache y cómo funciona?
eliax id: 6921 josé elías en ago 6, 2009 a las 11:41 PM (23:41 horas)
eliax - para mentes curiosas¿Cuántas veces no han leído especificaciones en un CPU, una memoria, disco duro, o incluso en terminología en navegadores y aplicaciones web, en donde se refieren a un "Cache"?

Cache es uno de esos términos que para el usuario técnico es una simpleza, pero para la persona común no familiarizada con el término es lo mismo que decir palabras mágicas en una película de Harry Potter. Cosas como que un disco duro tiene 16MB de cache, o que un CPU tiene 2MB de cache es algo que la mayoría de los consumidores no entiende, y por lo general simplemente siguen la regla que mientras más grande es el cache mejor debe ser lo que uno está comprando (y esa regla en este caso es por lo general una buena regla a seguir, aunque no siempre como veremos).

Así que veamos qué es este concepto en términos sencillos y fáciles de entender...

Imagínate que trabajas en una central telefónica de un pequeño pueblo, en donde muchas personas llaman para preguntarte el número telefónico de algunos negocios (restaurantes, cines, tiendas de ropa, bancos, etc), y que lo único que tienes disponible para contestar es una de esas tradicionales guías telefónicas (un libro bastante pesado y de gran espesor).

Una cosa que notarás en tu empleo, al cabo de poco tiempo, es que las personas tienden a preguntar con bastante frecuencia sobre un grupo en particular de negocios populares, por lo que para hacer tu trabajo más eficiente, lo que empiezas a hacer es a copiar el número telefónico de esos negocios populares en un cuaderno aparte, organizados alfabéticamente.

Ese cuaderno tiene quizás solo 4 o 5 páginas (versus las cientos de página de la guía original), pero sientes confianza en que en alrededor del 50% de los casos cada vez que te llaman esos números los puedes encontrar en esta pequeña guía, en donde puedes encontrar los números más rápidamente.

Pues felicidades porque acabas de crear un cache.

El mismo concepto se utiliza por ejemplo en un disco duro. Un controlador interno utiliza una pequeña cantidad de memoria (digamos, 16MB) para almacenar cosas que cree tú vas a pedir en el futuro próximo, de modo que si tu PC le pide información al disco duro, y este la tiene en el cache de 16MB, te la puede dar muchísimo más rápidamente que buscándola físicamente en el disco duro (el cual a la fecha es muy posible que sea un sistema mecánico con discos que giran, mientras que la memoria cache es memoria sólida y mucho más rápida).

Es decir, un cache sirve para acelerar el acceso a la información, y por eso, mientras más grande es el cache por lo general mejor el rendimiento, ya que más cosas se pueden almacenar en este cache "por si acaso" se necesitan.

Otro concepto importante del cache es lo denominado en jerga técnica un "cache miss", un fallo de cache. Expliquemos lo que es eso siguiendo el ejemplo de la guía telefónica...

Digamos que alguien te llama, y tu esperas la llamada con tu pequeño cuaderno en mano (y dejas la guía telefónica original a un lado tuyo), y te pide un teléfono. Lo primero que haces es abrir tu cuaderno y buscar a ver si el número está ahí, sin embargo te das cuenta que no se encuentra ahí, por lo que procedes entonces a poner el cuaderno a un lado, recoger una vez más la guía telefónica, y proceder como antes a buscar el número telefónico hasta que lo encuentres.

¿Qué ocurrió aquí? Un fallo del cache, pues lo que encontrabas no estaba en tu cuaderno, lo que hizo que ahora el proceso de buscar el número telefónico durara mas tiempo que si no tuvieras un cuaderno/cache, ya que perdiste tiempo buscando en el cuaderno antes de buscar en la guía.

Eso mismo ocurre en un cache de disco duro, CPU, o cualquier otro proceso que utilice caches, y es sumamente importante tomar ese problema en cuenta cuando se diseñan sistemas, ya que si tu no tienes un buen algoritmo para saber qué poner en el cache, es posible que al final el cache te afecte negativamente y termines con un sistema más lento que antes.

En el caso de la guía telefónica, el algoritmo es incluir en el cuaderno los números más frecuentemente utilizados, lo que es bastante simple, pero en otros casos (como en un CPU en donde no sabes siempre cuales instrucciones tu PC va a ejecutar), el trabajo es muchísimo más difícil.

Es por eso que el diseñador del sistema debe poner en la balanza una fórmula en donde el tiempo perdido con la cantidad de cache missses sea menor que el tiempo ganado con caches hechos correctamente, y déjenme decirles que existen literalmente miles y miles de artículos científicos publicados sobre todas las posibles estrategias de abordar este problema.

Otro punto a tener en cuenta es que en un sistema en donde casi en el 100% de los casos los datos son aleatorios, que entonces es recomendable no utilizar un cache, ya que la mayoría de las veces el cache haría un cache miss y terminarías con un sistema más lento, más complejo, y más caro.

La otra cara de la moneda es decir que mientras más estructurados y predecibles sean los datos, más se benefician estos de un cache. Y obviamente existen casos intermedios, en donde hay que saber elegir cuidadosamente la cantidad de cache, pues si eliges mucho te arriesgas a tener muchos cache misses con datos aleatorios, y si eliges poco también te arriesgas a tener muchos cache misses con datos predecibles.

Así que ahí lo tienen. Asombrosamente este concepto a veces es explicado en todo un capítulo en cursos de ingeniería en computación, pero como vieron, si hacen una analogía a la vida diaria, notarán que en realidad es algo bastante simple...

Y como siempre, pueden acceder a más artículos similares en la sección de "Pregunta a eliax", y enviar sus preguntas por este medio.

autor: josé elías

Comentarios

  • Muy bien explicado, enhorabuena. Siempre sigo tu blog.

  • Felicidades, han hecho una buena analogia; simplemente por añadir una pequeñez, siempre o casi siempre he visto en revistas informaticas, la palabra en femenino: la cache. Aunque tras pasarme por la wiki, he comprobado que efectivamente es masculina. Un saludo.

  • Es totalmente sencillo entender este termino tan utilizado cuando lo planteas en la manera en que lo escribes...
    Felicidades!

  • Pues te felicito, esta vez si diste una explicación simple, sencilla, y entendible para la gente convencional, y como dices para los que estamos en el área es fácil de entender, pero para la gente que no sabe mucho de computación se les hace mas difícil entender, lo mismo sucede cuando tratas de explicarles que es un virus de computadora y como funciona.
    Saludos.

  • Muchisimas gracias! En verdad no tenia idea de lo que es un cache.
    Una pregunta: una persona comun y corriente que compra una computadora con un disco duro con cache y tambien un CPU con cache. Esa persona tiene que programar qué irá al cache, o se programa solo dependiende de que procesos ocurren mas y que archivos se utilizan mas?

    • Es un proceso totalmente automático por el sistema operativo y por el firmware de tales dispositivos.

      A propósito, firmware es sinónimo a "sistema operativo", pero se utiliza mas para sistemas operativos bastante pequeños y especializados, como el que está dentro de todo disco duro y que nadie accede directamente.

  • Pregunta: Entonces se puede decir que los nuevos discos duros SSD son como si fueran un cache gigante??

    • Excelente pregunta.

      Aunque aparente que un SSD (para los que no sepan, un SSD es un disco duro pero sin partes movibles, sino que es como una memoria cuyo contenido no se borra si esta pierde energía) no utiliza Cache, la realidad es que también lo hacen.

      La razón es que aunque el SSD está compuesto de memorias sólidas, estas por lo general no utilizan las memorias más rápidas del mercado porque son muy costosas, o porque son del tipo que requieren energía para recordar la información.

      A tal fin los SSDs por lo general utilizan memoria del tipo DRAM para sus caches.

      Otra cosa a tomar en cuenta (y aquí nos estamos adentrando al campo de la optimización de estos caches) es que aun los datos estén almacenados en un SSD, que estos sufren de un problema que también plaga los discos duros tradicionales y cualquier otra tecnología de almacenamiento: Fragmentación de datos.

      Fragmentación significa que (por ejemplo) un archivo de texto no está almacenado en bloques contiguos, sino que disperso por todos lados (eso se debe al continuo uso del disco y modificación de los archivos), lo que causa que sea mas lento acceder a esos archivos fragmentados, mientras que un cache con ayuda del sistema operativo puede poner en el cache todo el archivo completo y listo para servir.

      • Habría que aclarar que el problema de la fragmentación sólo se da en Windows.

        Por algún motivo, los señores de Microsoft no se han enterado de que hace 40 años que se conoce la manera de hacer sistemas de archivos que no se fragmenten.

        Bueno, no es que no se fragmenten, sino que su funcionamiento es tal que se reorganizan a medida que se van grabando los datos haciendo que rara vez la fragmentación supere el 10%.

        Cmo dato comparativo, el desfragmentador de windows considera que el disco no necesita ser desfragmentado cuando tiene 10% o menos.

        Sobre el tema, recomiendo la lectura de:

        http://personal.telefonica.terra.es/web/santibenejam/latrampa.html

        En particular el capítulo sobre el "armario con cajones" que hace una sencilla analogía de los bloques de disco con cajones donde poner papeles y explica la manera (bastante obvia por cierto) de evitar que se desordenen todos como ocurre en FAT y NTFS.

        • Anv,

          Buena tu aclaración sobre FAT/FAt32/NTFS necesitar defragmentación, pero nota que el fichero de OS X no está siempre degragmentado. Aunque es un proceso automático muchos archivos pasan por un estado fragmentado en varios momentos (en particular en aplicaciones de tiempo real, como escribir video al disco).

          Es decir, aunque conceptualmente es cierto que los ficheros de OS X no necesitan degragmentación (o al menos en teoría), eso no significa que no exista defragmentación que se pueda beneficiar por un cache.

          Solo una aclaración :)

        • ERRORRRR...... TODOS los sistemas operativos en el proceso de grabacion de informacion en HD o SSD pasan en primera instancia por una fragmentacion si no ocurriera eso la grabacion de la informacion sera MUY lenta, que los SO tengan un proceso automatico de desfragmentacion posterior o en tiempos muertos es otra cosa aun asi este proceso le tomaria tiempo, tiempo que para sistemas de altorendimiento es muy nesasario es por eso que en Windows dejan a criterio del Usuario en que momento realizan la defragmantacion si TU lo quieres, tambien puedes automatizarlo para que este sea en el % que desees..... lo cual yo no recomiendo salvo que lo realices en la Noche o cuando no uses la computadora

          Muy bien explicado por Elias, la analogia esta perfecta y clara para los Usuarios NO tecnicos

          • Lo que suelen hacer los sistemas de archivos es evitar lo más posible la fragmentación eligiendo el lugar donde escribirán los datos en vez de escribir "a lo tonto" en el primer lugar libre que haya como hace windows.

            Obviamente que existe algo de fragmentación, sobre todo cuando el archivo es muy grande tal como dice Eliax. Sin embargo el porcentaje total de fragmentación normalmente es tan bajo que si fuera windows el defragmentador lo consideraría "no fragmentado".

  • Excelente post !!
    y excelente también la analogía del operador telefónico.

    Felicitaciones

    Desde Chile ;)

  • Excelente post, estas cosas siempre son importantes saberlas. Exitos...

  • buen post, eliax deberias ser profesor, nunca lo has pensado?

    • Hola Joselito,

      Por algunos años enseñé en Boston University como asistente en varios cursos de computación avanzada, así como enseñé en mi escuela secundaria previo a eso en New York (matemáticas y geometría). Son quizás entre todas las cosas que he hecho las que mas me han llenado de satisfacción :) Lamentablemente el tiempo no me alcanza últimamente para enseñar de esa manera clásica, y quizás esa es una de las razones por la cual existe Eliax... :)

  • Hola Elias, muy buena explicacion, mas claro no pudo ser. Pero me surgieron algunas dudas y agradeceria mucho si pudieras despejarlas.

    Respecto a procesadores y su cache. Algunas especificaciones vienen asi:

    Q8200 - 2.3 Ghz 4Mb en cache L2

    ¿Que significa el "L2" (level 2)?

    ¿Que seria mejor, uno de 4Mb, 8Mb o 12Mb, y esa mejoria la puede notar el usuario?

    ¿Hay algun proceso o aplicacion en donde se note la ventaja del manejo del cache, ya sea procesador, disco duro o unidad optica?


    Gracias.

    • Miguel,

      Datos como L2, L3, etc, simplemente se refieren al nivel del cache en la cadena de caches.

      Es decir, el procesador internalmente tiene su propio cache, pero externo a este hay otro cache (el L2), y así sucesivamente, cada uno de mayor abstracción que el anterior.

      Es normal tener varios caches a varios niveles. Por ejemplo, Windows/Linux/OSX pueden tener un cache de los archivos que abriste recientemente, para así ni tener que ir al disco duro y consultar el cache de ese.

      Similarmmente, un CPU por lo general tiene un cache interno para las instrucciones mas básicas (por ejemplo, cuando repites una misma cosa muchas veces, eso por lo general genera las mismas instrucciones, que son cacheadas), pero así mismo (a veces con cooperación del sistema operativo) existen otros cache de mas alto nivel que no manejan instrucciones, sino que bloques enteros de código.

      Una razón por la cual esos cache L2 no se fusionan simplemente con el mismo chip es costo. Mientras mas grande es el área superficial de un chip mas caro es fabricarlos, razón por la cual muchos de estos "L2 Cache" son en realidad otro chip en el mismo paquete del CPU interconectados por lineas de alta velocidad.

      Y sí, usualmente mientras mas cache, mejor el rendimiento, aunque también depende mucho del tipo de aplicación que se ejecute.

  • Ayer les expliqué el concepto de un Cache, hoy les explicaré un concepto relacionado llamado un Buffer, y trataré una vez mas de utilizar ejemplos de la vida cotidiana para que entiendan el concepto.

    Así que empecemos hoy imaginándonos que trabajas en

  • Muy bueno elias. Sigue asi...COJE PA INTEC A DAR CLASES !!

  • Hola, aunque el articulo tiene mas de un año, quisiera si tienes un tiempo de explicar como manejan los servidores de aplicaciones los cache, en especifico Coldfusion.

    • En servidores de aplicaciones existen varios tipos de Cache, desde cache internos para optimizar llamadas de objetos, hasta caches de bases de datos, pasando por caches de páginas.

      Lo importante a entender es que los que mas te interesen en la mayoría de los casos on los caches de páginas y queries de SQL, y en ambos casos estos son manejados explícitamente por ti.

      Para ColdFusion consulta la documentación de CFQUERY y CFCACHE, dos etiquetas que utilizo con mucha frecuencia (son utilizadas por ejemplo acá mismo en el blog de eliax).

      Sin embargo ese es un tema sumamente extenso, por lo que para otras cosas te recomiendo un poco de Google.

Añadir Comentario

tu nombre
tu email
(opcional)
web personal
(opcional)
en respuesta a...
comentario de caracteres máximo
8 + 1 = requerido (control anti-SPAM)
 

"Mi mente va a estallar, esto es EXTRAORDINARIO!!!!!!!!!!"

por "Patricio" en jul 23, 2010


en camino a la singularidad...

©2005-2014 josé c. elías
todos los derechos reservados
como compartir los artículos de eliax