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 de finalizar el proceso que las creó o modificó por última vez. [1]
A menudo confundida con la memoria de acceso aleatorio no volátil (NVRAM), la memoria persistente está más estrechamente vinculada al concepto de persistencia en su é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 no confiable utilizado en la computadora que ejecuta el programa. .)
El acceso eficiente, similar a la memoria, es la característica definitoria de la memoria persistente. [2] Se puede proporcionar mediante instrucciones de la memoria del microprocesador , como cargar y almacenar. También se puede proporcionar mediante API que implementan acciones de acceso remoto directo a memoria (RDMA), como lectura y escritura de RDMA. Otros métodos de baja latencia que permiten el acceso byte-grain [ se necesita aclaración ] a los datos también califican.
Las capacidades de la memoria persistente se extienden más allá de la no volatilidad de los bits almacenados. Por ejemplo, la pérdida de metadatos clave, como entradas de tablas de páginas u otras construcciones que traducen direcciones virtuales en direcciones físicas, puede hacer que los bits duraderos no sean persistentes. En este sentido, la memoria persistente se parece 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 puede usarse para asociar nombres o identificadores con extensiones almacenadas y, como mínimo, proporcionan métodos de sistema de archivos que pueden usarse para nombrar y asignar dichas extensiones.
El problema de lectura de escritura no persistente se encuentra en programas sin bloqueo 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 un observador de fallas pueda observar los datos modificados en la memoria persistente. . Si se produce 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, se puede generar una variable de datos que se modifica mediante una operación de comparación e intercambio. visible para un observador concurrente antes que un observador del accidente, causando posibles inconsistencias en el accidente.
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 es persistió. Luego, el productor inserta otro nodo thread B
después node A
, ya que CAS node A
ya es visible para todos los subprocesos simultáneos. CAS cambia atómicamente el next
puntero de node A
para que apunte a node B
y este CAS persiste. Si ocurre un corte de energía en este punto, la aplicación que usa la lista vinculada quedaría en un estado inconsistente, con ambos node A
y node B
se perdería, ya que el next
puntero del head
nodo a node A
no ha persistido. Como node B
se publicó pero no se puede acceder a ellos después de reiniciar, y es posible que se hayan conservado otros datos a los que se accede a través de , o que dependen de él 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 de escritura no persistente no se limita a las listas enlazadas sin bloqueo, sino que se puede encontrar en cualquier estructura de datos sin bloqueo donde 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]