Когерентность памяти — это проблема, которая влияет на проектирование компьютерных систем , в которых два или более процессора или ядра используют общую область памяти . [1] [2] [3] [4]
В однопроцессорной системе (где существует только одно ядро) есть только один обрабатывающий элемент, выполняющий всю работу, и, следовательно, только один обрабатывающий элемент, который может читать или записывать из/в данную ячейку памяти. В результате при изменении значения все последующие операции чтения соответствующей ячейки памяти будут видеть обновленное значение, даже если оно кэшировано .
И наоборот, в многопроцессорных (или многоядерных ) системах одновременно работают два или более процессорных элемента, поэтому возможно, что они одновременно обращаются к одной и той же ячейке памяти. При условии, что никто из них не изменит данные в этом месте, они могут делиться ими бесконечно и кэшировать по своему усмотрению. Но как только один из них обновит местоположение, другие могут работать с устаревшей копией, которая, например, находится в их локальном кеше. Следовательно, требуется некоторая схема для уведомления всех элементов обработки об изменениях общих значений; такая схема известна как протокол когерентности памяти , и если такой протокол используется, говорят, что система имеет когерентную память .
Точная природа и значение когерентности памяти определяются моделью согласованности , которую реализует протокол когерентности. Чтобы писать правильные параллельные программы, программисты должны знать точную модель согласованности, которая используется в их системах.
При аппаратной реализации протокол когерентности может, например, работать на основе каталогов или на основе отслеживания (также называемого сниффингом ). К конкретным протоколам относятся протокол MSI и его производные MESI , MOSI и MOESI .