En informática , un caché ( / k æ ʃ / KASH)[1]es un componente de hardware o software que almacena datos para que las solicitudes futuras de esos datos puedan atenderse más rápido; los datos almacenados en un caché pueden ser el resultado de un cálculo anterior o una copia de datos almacenados en otro lugar. Unacierto de cachése produce cuando los datos solicitados se pueden encontrar en un caché, mientras que unapérdida de cachése produce cuando no es posible. Los aciertos de la caché se obtienen leyendo datos de la caché, lo que es más rápido que volver a calcular un resultado o leer desde un almacén de datos más lento; por lo tanto, cuantas más solicitudes se puedan atender desde la memoria caché, más rápido funcionará el sistema.[2]
Para que sean rentables, los cachés deben ser relativamente pequeños. Sin embargo, los cachés son eficaces en muchas áreas de la informática porque las aplicaciones informáticas típicas acceden a datos con un alto grado de localidad de referencia . Dichos patrones de acceso exhiben localidad temporal, donde se solicitan datos que se han solicitado recientemente, y localidad espacial, donde se solicitan datos que se almacenan cerca de datos que ya se han solicitado.
En el diseño de memoria, existe una compensación inherente entre capacidad y velocidad porque una mayor capacidad implica un mayor tamaño y, por lo tanto, mayores distancias físicas para que las señales viajen, lo que provoca retrasos en la propagación . También existe una compensación entre tecnologías de alto rendimiento como SRAM y productos más baratos y fáciles de producir en masa como DRAM , flash o discos duros .
El almacenamiento en búfer proporcionado por una caché beneficia la latencia y el rendimiento ( ancho de banda ) o ambos .
Un recurso mayor genera una latencia significativa para el acceso; por ejemplo, pueden ser necesarios cientos de ciclos de reloj para que un procesador moderno de 4 GHz llegue a la DRAM. Esto se mitiga leyendo grandes fragmentos en la memoria caché, con la esperanza de que las lecturas posteriores se realicen desde ubicaciones cercanas y puedan leerse desde la memoria caché. Se puede utilizar la predicción o la captación previa explícita para adivinar de dónde vendrán las lecturas futuras y realizar solicitudes con anticipación; si se hace de manera óptima, la latencia se evita por completo.
El uso de una caché también permite un mayor rendimiento del recurso subyacente, al ensamblar múltiples transferencias detalladas en solicitudes más grandes y eficientes. En el caso de circuitos DRAM, el rendimiento adicional se puede obtener utilizando un bus de datos más amplio.
El hardware implementa el caché como un bloque de memoria para el almacenamiento temporal de datos que probablemente se utilizarán nuevamente. Las unidades centrales de procesamiento (CPU), las unidades de estado sólido (SSD) y las unidades de disco duro (HDD) suelen incluir caché basada en hardware, mientras que los navegadores y servidores web suelen depender del almacenamiento en caché de software.
Una caché se compone de un conjunto de entradas. Cada entrada tiene datos asociados , que son una copia de los mismos datos en algún almacén de respaldo . Cada entrada también tiene una etiqueta , que especifica la identidad de los datos en el almacén de respaldo de los cuales la entrada es una copia.
Cuando el cliente de caché (una CPU, navegador web, sistema operativo ) necesita acceder a datos que se presume existen en el almacén de respaldo, primero verifica el caché. Si se puede encontrar una entrada con una etiqueta que coincida con la de los datos deseados, se utilizan los datos de la entrada. Esta situación se conoce como acierto de caché . Por ejemplo, un programa de navegador web podría verificar su caché local en el disco para ver si tiene una copia local del contenido de una página web en una URL particular . En este ejemplo, la URL es la etiqueta y el contenido de la página web son los datos. El porcentaje de accesos que resultan en aciertos de caché se conoce como tasa de aciertos o tasa de aciertos del caché.
La situación alternativa, cuando se verifica el caché y se descubre que no contiene ninguna entrada con la etiqueta deseada, se conoce como error de caché . Esto requiere un acceso más costoso a los datos del almacén de respaldo. Una vez que se recuperan los datos solicitados, normalmente se copian en la memoria caché, listos para el siguiente acceso.
Durante una pérdida de caché, normalmente se elimina alguna otra entrada de caché previamente existente para dejar espacio para los datos recién recuperados. La heurística utilizada para seleccionar la entrada a reemplazar se conoce como política de reemplazo . Una política de reemplazo popular, la utilizada menos recientemente (LRU), reemplaza la entrada más antigua, la entrada a la que se accedió menos recientemente que cualquier otra entrada. Los algoritmos de almacenamiento en caché más sofisticados también tienen en cuenta la frecuencia de uso de las entradas.
Cuando un sistema escribe datos en la memoria caché, en algún momento también debe escribir esos datos en el almacén de respaldo. El momento de esta escritura está controlado por lo que se conoce como política de escritura . Hay dos enfoques básicos de escritura: [3]
Una caché de reescritura es más compleja de implementar ya que necesita rastrear cuáles de sus ubicaciones se han sobrescrito y marcarlas como sucias para escribirlas más tarde en el almacén de respaldo. Los datos en estas ubicaciones se vuelven a escribir en el almacén de respaldo solo cuando se expulsan de la memoria caché, un proceso conocido como escritura diferida . Por esta razón, una pérdida de lectura en una caché de reescritura a menudo requerirá dos accesos al servicio del almacén de respaldo de memoria: uno para la reescritura y otro para recuperar los datos necesarios. Otras políticas también pueden desencadenar la reescritura de datos. El cliente puede realizar muchos cambios en los datos del caché y luego notificar explícitamente al caché que vuelva a escribir los datos.
Dado que no se devuelven datos al solicitante en las operaciones de escritura, se debe tomar una decisión si los datos se cargarán o no en la memoria caché en caso de errores de escritura.
Tanto las políticas de escritura directa como las de reescritura pueden utilizar cualquiera de estas políticas de escritura perdida, pero normalmente están emparejadas. [4] [5]
Otras entidades además del caché pueden cambiar los datos en el almacén de respaldo, en cuyo caso la copia en el caché puede quedar obsoleta o obsoleta . Alternativamente, cuando el cliente actualiza los datos en el caché, las copias de esos datos en otros cachés quedarán obsoletas. Los protocolos de comunicación entre los administradores de caché que mantienen la coherencia de los datos están asociados con la coherencia de la caché .
En caso de error de lectura de caché, los cachés con una política de paginación bajo demanda leen la cantidad mínima del almacén de respaldo. Una implementación típica de memoria virtual de paginación bajo demanda lee una página de memoria virtual (a menudo 4 KB) del disco al caché del disco en la RAM. Una CPU típica lee una única línea de caché L2 de 128 bytes de la DRAM a la caché L2, y una única línea de caché L1 de 64 bytes de la caché L2 a la caché L1.
Los cachés con una cola de entrada de captación previa o una política de paginación anticipada más general van más allá: no solo leen los datos solicitados, sino que adivinan que pronto se requerirán los siguientes fragmentos de datos, por lo que los capturan previamente en el caché con anticipación. La paginación anticipada es especialmente útil cuando el almacén de respaldo tiene una latencia larga para leer el primer fragmento y tiempos mucho más cortos para leer secuencialmente los siguientes fragmentos, como el almacenamiento en disco y la DRAM.
Algunos sistemas operativos van más allá con un cargador que siempre precarga todo el ejecutable en la RAM. Algunas cachés van aún más allá, no solo precargan un archivo completo, sino que también comienzan a cargar otros archivos relacionados que pronto pueden solicitarse, como la caché de página asociada con un captador previo o la caché web asociada con la captación previa de enlaces .
Las memorias pequeñas en la CPU o cerca de ella pueden funcionar más rápido que la memoria principal , mucho más grande . [6] La mayoría de las CPU desde la década de 1980 han utilizado uno o más cachés, a veces en niveles en cascada ; Los microprocesadores modernos integrados , de escritorio y de servidor de alta gama pueden tener hasta seis tipos de caché (entre niveles y funciones). [7] Algunos ejemplos de cachés con una función específica son D-cache , I-cache y el buffer de traducción para la unidad de administración de memoria (MMU).
Las unidades de procesamiento de gráficos (GPU) anteriores a menudo tenían cachés de texturas de solo lectura limitadas y usaban Swizzling (gráficos de computadora) para mejorar la localidad de referencia 2D . Los errores de caché afectarían drásticamente el rendimiento, por ejemplo, si no se utilizara mipmapping . El almacenamiento en caché era importante para aprovechar las transferencias de 32 bits (y más anchas) para datos de textura que a menudo eran tan solo de 4 bits por píxel.
A medida que las GPU avanzaron y soportaron la computación de propósito general en unidades de procesamiento de gráficos y núcleos de computación , desarrollaron cachés cada vez más grandes y cada vez más generales, incluidos cachés de instrucciones para sombreadores , que exhiben funcionalidades que se encuentran comúnmente en los cachés de CPU. Estos cachés han crecido para manejar primitivas de sincronización entre subprocesos y operaciones atómicas , y tienen interfaz con una MMU estilo CPU.
Los procesadores de señales digitales se han generalizado de manera similar a lo largo de los años. Los diseños anteriores usaban memoria scratchpad alimentada por acceso directo a la memoria , pero los DSP modernos como Qualcomm Hexagon a menudo incluyen un conjunto de cachés muy similar a una CPU (por ejemplo, arquitectura Harvard modificada con L2 compartida, caché I L1 dividida y caché D). [8]
Una unidad de administración de memoria (MMU) que recupera entradas de la tabla de páginas de la memoria principal tiene un caché especializado, que se utiliza para registrar los resultados de las traducciones de direcciones virtuales a direcciones físicas . Este caché especializado se denomina búfer de búsqueda de traducción (TLB). [9]
Las redes centradas en la información (ICN) son un enfoque para evolucionar la infraestructura de Internet desde un paradigma centrado en el host, basado en la conectividad perpetua y el principio de extremo a extremo , hacia una arquitectura de red en la que el punto focal es la información identificada (o contenido o datos). Debido a la capacidad de almacenamiento en caché inherente de los nodos en un ICN, se puede considerar como una red de cachés poco conectada, que tiene requisitos únicos de políticas de almacenamiento en caché. Sin embargo, el almacenamiento en caché ubicuo de contenido presenta el desafío de proteger el contenido contra el acceso no autorizado, lo que requiere cuidado y soluciones adicionales. [10]
A diferencia de los servidores proxy, en ICN la caché es una solución a nivel de red. Por lo tanto, tiene estados de caché que cambian rápidamente y tasas de llegada de solicitudes más altas; Además, los tamaños de caché más pequeños imponen un tipo diferente de requisitos en las políticas de desalojo de contenido. En particular, las políticas de desalojo para el ICN deberían ser rápidas y ligeras. Se han propuesto varios esquemas de replicación y desalojo de caché para diferentes arquitecturas y aplicaciones ICN.
El tiempo de uso menos reciente (TLRU) [11] es una variante de LRU diseñada para la situación en la que el contenido almacenado en la caché tiene una vida útil válida. El algoritmo es adecuado en aplicaciones de caché de red, como ICN, redes de entrega de contenido (CDN) y redes distribuidas en general. TLRU introduce un nuevo término: TTU (Tiempo de uso). TTU es una marca de tiempo de un contenido/página que estipula el tiempo de usabilidad del contenido en función de la localidad del contenido y el anuncio del editor del contenido. Debido a esta marca de tiempo basada en la localidad, TTU proporciona más control al administrador local para regular el almacenamiento en red.
En el algoritmo TLRU, cuando llega un contenido, un nodo de caché calcula el valor de TTU local en función del valor de TTU asignado por el editor de contenido. El valor TTU local se calcula utilizando una función definida localmente. Una vez que se calcula el valor de TTU local, la sustitución del contenido se realiza en un subconjunto del contenido total almacenado en el nodo de caché. La TLRU garantiza que el contenido menos popular y de menor importancia debe ser reemplazado por el contenido entrante.
El esquema de reemplazo de caché menos utilizado recientemente (LFRU) [12] combina los beneficios de los esquemas LFU y LRU. LFRU es adecuado para aplicaciones de caché 'en red', como ICN, CDN y redes distribuidas en general. En LFRU, el caché se divide en dos particiones llamadas particiones privilegiadas y no privilegiadas. La partición privilegiada se puede definir como una partición protegida. Si el contenido es muy popular, se envía a la partición privilegiada. El reemplazo de la partición privilegiada se realiza de la siguiente manera: LFRU desaloja el contenido de la partición sin privilegios, empuja el contenido de una partición privilegiada a una partición sin privilegios y, finalmente, inserta contenido nuevo en la partición privilegiada. En el procedimiento anterior, se utiliza la LRU para la partición privilegiada y se utiliza un esquema LFU aproximado (ALFU) para la partición sin privilegios, de ahí la abreviatura LFRU. La idea básica es filtrar los contenidos populares localmente con el esquema ALFU y enviar los contenidos populares a una de las particiones privilegiadas.
En 2011, el uso de teléfonos inteligentes con opciones de pronóstico del tiempo estaba sobrecargando a los servidores AccuWeather ; dos solicitudes dentro del mismo parque generarían solicitudes separadas. Una optimización realizada por los servidores perimetrales para truncar las coordenadas GPS a menos decimales significó que se utilizarían los resultados almacenados en caché de la consulta anterior. El número de búsquedas al servidor por día se redujo a la mitad. [13]
Si bien los cachés de la CPU generalmente se administran completamente mediante hardware, una variedad de software administra otros cachés. La caché de páginas en la memoria principal, que es un ejemplo de caché de disco, es administrada por el kernel del sistema operativo .
Si bien el búfer de disco , que es una parte integrada de la unidad de disco duro o de la unidad de estado sólido, a veces se denomina engañosamente "caché de disco", sus funciones principales son la secuenciación de escritura y la captación previa de lectura. Los accesos repetidos a la caché son relativamente raros, debido al pequeño tamaño del búfer en comparación con la capacidad de la unidad. Sin embargo, los controladores de disco de alta gama suelen tener su propia caché integrada de los bloques de datos de la unidad de disco duro.
Finalmente, una unidad de disco duro local rápida también puede almacenar en caché información contenida en dispositivos de almacenamiento de datos aún más lentos, como servidores remotos (caché web) o unidades de cinta locales o máquinas de discos ópticas ; dicho esquema es el concepto principal de la gestión de almacenamiento jerárquico . Además, las unidades de estado sólido (SSD) basadas en flash rápido se pueden utilizar como cachés para unidades de disco duro de medios rotativos más lentos, trabajando juntas como unidades híbridas o unidades híbridas de estado sólido (SSHD).
Los navegadores web y los servidores proxy web emplean cachés web para almacenar respuestas anteriores de los servidores web, como páginas web e imágenes . Los cachés web reducen la cantidad de información que debe transmitirse a través de la red, ya que la información previamente almacenada en el caché a menudo puede reutilizarse. Esto reduce el ancho de banda y los requisitos de procesamiento del servidor web y ayuda a mejorar la capacidad de respuesta para los usuarios de la web. [14]
Los navegadores web emplean un caché web incorporado, pero algunos proveedores de servicios de Internet (ISP) u organizaciones también usan un servidor proxy de almacenamiento en caché, que es un caché web que se comparte entre todos los usuarios de esa red.
Otra forma de caché es el almacenamiento en caché P2P , donde los archivos más buscados por las aplicaciones peer-to-peer se almacenan en la caché de un ISP para acelerar las transferencias P2P. Del mismo modo, existen equivalentes descentralizados que permiten a las comunidades realizar la misma tarea para el tráfico P2P, por ejemplo, Corelli. [15]
Una caché puede almacenar datos que se calculan según demanda en lugar de recuperarse de un almacén de respaldo. La memorización es una técnica de optimización que almacena los resultados de las llamadas a funciones que consumen recursos dentro de una tabla de búsqueda, lo que permite que las llamadas posteriores reutilicen los resultados almacenados y eviten cálculos repetidos. Está relacionado con la metodología de diseño de algoritmos de programación dinámica , que también puede considerarse como un medio de almacenamiento en caché.
Una red de entrega de contenido (CDN) es una red de servidores distribuidos que entregan páginas y otro contenido web a un usuario, según las ubicaciones geográficas del usuario, el origen de la página web y el servidor de entrega de contenido.
Las CDN comenzaron a finales de la década de 1990 como una forma de acelerar la entrega de contenido estático, como páginas HTML, imágenes y vídeos. Al replicar contenido en múltiples servidores alrededor del mundo y entregarlo a los usuarios según su ubicación, las CDN pueden mejorar significativamente la velocidad y disponibilidad de un sitio web o aplicación. Cuando un usuario solicita un contenido, la CDN comprobará si tiene una copia del contenido en su caché. Si es así, la CDN entregará el contenido al usuario desde la memoria caché. [16]
Una puerta de enlace de almacenamiento en la nube, también conocida como archivador perimetral, es un dispositivo de almacenamiento en la nube híbrido que conecta una red local a uno o más servicios de almacenamiento en la nube , generalmente servicios de almacenamiento de objetos como Amazon S3 . Proporciona un caché para los datos a los que se accede con frecuencia, proporcionando acceso local de alta velocidad a los datos a los que se accede con frecuencia en el servicio de almacenamiento en la nube. Las puertas de enlace de almacenamiento en la nube también brindan beneficios adicionales, como el acceso al almacenamiento de objetos en la nube a través de protocolos tradicionales de servicio de archivos, así como el acceso continuo a los datos almacenados en caché durante las interrupciones de la conectividad. [17]
El demonio BIND DNS almacena en caché una asignación de nombres de dominio a direcciones IP , al igual que una biblioteca de resolución.
La operación de escritura directa es común cuando se opera en redes no confiables (como una LAN Ethernet), debido a la enorme complejidad del protocolo de coherencia requerido entre múltiples cachés de escritura diferida cuando la comunicación no es confiable. Por ejemplo, las cachés de páginas web y las cachés de sistemas de archivos de red del lado del cliente (como las de NFS o SMB ) suelen ser de solo lectura o escritura directa específicamente para mantener el protocolo de red simple y confiable.
Los motores de búsqueda también suelen hacer que las páginas web que han indexado estén disponibles en su caché. Por ejemplo, Google proporciona un enlace "En caché" junto a cada resultado de búsqueda. Esto puede resultar útil cuando las páginas web de un servidor web son inaccesibles temporal o permanentemente.
El almacenamiento en caché de bases de datos puede mejorar sustancialmente el rendimiento de las aplicaciones de bases de datos , por ejemplo en el procesamiento de índices , diccionarios de datos y subconjuntos de datos de uso frecuente.
Un caché distribuido [18] utiliza hosts en red para proporcionar escalabilidad, confiabilidad y rendimiento a la aplicación. [19] Los anfitriones pueden estar ubicados conjuntamente o distribuidos en diferentes regiones geográficas.
La semántica de un "búfer" y un "caché" no son totalmente diferentes; aun así, existen diferencias fundamentales en la intención entre el proceso de almacenamiento en caché y el proceso de almacenamiento en búfer.
Fundamentalmente, el almacenamiento en caché logra un aumento del rendimiento en las transferencias de datos que se transfieren repetidamente. Si bien un sistema de almacenamiento en caché puede lograr un aumento de rendimiento tras la transferencia inicial (normalmente de escritura) de un elemento de datos, este aumento de rendimiento se debe al almacenamiento en búfer que se produce dentro del sistema de almacenamiento en caché.
Con las cachés de lectura, un elemento de datos debe haber sido recuperado de su ubicación de residencia al menos una vez para que las lecturas posteriores del elemento de datos logren un aumento en el rendimiento al poder recuperarse del almacenamiento intermedio (más rápido) de la caché en lugar de la ubicación de residencia de los datos. Con las memorias caché de escritura, se puede lograr un aumento del rendimiento de la escritura de un elemento de datos en la primera escritura del elemento de datos en virtud de que el elemento de datos se almacena inmediatamente en el almacenamiento intermedio de la memoria caché, aplazando la transferencia del elemento de datos a su almacenamiento residente en una etapa posterior o bien ocurre como un proceso en segundo plano. A diferencia del almacenamiento en búfer estricto, un proceso de almacenamiento en caché debe cumplir con un protocolo de coherencia de caché (potencialmente distribuido) para mantener la coherencia entre el almacenamiento intermedio de la caché y la ubicación donde residen los datos. El almacenamiento en búfer, por otro lado,
Con las implementaciones típicas de almacenamiento en caché, un elemento de datos que se lee o escribe por primera vez se almacena efectivamente en el búfer; y en el caso de una escritura, principalmente lograr un aumento en el rendimiento de la aplicación desde donde se originó la escritura. Además, la parte de un protocolo de almacenamiento en caché en la que las escrituras individuales se difieren a un lote de escrituras es una forma de almacenamiento en búfer. La parte de un protocolo de almacenamiento en caché donde las lecturas individuales se difieren a un lote de lecturas también es una forma de almacenamiento en búfer, aunque esta forma puede afectar negativamente el rendimiento de al menos las lecturas iniciales (aunque puede afectar positivamente el rendimiento de la suma de el individuo lee). En la práctica, el almacenamiento en caché casi siempre implica algún tipo de almacenamiento en búfer, mientras que el almacenamiento en búfer estricto no implica almacenamiento en caché.
Un búfer es una ubicación de memoria temporal que se utiliza tradicionalmente porque las instrucciones de la CPU no pueden abordar directamente los datos almacenados en dispositivos periféricos. Por tanto, la memoria direccionable se utiliza como etapa intermedia. Además, un buffer de este tipo puede ser factible cuando se ensambla o desensambla un gran bloque de datos (según lo requiera un dispositivo de almacenamiento), o cuando los datos pueden entregarse en un orden diferente al que se produjeron. Además, generalmente se transfiere secuencialmente un búfer completo de datos (por ejemplo, al disco duro), por lo que el almacenamiento en búfer a veces aumenta el rendimiento de la transferencia o reduce la variación o la fluctuación de la latencia de la transferencia, a diferencia del almacenamiento en caché, donde la intención es reducir la latencia. Estos beneficios están presentes incluso si los datos almacenados en el búfer se escriben en el búfer una vez y se leen del búfer una vez.
Un caché también aumenta el rendimiento de la transferencia. Una parte del aumento también proviene de la posibilidad de que múltiples transferencias pequeñas se combinen en un gran bloque. Pero la principal ganancia de rendimiento se produce porque existe una buena probabilidad de que los mismos datos se lean varias veces desde la memoria caché, o que pronto se lean los datos escritos. El único propósito de una caché es reducir los accesos al almacenamiento subyacente más lento. La caché también suele ser una capa de abstracción diseñada para ser invisible desde la perspectiva de las capas vecinas.
Entre 300 y 500 millones de solicitudes menos al día manejadas por los servidores de AccuWeather