Головна | Про нас | Зворотній зв'язок
Проблема, про яку йде мова, виникає через те, що значення елемента даних в пам'яті, що зберігається в двох різних процесорах, є цим процесорам тільки через їх індивідуальні кеші. На рис. 10.3 показаний простий приклад, який ілюструє цю проблему.
Проблема когерентності пам'яті для мультипроцессоров і пристроїв введення / виводу має багато аспектів. Зазвичай в малих мультипроцесорах використовується апаратний механізм, званий протоколом, що дозволяє вирішити цю проблему. Такі протоколи називаються протоколами когерентності кеш-пам'яті. Існують два класи таких протоколів:
- Протоколи на основі довідника (directory based). Інформація про стан блоку фізичної пам'яті міститься тільки в одному місці, званому довідником (фізично довідник може бути розподілений по вузлах системи). Цей підхід буде розглянуто в розд. 10.3.
- Протоколи спостереження (snooping). Кожен кеш, який містить копію даних деякого блоку фізичної пам'яті, має також відповідну копію службової інформації про його стан. Централізована система записів відсутня. Зазвичай кеші розташовані на загальною (що розділяється) шині і контролери всіх кешей спостерігають за шиною (переглядають її) для визначення того, чи не містять вони копію відповідного блоку.
Мал. 10.3. Ілюстрація проблеми когерентності кеш-пам'яті
У мультипроцесорних системах, що використовують мікропроцесори з кеш-пам'яттю, під'єднані до централізованої загальної пам'яті, протоколи спостереження набули популярності, оскільки для опитування стану кешів вони можуть використовувати заздалегідь існуюче фізичне з'єднання - шину пам'яті.
Неформально, проблема когерентності пам'яті полягає в необхідності гарантувати, що будь-який зчитування елемента даних повертає останнім за часом записане в нього значення. Це визначення не зовсім коректно, оскільки неможливо вимагати, щоб операція зчитування миттєво бачила значення, записане в цей елемент даних деяким іншим процесором. Якщо, наприклад, операція запису на одному процесорі передує операції читання тієї ж осередки на іншому процесорі в межах дуже короткого інтервалу часу, то неможливо гарантувати, що читання поверне записане значення даних, оскільки в цей момент часу записуються дані можуть навіть не залишити процесор. Питання про те, коли точно записується значення має бути доступне процесору, що виконує читання, визначається обраною моделлю узгодженого (несуперечливого) стану пам'яті і пов'язаний з реалізацією синхронізації паралельних обчислень. Тому з метою спрощення припустимо, що ми вимагаємо лише, щоб записане операцією запису значення було доступно операції читання, що виникла трохи пізніше записи і що операції записи даного процесора завжди видно в порядку їх виконання.
З цим простим визначенням узгодженого стану пам'яті ми можемо гарантувати когерентність шляхом забезпечення двох властивостей:
- Операція читання комірки пам'яті одним процесором, яка слідує за операцією запису в ту ж комірку пам'яті іншим процесором отримає записане значення, якщо операції читання і запису досить відокремлені один від одного за часом.
- Операції запису в одну і ту ж комірку пам'яті виконуються строго послідовно (іноді кажуть, що вони серіалізовані): це означає, що дві поспіль йдуть операції записи в одну і ту ж комірку пам'яті спостерігатимуться іншими процесорами саме в тому порядку, в якому вони з'являються в програмі процесора, що виконує ці операції записи.
Перше властивість очевидно пов'язано з визначенням когерентного (погодженого) стану пам'яті: якби процесор завжди б зчитував тільки старе значення даних, ми сказали б, що пам'ять некогерентного.
Необхідність строго послідовного виконання операцій запису є більш тонким, але також дуже важливою властивістю. Уявімо собі, що строго послідовне виконання операцій запису не дотримується. Тоді процесор P1 може записати дані в клітинку, а потім в цей осередок виконає запис процесор P2. Строго послідовне виконання операцій запису гарантує два важливих наслідки для цієї послідовності операцій запису. По-перше, воно гарантує, що кожен процесор в машині в певний момент часу буде спостерігати запис, виконувану процесором P2. Якщо послідовність операцій записи не дотримується, то може виникнути ситуація, коли який-небудь процесор буде спостерігати спочатку операцію записи процесора P2, а потім операцію записи процесора P1, і буде зберігати це записане P1 значення необмежено довго. Більш тонка проблема виникає з підтриманням розумної моделі порядку виконання програм і когерентності пам'яті для користувача: уявіть, що третій процесор постійно читає ту ж саму комірку пам'яті, в яку записують процесори P1 і P2; він повинен спостерігати спочатку значення, записане P1, а потім значення, записане P2. Можливо він ніколи не зможе побачити значення, записаного P1, оскільки запис від P2 виникла раніше читання. Якщо він навіть бачить значення, записане P1, він повинен бачити значення, записане P2, при подальшому читанні. Подібним чином будь-який інший процесор, який може спостерігати за значеннями, записуваними як P1, так і P2, повинен спостерігати ідентичне поведінка. Найпростіший спосіб домогтися таких властивостей полягає в строгому дотриманні порядку операцій записи, щоб всі записи в одну і ту ж комірку могли спостерігатися в тому ж самому порядку. Це властивість називається послідовним виконанням (сериализацией) операцій записи (write serialization). Питання про те, коли процесор повинен побачити значення, записане іншим процесором досить складний і має помітний вплив на продуктивність, особливо в великих машинах.