Vedvarende minne

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) 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 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