Trwała pamięć
W informatyce pamięć trwała to dowolna metoda lub urządzenie do wydajnego przechowywania struktur danych, tak aby można było uzyskać do nich dostęp za pomocą instrukcji pamięci lub interfejsów API pamięci nawet po zakończeniu procesu, który je utworzył lub jako ostatni zmodyfikował .
Często mylona z nieulotną pamięcią o dostępie swobodnym (NVRAM), pamięć trwała jest ściślej powiązana z koncepcją trwałości , kładąc nacisk na stan programu, który istnieje poza strefą błędu procesu, który ją stworzył. (Proces to wykonywany program. Strefa błędu procesu to ten podzbiór stanu programu, który może zostać uszkodzony przez kontynuację wykonywania procesu po wystąpieniu błędu, na przykład z powodu zawodnego komponentu używanego w komputerze wykonującym program.)
Wydajny dostęp podobny do pamięci jest cechą definiującą pamięć trwałą. Można to zapewnić za pomocą instrukcji pamięci mikroprocesora, takich jak ładowanie i przechowywanie. Można go również zapewnić za pomocą interfejsów API, które implementują zdalnego bezpośredniego dostępu do pamięci (RDMA), takie jak odczyt i zapis RDMA. Kwalifikują się również inne metody o niskim opóźnieniu, które umożliwiają bajtowy dostęp do danych [ wymagane wyjaśnienie ] .
Możliwości pamięci trwałej wykraczają poza nieulotność przechowywanych bitów. Na przykład utrata kluczowych metadanych, takich jak wpisy w tablicy stron lub inne konstrukcje, które tłumaczą adresy wirtualne na adresy fizyczne, może sprawić, że trwałe bity staną się nietrwałe. Pod tym względem pamięć trwała przypomina bardziej abstrakcyjne formy przechowywania danych w komputerze, takie jak systemy plików . W rzeczywistości prawie wszystkie istniejące technologie pamięci trwałej implementują przynajmniej podstawowy system plików, który może być używany do kojarzenia nazw lub identyfikatorów z przechowywanymi zakresami, a przynajmniej zapewniają metody systemu plików, które mogą być używane do nazywania i przydzielania takich obszarów.
Problem odczytu z nietrwałym zapisem
Problem odczytu z nietrwałym zapisem występuje w przypadku programów bez blokad w pamięci trwałej. Ponieważ operacje porównania i zamiany (CAS) nie utrwalają zapisanych wartości w pamięci trwałej, zmodyfikowane dane mogą być widoczne przez protokół spójności pamięci podręcznej dla równoczesnego obserwatora, zanim zmodyfikowane dane będą mogły być obserwowane przez obserwatora awarii w pamięci trwałej. Jeśli awaria zasilania nastąpi zaraz po tym, jak zapis stanie się widoczny, ale jeszcze nie trwały, może wystąpić problem odczytu z nietrwałym zapisem, tj. zmienna danych zmodyfikowana przez CAS może być widoczna dla równoczesnego obserwatora przed obserwatorem awarii, powodując potencjalne niespójności awarii.
Aby zilustrować problem: w przypadku pojedynczo połączonej listy bez blokad węzeł może zostać wstawiony przez wątek producenta A po węźle głównym, następny wskaźnik węzła głównego zostaje przełączony atomowo (CAS), aby wskazywał nowy węzeł A, jednak ten CAS nie jest utrwalany. Następnie kolejny węzeł zostaje wstawiony przez wątek producenta B po węźle A, ponieważ CAS dla węzła A jest już widoczny dla wszystkich współbieżnych wątków. CAS atomowo przełącza następny wskaźnik węzła A, aby wskazywał na węzeł B, i ten CAS zostaje utrwalony. Jeśli w tym momencie wystąpi awaria zasilania, aplikacja korzystająca z połączonej listy pozostanie w niespójnym stanie, z utratą zarówno węzła A, jak i węzła B, ponieważ następny wskaźnik z węzła głównego do węzła A nie zostałby utrwalony. Ponieważ węzeł B został opublikowany, ale nie można uzyskać do niego dostępu po ponownym uruchomieniu, a inne dane, które są dostępne za pośrednictwem węzła B lub są od niego zależne, mogły zostać utrwalone, wszystkie późniejsze dostępy do takich danych nie będą możliwe, co spowoduje utratę danych.
Problem odczytu z nietrwałym zapisem nie ogranicza się do połączonych list bez blokad, można go znaleźć w dowolnych strukturach danych bez blokad, w których może istnieć potencjalna luka między widocznością współbieżną a widocznością trwałą. Na przykład podobny problem może wystąpić w przypadku trwałych buforów cyklicznych
Zobacz też
- NOVA (system plików)
- Trwałe dane
- Trwałe struktury danych
- Phantom OS - trwały system operacyjny
Linki zewnętrzne
- Programowanie pamięci trwałej , zbiór zasobów związanych z programowaniem pamięci trwałej
- Kontenery i trwałe dane , LWN.net , 28 maja 2015 r., autor: Josh Berkus
- Asynchroniczne odświeżanie pamięci DRAM (ADR) , SNIA , styczeń 2014 r. (dotyczy również pamięci DRAM)
- Twizzler: An Operating System for Next-Generation Memory Hierarchies , University of California, Santa Cruz Technical Report UCSC-SSRC-17-01, 5 grudnia 2017 r., autor: Daniel Bittman, Matt Bryson, Yuanjiang Ni, Arjun Govindjee, Isaak Cherdak, Pankaj Mehra, Darrell DE Long i Ethan L. Miller