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.[1]
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.[2] 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.[3]
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.[4]
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
- ^ 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.
- ^ 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
- ^ 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.
- ^ Wolczko, Mario. «Non-Volatile Memory and Java: Part 2».