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