En informática , la memoria persistente es cualquier método o aparato para almacenar eficientemente estructuras de datos de modo que se pueda seguir accediendo a ellas mediante instrucciones de memoria o API de memoria incluso después del final del proceso que las creó o las modificó por última vez. [1]
La memoria persistente, que suele confundirse con la memoria de acceso aleatorio no volátil (NVRAM), está más estrechamente vinculada al concepto de persistencia, ya que pone énfasis en el estado del programa que existe fuera de la zona de falla del proceso que lo creó. (Un proceso es un programa en ejecución. La zona de falla de un proceso es ese subconjunto del estado del programa que podría corromperse si el proceso continúa ejecutándose después de incurrir en una falla, por ejemplo, debido a un componente poco confiable utilizado en la computadora que ejecuta el programa).
El acceso eficiente, similar al de la memoria, es la característica definitoria de la memoria persistente. [2] Se puede proporcionar mediante instrucciones de memoria de microprocesador , como cargar y almacenar. También se puede proporcionar mediante API que implementan acciones de acceso directo a memoria remota (RDMA), como lectura RDMA y escritura RDMA. También califican otros métodos de baja latencia que permiten el acceso a los datos en bytes [ aclaración necesaria ] .
Las capacidades de la memoria persistente van más allá de la no volatilidad de los bits almacenados. Por ejemplo, la pérdida de metadatos clave, como las entradas de la tabla de páginas u otras construcciones que traducen direcciones virtuales a direcciones físicas, puede hacer que los bits duraderos no sean persistentes. En este sentido, la memoria persistente se asemeja a formas más abstractas de almacenamiento informático, como los sistemas de archivos . De hecho, casi todas las tecnologías de memoria persistente existentes implementan al menos un sistema de archivos básico que se puede utilizar para asociar nombres o identificadores con extensiones almacenadas y, como mínimo, proporcionan métodos de sistema de archivos que se pueden utilizar para nombrar y asignar dichas extensiones.
El problema de lectura de escritura no persistente se encuentra en programas sin bloqueos en memoria persistente. Como las operaciones de comparación e intercambio (CAS) no conservan los valores escritos en la memoria persistente, los datos modificados pueden hacerse visibles mediante el protocolo de coherencia de caché para un observador concurrente antes de que los datos modificados puedan ser observados por un observador de fallas en la memoria persistente. Si ocurre un corte de energía justo después de que la escritura se haga visible pero aún no sea persistente, puede ocurrir el problema de lectura de escritura no persistente, es decir, una variable de datos que se modifica mediante una operación de comparación e intercambio puede hacerse visible para un observador concurrente antes que para un observador de fallas, lo que causa posibles inconsistencias de fallas.
Para ilustrar el problema: para una lista libre de bloqueos enlazada individualmente, un productor puede insertar un nodo thread A
después del head
nodo, el next
puntero del nodo principal se cambia atómicamente (CAS) para apuntar al nuevo node A
, sin embargo, este CAS no se conserva. Luego, otro nodo se inserta por el productor thread B
después de node A
, ya que el CAS para node A
ya es visible para todos los subprocesos concurrentes. CAS cambia atómicamente el next
puntero de node A
a para que apunte a node B
, y este CAS se conserva. Si ocurre un corte de energía en este punto, la aplicación que usa la lista enlazada quedaría en un estado inconsistente, con ambos node A
y node B
perdidos, ya que el next
puntero del head
nodo a node A
no se ha conservado. Como node B
se ha publicado pero no se puede acceder después de un reinicio, y es posible que se hayan conservado otros datos a los que se accede a través de o que dependen de node B
, todos los accesos posteriores a dichos datos no serán posibles, lo que provocará la pérdida de datos. [3]
El problema de lectura o escritura no persistente no se limita a las listas enlazadas sin bloqueos, sino que puede encontrarse en cualquier estructura de datos sin bloqueos en la que pueda existir una brecha potencial entre la visibilidad concurrente y la visibilidad persistente. Por ejemplo, puede ocurrir un problema similar con los buffers circulares persistentes . [4]