Когерентність кешу

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Когерентність кешу (англ. Cache coherence) - це властивість кешу, що означає цілісність даних, що зберігаються в локальних кешах для роздільного ресурсу. Когерентність кешу - окремий випадок когерентності пам'яті.

Коли клієнти в системі використовують кешування загальних ресурсів, наприклад, пам'яті, можуть виникнути проблеми з суперечливістю даних. Це особливо справедливо по відношенню до процесорів в багатопроцесорній системі. На малюнку «Кеш для ресурсу пам'яті» зображено, що клієнт у верхній частині має копію блоку пам'яті з попереднього читання, а нижній клієнт змінює блок пам'яті, копія даних в кеші верхнього клієнта стає застарілою, якщо не використовуються будь-які повідомлення про зміну або перевірки змін. Когерентність кешу призначена для управління такими конфліктами і підтримкою відповідності між різними кешами.

Визначення[ред. | ред. код]

Когерентність визначає поведінку читань і записів в одному і тому ж місці пам'яті. Кеш називається когерентним, якщо виконуються наступні умови:

  1. Якщо процесор Р записує значення в змінну Х, то при наступному зчитуванні Х він повинен отримати раніше записане значення, якщо між записом і читанням Х інший процесор не здійснював запис в Х. Це умова пов'язана із збереженням порядку виконання програми, це повинно виконуватися і для однопоточної архітектури.
  2. Операція читання Х процесором , наступна після того, як інший процесор здійснив запис в Х, повинна повернути записане значення, якщо інші процесори не змінювали Х між двома операціями. Ця умова визначає поняття когерентної видимості пам'яті.
  3. Записи в одну і ту ж комірку пам'яті повинні бути послідовними. Іншими словами, якщо два процесори записують у змінну Х два значення: А, потім В - не повинно трапитися так, щоб при зчитуванні процесор спочатку отримував значення В, а потім А.

У цих умовах передбачається, що операції читання і запису відбуваються миттєво. Однак цього не відбувається на практиці через затримки пам'яті та інших особливостей архітектури. Зміни, зроблені процесором , можуть бути не видно процесору , якщо читання відбулося через дуже маленький проміжок часу після запису. Модель консистентності пам'яті визначає, коли записане значення буде видно при читанні з іншого потоку.

Механізми когерентності кешів[ред. | ред. код]

  • Когерентність з використанням довідника ( directory ). Інформація про стан блоку фізичної пам'яті міститься тільки в одному місці, званому довідником (фізично довідник може бути розподілений по вузлах системи).
  • Когерентність з використанням відстеження (snooping). Кожен кеш, який містить копію даних деякого блоку фізичної пам'яті, має також відповідну копію службової інформації про його стан. Централізована система записів відсутня. Зазвичай кеші розташовані на загальній (що розділяється) шині і контролери всіх кешів спостерігають за шиною (переглядають її) для визначення того, чи не містить вона копію відповідного блоку.
  • Перехоплення (snarfing). Коли з одного кешу дані переписуються в оперативну пам'ять, контролери інших отримують сигнал про цю зміну ( "перехоплюють" інформацію про зміну даних) і, якщо необхідно, змінюють відповідні дані в своїх кешах.

Системи розподіленої пам'яті, що Distributed shared memory використовують схожі механізми для підтримки коректності <! - Consistency -> між блоками пам'яті в слабкозв`язаних системах.

Протоколи підтримки когерентності[ред. | ред. код]

Протоколи підтримки когерентності відповідають за підтримання коректності даних між усіма кешами в системі з distributed shared memory. Протокол підтримує когерентність пам'яті відповідно до обраної моделі (consistency model[en]). Більшість апаратних протоколів в мікропроцесорах відповідають моделі sequential consistency, а програмні протоколи в системах software distributed shared memory частіше відповідають моделям release consistency[en] або weak consistency[en].

MOSI protocol[en]

MOESI protocol[en]

Література[ред. | ред. код]

Див. також[ред. | ред. код]