В информатике постоянная память — это любой метод или устройство для эффективного хранения структур данных , чтобы к ним можно было продолжать обращаться с помощью инструкций памяти или API-интерфейсов памяти даже после завершения процесса, который их создал или последний раз модифицировал. [1]
Постоянная память , которую часто путают с энергонезависимой памятью с произвольным доступом (NVRAM), вместо этого более тесно связана с концепцией постоянства , поскольку в ней делается акцент на состоянии программы, которое существует за пределами зоны сбоя процесса, который ее создал. (Процесс – это выполняемая программа. Зона сбоя процесса – это то подмножество состояния программы, которое может быть повреждено , если процесс продолжает выполняться после возникновения ошибки, например, из-за ненадежного компонента, используемого в компьютере, выполняющем программу. .)
Эффективный доступ, подобный памяти, является определяющей характеристикой постоянной памяти. [2] Это может быть обеспечено с помощью инструкций памяти микропроцессора , таких как загрузка и сохранение. Его также можно предоставить с помощью API, которые реализуют действия удаленного прямого доступа к памяти (RDMA), такие как чтение RDMA и запись RDMA. Другие методы с малой задержкой , которые обеспечивают побайтовый ( нужны пояснения ) доступ к данным, также подходят для этой цели.
Возможности постоянной памяти выходят за рамки энергонезависимости хранимых битов. Например, потеря ключевых метаданных, таких как записи таблицы страниц или других конструкций, которые преобразуют виртуальные адреса в физические адреса, может сделать устойчивые биты непостоянными. В этом отношении постоянная память напоминает более абстрактные формы компьютерного хранилища, такие как файловые системы . Фактически, почти все существующие технологии постоянной памяти реализуют по крайней мере базовую файловую систему, которую можно использовать для связи имен или идентификаторов с хранимыми экстентами, и как минимум предоставляют методы файловой системы, которые можно использовать для именования и распределения таких экстентов.
Проблема чтения или непостоянной записи возникает для программ без блокировки в постоянной памяти. Поскольку операции сравнения и замены (CAS) не сохраняют записанные значения в постоянной памяти, измененные данные могут быть сделаны видимыми с помощью протокола когерентности кэша для параллельного наблюдателя до того, как измененные данные смогут наблюдаться наблюдателем сбоев в постоянной памяти. . Если сбой питания происходит сразу после того, как запись становится видимой, но еще не постоянной, может возникнуть проблема чтения непостоянной записи, т. е. переменная данных, которая изменяется в результате операции сравнения и замены, может быть сделана видимый одновременно наблюдателю перед наблюдателем сбоев, что приводит к потенциальным несоответствиям сбоев.
Чтобы проиллюстрировать проблему: для односвязного списка без блокировки узел может быть вставлен производителем thread A
после head
узла, next
указатель головного узла автоматически переключается (CAS), чтобы указывать на новый node A
, однако этот CAS не является упорствовал. Затем производитель вставляет еще один узел thread B
после node A
, поскольку CAS node A
уже виден всем параллельным потокам. CAS атомарно переключает next
указатель на node A
точку node B
, и этот CAS сохраняется. Если в этот момент произойдет сбой питания, приложение, использующее связанный список, останется в несогласованном состоянии с обоими node A
и node B
потеряется, поскольку next
указатель от head
узла на node A
не сохранился. Поскольку node B
было опубликовано, но к нему невозможно получить доступ после перезагрузки, а также могли сохраниться другие данные, доступ к которым осуществляется через или зависит от него node B
, все последующие доступы к таким данным будут невозможны, что приведет к потере данных. [3]
Проблема чтения-непостоянной записи не ограничивается связанными списками без блокировок, ее можно обнаружить в любых структурах данных без блокировок, где может существовать потенциальный разрыв между параллельной видимостью и постоянной видимостью. Например, аналогичная проблема может возникнуть с постоянными циклическими буферами . [4]