Введение

Когерентность памяти – это проблема, влияющая на проектирование компьютерных систем, в которых два или более процессоров или ядер совместно используют общую область памяти. В однопроцессорной системе (где существует только одно ядро) имеется только один вычислительный элемент, выполняющий всю работу, и, следовательно, только он может читать или записывать данные в заданное местоположение памяти. В результате, при изменении значения, все последующие операции чтения из соответствующего местоположения памяти будут видеть обновленное значение, даже если оно закэшировано. Напротив, в многопроцессорных (или многоядерных) системах одновременно работают два или более вычислительных элемента, и поэтому возможно, что они одновременно обращаются к одному и тому же местоположению памяти. Если ни один из них не изменяет данные в этом месте, они могут совместно использовать их неограниченно долго и кэшировать по своему усмотрению. Но как только один из них обновляет это местоположение, другие могут работать с устаревшей копией, например, находящейся в их локальном кэше. Следовательно, необходим механизм для уведомления всех вычислительных элементов об изменениях общих значений; такой механизм известен как протокол когерентности памяти, и если такой протокол используется, то говорят, что система обладает когерентной памятью. Точная природа и смысл когерентности памяти определяются моделью согласованности, которую реализует протокол когерентности. Для написания корректных параллельных программ программисты должны знать точную модель согласованности, используемую в их системах. При аппаратной реализации протокол когерентности может быть, например, основан на каталоге или на прослушивании (также называемом "сниффингом"). Конкретные протоколы включают протокол MSI и его производные MESI, MOSI и MOESI.