Для обеспечения когерентности кэшей в многопроцессорных системах используются аппаратные механизмы. 2 Они гарантируют, что любое считывание элемента данных возвращает последнее по времени записанное в него значение. 2
Существует несколько способов разрешения проблемы когерентности на аппаратном уровне: 1
- Отказ от кэширования. 1 Принципиально решает проблему, но сильно снижает производительность системы за счёт разницы между скоростью работы процессоров и скоростью доступа к памяти. 1
- Широковещательная рассылка. 1 При изменении значения переменной одним из процессоров применяется сквозная запись переменной в кэш этого процессора и в общую память, сразу же после этого всем процессорам рассылается запрос на обновление этой переменной в их кэшах. 1
- Реализация специализированных протоколов когерентности. 1 Это сложный способ, требующий предварительной верификации и анализа на уровне моделей, но позволяющий добиться максимальной производительности параллельной системы. 1
Некоторые классы протоколов когерентности:
- Протоколы на основе справочника. 2 Информация о состоянии блока физической памяти содержится только в одном месте, называемом справочником (физически справочник может быть распределён по узлам системы). 2
- Протоколы наблюдения. 2 Каждый кэш, который содержит копию данных некоторого блока физической памяти, имеет также соответствующую копию служебной информации о его состоянии. 2 Обычно кэши расположены на общей шине, и контроллеры всех кэшей наблюдают за шиной, чтобы определять, какие обращения по адресам в пределах этого блока происходят со стороны других микропроцессоров. 2
- Перехват. 3 Когда из какого-либо одного кэша данные переписываются в оперативную память, контроллеры остальных получают сигнал об этом изменении («перехватывают» информацию об изменении данных) и, если необходимо, изменяют соответствующие данные в своих кэшах. 3