Innen informatikk er et **vedvarende minne** en hvilken som helst metode eller apparat for effektiv lagring av datastrukturer slik at de fortsatt kan nås ved hjelp av minneinstruksjoner eller minne-API-er selv etter at prosessen som opprettet eller sist endret dem er avsluttet.

Sammenlignet med ikke-flyktig minne
-----------------------------------

Bedvarende minne må ikke (fysisk og logisk[*klargjør*]) forveksles med ikke-flyktig tilfeldig tilgangsminne (NVRAM). Hvorvidt et minne er vedvarende er nærmere knyttet til begrepet bestandighet som beror på om programtilstander eksisterer utenfor feilsonen til prosessen som skapte den.

* En prosess er her definert som et program under utførelse
* Feilsonen til en prosess er delmengden av programtilstanden som kan bli korrupt på grunn av at prosessen fortsetter å utføres etter å ha pådratt seg en feil, eksempelvis på grunn av en upålitelig komponent brukt i datamaskinen som kjører programmet

Effektiv, minnelignende[*klargjør*] tilgang er den definerende egenskapen til vedvarende minne. Det kan oppnås ved hjelp av mikroprosessor-minneinstruksjoner, som for eksempel lasting og lagring. Det kan også oppnås ved hjelp av API-er som implementerer ekstern direkte minnetilgang (*remote direct memory access*, RDMA), som for eksempel RDMA-lesing og RDMA-skriving. Andre metoder med lav latens som tillater tilgang til data på byte-nivå kan også karakteriseres som vedarende minne.

Kapabiliteter for vedvarende minne strekker seg utover ikke-volatilitet for lagrede biter. For eksempel kan tap av viktige metadata, som for eksempel sidetabelloppføringer eller andre konstruksjoner som oversetter virtuelle adresser til fysiske adresser, gjøre at ikke-volatile biter også er ikke-varige. I denne forbindelse ligner vedvarende minne mer på abstrakte former for datalagring, slik som filsystemer. 

Faktisk implementerer nesten alle eksisterende varige minneteknologier minst et grunnleggende filsystem som kan brukes til å assosiere navn eller identifikatorer med lagrede utvidelser, og gir som et minimum filsystemmetoder som kan brukes for å navngi og allokere slike utvidelser.

Problemet med lesing av ikke-vedvarende skriving
------------------------------------------------

Lesing av ikke-vedvarende skriving (*read-of-non-persistent-write problem*) er et problem for blokkeringsfrie programmer som jobber med vedvarende minne. Ettersom sammenlign-og-bytt (*compare-and-swap*, CAS) -operasjoner ikke vedvarer de skrevne verdiene til vedvarende minne kan de modifiserte dataene synliggjøres av hurtigminne-koherensprotokollen til en samtidig observatør før de modifiserte dataene kan observeres av en krasjobservatør i det varige minnet. Dersom det oppstår strømbrudd rett etter at skrivingen er synliggjort, men ikke er gjort vedvarende ennå, så kan problemet med «lesing av ikke-vedvarende skriving» oppstå, altså at en datavariabel som er modifisert av en sammenlign-og-bytt-operasjon kan synliggjøres for en samtidig observatør før en krasjobservatør, hvilket forårsaker potensielle uoverensstemmelser etter krasjet.

For å illustrere problemet kan man ta utgangspunkt i en enkeltlenket blokkeringsfri liste. Produsenttråden `thread A` setter inn en node etter hodenoden `head`, `next`-pekeren til hodenoden blir atomisk byttet (CAS) til å peke til den nye `node A`, men denne CAS-operasjonen blir ikke gjort varig. Deretter settes en annen node inn av produsenttråden `thread B` etter `node A`, ettersom en CAS for `node A` allerede er synlig for alle de samtidige trådene. CAS bytter atomisk `next`-pekeren til `node A` slik at den peker til `node B`, og denne CAS-en blir gjort varig. Hvis et strømbrudd skjer på følgende tidspunkt vil applikasjonen som bruker den lenkede listen være i en inkonsistent tilstand, hvor både `node A` og `node B` er gått tapt, ettersom `next`-pekeren fra `head`-noden til `node A` ikke har blitt gjort varig. Siden `node B` har blitt publisert, men ikke kan aksesseres etter omstart, samt at andre data kan kan blitt gjort vedvarende som blir aksessert gjennom eller er avhengige av `node B`, så vil alle påfølgende aksesseringer til slik data ikke være mulig, og medfører tap av data.

Lesing av ikke-vedvarende skriving er ikke begrenset til blokkeringsfrie koblede lister, men finnes også i alle blokkeringsfrie datastrukturer hvor det kan eksistere en forskjell mellom samtidig synlighet og vedvarende synlighet. For eksempel kan et lignende problem oppstå med varige sirkulære buffer.

Se også
-------

* Vedvarende data, informasjon som sjelden aksessers og som sannsynligvis ikke vil bli endret
* Vedvarende datastruktur, en datastruktur som alltid bevarer den forrige versjonen av seg selv når den endres (effektivt uforanderlig)

Referanser
----------

1. ↑  Satish M. Thatte. 1986. Persistent memory: a storage architecture for object-oriented database systems. In Proceedings on the 1986 international workshop on Object-oriented database systems (OODS '86). IEEE Computer Society Press, Los Alamitos, CA, USA, 148-159.
2. ↑  P. Mehra and S. Fineberg, "Fast and flexible persistence: the magic potion for fault-tolerance, scalability and performance in online data stores," 18th International Parallel and Distributed Processing Symposium, 2004. Proceedings. Santa Fe, NM, USA, 2004, pp. 206-. doi: 10.1109/IPDPS.2004.1303232
3. ↑  Wang, William; Diestelhorst, Stephan (17. juni 2019). «Persistent Atomics for Implementing Durable Lock-Free Data Structures for Non-Volatile Memory (Brief Announcement)». *The 31st ACM Symposium on Parallelism in Algorithms and Architectures*. Association for Computing Machinery. ISBN 9781450361842. doi:10.1145/3323165.3323166.
4. ↑  Wolczko, Mario. «Non-Volatile Memory and Java: Part 2».