En informática , un caché ( / k æ ʃ / KASH)[1]es un componente de hardware o software que almacena datos para que las futuras solicitudes de esos datos puedan ser atendidas más rápidamente; 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éocurre cuando los datos solicitados se pueden encontrar en un caché, mientras que unerror de cachéocurre cuando no se pueden encontrar. Los aciertos de caché se atienden leyendo datos del 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 el 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 los datos con un alto grado de localidad de referencia . Estos patrones de acceso presentan localidad temporal, donde se solicitan datos que se han solicitado recientemente, y localidad espacial, donde se solicitan datos que están almacenados cerca de datos que ya se han solicitado.
En el diseño de memorias, existe una disyuntiva inherente entre capacidad y velocidad, ya que 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 disyuntiva entre tecnologías de alto rendimiento como la SRAM y productos más baratos y fáciles de producir en masa como la DRAM , la memoria flash o los discos duros .
El almacenamiento en búfer proporcionado por un caché beneficia tanto la latencia como el rendimiento ( ancho de banda ).
Un recurso más grande genera una latencia significativa para el acceso; por ejemplo, un procesador moderno de 4 GHz puede tardar cientos de ciclos de reloj en llegar a la memoria DRAM. Esto se mitiga leyendo fragmentos grandes en la memoria caché, con la esperanza de que las lecturas posteriores provengan de ubicaciones cercanas y puedan leerse desde la memoria caché. Se puede utilizar la predicción o la precarga explícita para adivinar de dónde provendrá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 memoria caché también permite un mayor rendimiento del recurso subyacente, al reunir múltiples transferencias de grano fino en solicitudes más grandes y eficientes. En el caso de los circuitos DRAM, el rendimiento adicional se puede obtener utilizando un bus de datos más amplio.
El hardware implementa la caché como un bloque de memoria para el almacenamiento temporal de datos que probablemente se volverán a utilizar. Las unidades centrales de procesamiento (CPU), las unidades de estado sólido (SSD) y las unidades de disco duro (HDD) suelen incluir una 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 del que la entrada es una copia.
Cuando el cliente de caché (una CPU, un navegador web, un sistema operativo ) necesita acceder a datos que se presume que existen en el almacenamiento 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 en su lugar. Esta situación se conoce como acierto de caché . Por ejemplo, un programa de navegador web puede verificar su caché local en el disco para ver si tiene una copia local del contenido de una página web en una URL en 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 proporción de aciertos de la caché.
La situación alternativa, cuando se comprueba la memoria caché y se descubre que no hay ninguna entrada con la etiqueta deseada, se conoce como error de caché . Esto requiere un acceso más costoso a los datos de la memoria de respaldo. Una vez que se recuperan los datos solicitados, normalmente se copian en la memoria caché, listos para el siguiente acceso.
Durante una falla de caché, normalmente se elimina alguna otra entrada de caché existente previamente para dejar lugar para los datos recién recuperados. La heurística utilizada para seleccionar la entrada que se va a reemplazar se conoce como política de reemplazo . Una política de reemplazo popular, la de uso menos reciente (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 la memoria de respaldo. El momento de esta escritura está controlado por lo que se conoce como política de escritura . Existen dos enfoques básicos de escritura: [3]
Una caché de escritura diferida es más compleja de implementar, ya que necesita rastrear cuáles de sus ubicaciones han sido sobreescritas y marcarlas como sucias para escribirlas más tarde en el almacenamiento de respaldo. Los datos en estas ubicaciones se vuelven a escribir en el almacenamiento de respaldo solo cuando se los expulsa del caché, un proceso conocido como escritura diferida . Por este motivo, un error de lectura en una caché de escritura diferida a menudo requerirá dos accesos al almacenamiento de respaldo de memoria para su servicio: uno para la escritura diferida y otro para recuperar los datos necesarios. Otras políticas también pueden activar la escritura diferida de datos. El cliente puede realizar muchos cambios en los datos en la caché y luego notificar explícitamente a la 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 sobre si se cargarán o no los datos en la memoria caché en caso de errores de escritura.
Tanto las políticas de escritura simultánea como las de escritura diferida pueden utilizar cualquiera de estas políticas de escritura fallida, pero normalmente están emparejadas. [4] [5]
Otras entidades distintas de la caché pueden cambiar los datos en el almacenamiento de respaldo, en cuyo caso la copia en la caché puede quedar desactualizada o obsoleta . Alternativamente, cuando el cliente actualiza los datos en la caché, las copias de esos datos en otras cachés se vuelven 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 caché .
En caso de error de lectura de caché, las cachés con una política de paginación a demanda leen la cantidad mínima de la memoria de respaldo. Una implementación típica de memoria virtual con paginación a demanda lee una página de memoria virtual (a menudo, 4 KB) desde el disco hacia la caché de disco en la RAM. Una CPU típica lee una sola línea de caché L2 de 128 bytes desde la DRAM hacia la caché L2, y una sola línea de caché L1 de 64 bytes desde la caché L2 hacia la caché L1.
Las cachés con una cola de entrada de precarga o una política de paginación anticipatoria más general van más allá: no solo leen los datos solicitados, sino que suponen que pronto se necesitarán el siguiente fragmento o dos de datos y, por lo tanto, cargan esos datos en la caché con anticipación. La paginación anticipatoria es especialmente útil cuando el almacenamiento 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 carga previamente todo el ejecutable en la RAM. Algunos cachés van incluso más allá, no solo precargando un archivo completo, sino que también comienzan a cargar otros archivos relacionados que pueden solicitarse pronto, como el caché de página asociado con un prefetcher o el caché web asociado con la precarga de enlaces .
Las memorias pequeñas en o cerca de la CPU pueden operar 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 integrados , de escritorio y de servidor de alta gama modernos pueden tener hasta seis tipos de caché (entre niveles y funciones). [7] Algunos ejemplos de cachés con una función específica son el D-cache , el I-cache y el búfer de búsqueda de traducción para la unidad de administración de memoria (MMU).
Las unidades de procesamiento gráfico (GPU) anteriores solían tener cachés de texturas de solo lectura limitados y utilizaban el swizzling para mejorar la localidad de referencia 2D . Los errores de caché afectarían drásticamente el rendimiento, por ejemplo, si no se utilizaba el mapeo mip . El almacenamiento en caché era importante para aprovechar las transferencias de 32 bits (y más) para los datos de textura que a menudo eran tan pequeños como 4 bits por píxel.
A medida que las GPU fueron avanzando y admitieron la computación de propósito general en unidades de procesamiento gráfico y núcleos de cómputo , desarrollaron cachés cada vez más grandes y generales, incluidos cachés de instrucciones para sombreadores , que exhiben una funcionalidad que se encuentra 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 , e interactuar con una MMU de 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 de borrador alimentada por acceso directo a memoria , pero los DSP modernos como Qualcomm Hexagon a menudo incluyen un conjunto de cachés muy similar a una CPU (por ejemplo, la arquitectura Harvard modificada con L2 compartida, caché I L1 dividida y caché D). [8]
Una unidad de gestión de memoria (MMU) que recupera las entradas de la tabla de páginas de la memoria principal tiene una caché especializada, que se utiliza para registrar los resultados de las traducciones de direcciones virtuales a direcciones físicas . Esta caché especializada se denomina búfer de traducción indirecta (TLB). [9]
La red centrada en la información (ICN) es un enfoque para hacer 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. Debido a la capacidad inherente de almacenamiento en caché de los nodos en una ICN, se puede ver como una red de cachés débilmente conectada, que tiene requisitos únicos para las políticas de almacenamiento en caché. Sin embargo, el almacenamiento en caché de contenido ubicuo introduce el desafío de la protección del contenido contra el acceso no autorizado, lo que requiere un cuidado y soluciones adicionales. [10]
A diferencia de los servidores proxy, en ICN la memoria 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 diferentes requisitos en las políticas de expulsión de contenido. En particular, las políticas de expulsión para ICN deben ser rápidas y livianas. Se han propuesto varios esquemas de replicación y expulsión de caché para diferentes arquitecturas y aplicaciones de ICN. [ cita requerida ]
El algoritmo TLRU (Time Conscious Less Recently Used) es una variante de LRU diseñada para situaciones en las que los contenidos almacenados en caché tienen un tiempo de vida válido. El algoritmo es adecuado para aplicaciones de caché de red, como ICN, redes de distribución de contenido (CDN) y redes distribuidas en general. TLRU introduce un nuevo término: tiempo de uso (TTU). TTU es una marca de tiempo en el contenido que estipula el tiempo de usabilidad del contenido en función de la localidad del contenido y la información 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 fragmento de 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 de TTU local se calcula utilizando una función definida localmente. Una vez calculado el valor de TTU local, se realiza el reemplazo de contenido en un subconjunto del contenido total almacenado en el nodo de caché. El TLRU garantiza que el contenido menos popular y de corta duración se reemplace con el contenido entrante. [11]
El esquema de reemplazo de caché de Uso Recientemente Menos Frecuente (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, la 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 inserta en la partición privilegiada. El reemplazo de la partición privilegiada se realiza de la siguiente manera: LFRU expulsa el contenido de la partición no privilegiada, inserta el contenido de la partición privilegiada a la partición no privilegiada y, finalmente, inserta contenido nuevo en la partición privilegiada. En el procedimiento anterior, se utiliza LRU para la partición privilegiada y un esquema LFU aproximado (ALFU) para la partición no privilegiada, de ahí la abreviatura LFRU. La idea básica es filtrar los contenidos populares localmente con el esquema ALFU y empujar 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 los servidores de AccuWeather ; dos solicitudes dentro del mismo parque generaban solicitudes separadas. Una optimización de los servidores de borde 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 en el servidor por día se redujo a la mitad. [13]
Si bien las cachés de CPU generalmente son administradas en su totalidad por hardware, una variedad de software administra otras cachés. La caché de páginas en la memoria principal, que es un ejemplo de caché de disco, es administrada por el núcleo del sistema operativo .
Aunque 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 de forma engañosa "caché de disco", sus principales funciones son la secuenciación de escritura y la precarga de lectura. Los aciertos repetidos en la memoria caché son relativamente poco frecuentes, 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 memoria caché integrada de los bloques de datos de la unidad de disco duro.
Por último, una unidad de disco duro local rápida también puede almacenar en caché información almacenada 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 ópticos ; este esquema es el concepto principal de la gestión jerárquica del almacenamiento . Además, las unidades de estado sólido (SSD) rápidas basadas en flash se pueden utilizar como cachés para unidades de disco duro de medios rotativos más lentas, 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 servidores web, como páginas web e imágenes . Los cachés web reducen la cantidad de información que se debe transmitir a través de la red, ya que la información almacenada previamente en el caché a menudo se puede reutilizar. 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 integrado, pero algunos proveedores de servicios de Internet (ISP) u organizaciones también utilizan 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 , en el que los archivos más buscados por las aplicaciones peer to peer se almacenan en la caché de un ISP para acelerar las transferencias P2P. De manera similar, existen equivalentes descentralizados que permiten a las comunidades realizar la misma tarea para el tráfico P2P, por ejemplo, Corelli. [15]
Una memoria caché puede almacenar datos que se calculan a pedido en lugar de recuperarse de un almacenamiento 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á relacionada 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 distribución de contenido (CDN) es una red de servidores distribuidos que entregan páginas y otro contenido web a un usuario, según la ubicación geográfica del usuario, el origen de la página web y el servidor de distribución de contenido.
Las CDN comenzaron a utilizarse a fines de la década de 1990 como una forma de acelerar la entrega de contenido estático, como páginas HTML, imágenes y videos. Al replicar el contenido en varios servidores en todo el mundo y entregarlo a los usuarios según su ubicación, las CDN pueden mejorar significativamente la velocidad y la disponibilidad de un sitio web o una aplicación. Cuando un usuario solicita un fragmento de contenido, la CDN verificará si tiene una copia del contenido en su caché. Si la tiene, la CDN entregará el contenido al usuario desde el caché. [16]
Una puerta de enlace de almacenamiento en la nube, también conocida como archivador de borde, 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 , normalmente servicios de almacenamiento de objetos como Amazon S3 . Proporciona un caché para datos a los que se accede con frecuencia, lo que proporciona 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 proporcionan beneficios adicionales, como el acceso al almacenamiento de objetos en la nube a través de protocolos de servicio de archivos tradicionales, así como el acceso continuo a los datos almacenados en caché durante las interrupciones de la conectividad. [17]
El demonio DNS BIND almacena en caché una asignación de nombres de dominio a direcciones IP , al igual que lo hace una biblioteca de resolución.
La operación de escritura simultánea 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 simultánea cuando la comunicación no es confiable. Por ejemplo, los cachés de páginas web y los cachés de sistemas de archivos de red del lado del cliente (como los de NFS o SMB ) suelen ser de solo lectura o de escritura simultánea específicamente para mantener el protocolo de red simple y confiable.
Los motores de búsqueda también suelen poner a disposición las páginas web que han indexado desde 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 temporal o permanentemente inaccesibles.
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 utilizados con frecuencia.
Un caché distribuido [18] utiliza hosts en red para brindar escalabilidad, confiabilidad y rendimiento a la aplicación. [19] Los hosts pueden estar ubicados en el mismo lugar o distribuidos en diferentes regiones geográficas.
La semántica de un "buffer" y un "caché" no es totalmente diferente; aun así, existen diferencias fundamentales en la intención entre el proceso de almacenamiento en caché y el proceso de almacenamiento en búfer.
Básicamente, el almacenamiento en caché permite aumentar el rendimiento de las transferencias de datos que se transfieren repetidamente. Si bien un sistema de almacenamiento en caché puede lograr un aumento del rendimiento en la transferencia inicial (normalmente de escritura) de un elemento de datos, este aumento del rendimiento se debe al almacenamiento en búfer que se produce dentro del sistema de almacenamiento en caché.
Con los cachés de lectura, un elemento de datos debe haber sido obtenido de su ubicación de residencia al menos una vez para que las lecturas posteriores del elemento de datos logren un aumento de rendimiento en virtud de poder obtenerse del almacenamiento intermedio (más rápido) del caché en lugar de la ubicación de residencia de los datos. Con los cachés de escritura, se puede lograr un aumento de 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 del caché, aplazando la transferencia del elemento de datos a su almacenamiento residente en una etapa posterior o bien ocurriendo como un proceso en segundo plano. A diferencia del almacenamiento en búfer estricto, un proceso de almacenamiento en caché debe adherirse a un protocolo de coherencia de caché (potencialmente distribuido) para mantener la coherencia entre el almacenamiento intermedio del caché y la ubicación donde residen los datos. El almacenamiento en búfer, por otro lado,
En las implementaciones típicas de almacenamiento en caché, un elemento de datos que se lee o escribe por primera vez se almacena en búfer de manera efectiva y, en el caso de una escritura, en la mayoría de los casos se logra un aumento del rendimiento de la aplicación desde donde se originó la escritura. Además, la parte de un protocolo de almacenamiento en caché donde las escrituras individuales se posponen 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 posponen 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 las lecturas individuales). En la práctica, el almacenamiento en caché casi siempre implica alguna forma de almacenamiento en búfer, mientras que el almacenamiento en búfer estricto no implica almacenamiento en caché.
Un buffer es una ubicación de memoria temporal que se utiliza tradicionalmente porque las instrucciones de la CPU no pueden direccionar directamente los datos almacenados en dispositivos periféricos. Por lo tanto, la memoria direccionable se utiliza como una 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 de su producción. Además, un buffer completo de datos suele transferirse secuencialmente (por ejemplo, al disco duro), por lo que el almacenamiento en buffer en sí mismo a veces aumenta el rendimiento de la transferencia o reduce la variación o 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 buffer se escriben en el buffer una vez y se leen desde el buffer una vez.
Una memoria caché también aumenta el rendimiento de las transferencias. Una parte de este aumento se debe a la posibilidad de que varias transferencias pequeñas se combinen en un bloque grande. Pero la principal mejora del rendimiento se produce porque hay muchas posibilidades de que los mismos datos se lean de la memoria caché varias veces o de que se lean pronto los datos escritos. El único propósito de una memoria caché es reducir los accesos al almacenamiento subyacente más lento. La memoria 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 gestionadas por los servidores de AccuWeather