Когерентность кэша

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Несколько кэшей для разделяемого ресурса памяти. Если процесс в верхней части имеет копию блока памяти из предыдущего чтения, а нижний клиент изменяет блок памяти, копия данных в кэше верхнего процесса становится устаревшей, если не используются какие-либо уведомления об изменении или проверки изменений.

Когерентность кэша (англ. cache coherence) — свойство кэшей, означающее целостность данных, хранящихся в локальных кэшах для разделяемого ресурса. Когерентность кэшей — частный случай когерентности памяти.

Когда процессы в системе используют кэширование общих ресурсов, например, памяти, могут возникнуть проблемы с противоречивостью данных. Это особенно справедливо в отношении процессоров в многопроцессорной системе. Когеренция кэшей предназначена для управления такими конфликтами путём поддержания согласованности данных в разных кэшах.

Некогерентные кэши: значение одной ячейки памяти различно для двух кэшей
Когерентные кэши

Когерентность определяет поведение чтений и записей в одно и то же место памяти. Кэш называется когерентным, если выполняются следующие условия[1]:

  • информирование о записи: изменение данных в любом из кэшей должно быть распространено на другие копии этих данных (этой линии кэша) в соседних кэшах;
  • сериализация транзакций: операции чтения и записи в одну и ту же ячейку памяти должны быть видимы для всех процессоров в одинаковом порядке.

В этих условиях предполагается, что операции чтения и записи происходят мгновенно. Однако этого не происходит на практике из-за задержек памяти и других особенностей архитектуры. Изменения, сделанные процессором , могут быть не видны процессору , если чтение произошло через очень маленький промежуток времени после записи. Модель консистентности памяти определяет, когда записанное значение будет видно при чтении из другого потока.

Механизмы когерентности кэшей[править | править код]

Три основных механизма обеспечения когерентности кэшей — с использованием справочника (directory), отслеживание (snooping) и перехват (snarfing).

При использовании справочника информация о состоянии блока физической памяти содержится только в одном месте, называемом справочником (при этом физически справочник может быть распределён по узлам системы).

В механизме отслеживания каждый кэш, который содержит копию данных некоторого блока физической памяти, имеет также соответствующую копию служебной информации о его состоянии. Централизованная система записей отсутствует. Обычно кэши расположены на общей (разделяемой) шине и контроллеры всех кэшей наблюдают за шиной (просматривают её) для определения того, не содержат ли они копию соответствующего блока.

При применении перехвата, когда из какого-либо одного кэша данные переписываются в оперативную память, контроллеры остальных получают сигнал об этом изменении («перехватывают» информацию об изменении данных) и, если необходимо, изменяют соответствующие данные в своих кэшах.

Системы распределенной разделяемой памяти[en] используют похожие механизмы для поддержания согласованности между блоками памяти в слабосвязанных системах.

Протоколы поддержки когерентности[править | править код]

Протоколы поддержки когерентности отвечают за поддержание корректности данных между всеми кэшами в системе с распределенной разделяемой памятью. Протокол поддерживает когерентность памяти согласно выбранной модели согласованности. Большинство аппаратных протоколов в процессорах (в том числе обеспечивающих кэш-когерентный неравномерный доступ к памяти) соответствует модели последовательной согласованности, а программные протоколы в системах программной распределённой памяти чаще реализуют модели согласованности по выходу (англ. release consistency) или слабой согласованности (англ. weak consistency).

Основные модели и протоколы поддержки когерентности кэшей:

Примечания[править | править код]

Литература[править | править код]