У МПВС із загальною шиною (Shared Memory Proccessing - мультипроцесори з поділом пам'яті, SMP-архітектура) всі функціональні модулі (процесори П1, П2. ПМ, модулі пам'яті МП1, МП2. МПК, пристрої введення-виведення УВВ1, УВВ2. УВВМ) приєднані до однієї загальної шини міжмодульних зв'язків, ширина якої може бути від одного біта до декількох байтів. Між модулями системи немає постійних зв'язків, інформація між ними передається в режимі поділу часу. У кожен даний момент часу по шині передається лише один пакет інформації від якогось одного джерела. Інші джерела інформації повинні очікувати, поки не звільниться системна шина. [10]
Основні переваги системи із загальною шиною міжмодульних зв'язків:
- система характеризується відносно низькою функціональною складністю і невисокою вартістю;
- в системі легко здійснюється реконфігурація структури шляхом додавання або видалення функціональних модулів.
Недоліки таких систем:
- обмеження продуктивності системи пропускною спроможністю загальної шини;
- погіршення загальної продуктивності системи при її розширенні шляхом додавання модулів;
- втрати продуктивності системи, пов'язані з врегулюванням конфліктів, які виникають у разі, коли кілька модулів одночасно претендують на заняття загальної шини для передачі інформації. Ці втрати можна знизити, якщо, крім загальної пам'яті, доступної всім процесорам, кожен з них забезпечити місцевої (локальної, процессорной) пам'яттю для зберігання інформації, яка бере участь в найближчому ряду обчислень. При наявності місцевої пам'яті частота звернення процесорів до загальної пам'яті зменшується, отже, зменшується частота виникнення конфліктів і втрати часу на їх вирішення;
- відмова загальної шини призводить до виходу з ладу всієї системи.
Організація зв'язків між елементами системи на основі загальної шини є одним з поширених способів побудови не тільки багатопроцесорних, але і багатомашинних обчислювальних комплексів невеликої потужності.
Архітектура SMP стала свого роду стандартом для всіх сучасних багатопроцесорних серверів (наприклад, НР9000 і DEC Alpha Server AXP).
У перших розробках подібного роду машин вдавалося розмістити весь процесор і кеш на одній платі, яка потім вставлялася в задню панель, за допомогою якої реалізовувалася шинна архітектура. Сучасні конструкції дозволяють розмістити до чотирьох процесорів на одній платі. На рис. 2 показана схема саме такої машини.
У такій машині кеші можуть містити як колективні, так і приватні дані. Приватні дані - це дані, які використовуються одним процесором, в той час як колективні дані використовуються багатьма процесорами, по суті забезпечуючи обмін між ними. Коли кешируєтся елемент приватних даних, їх значення переноситься в кеш для скорочення середнього часу доступу, а також необхідної смуги пропускання. Оскільки жоден інший процесор не використовує ці дані, цей процес ідентичний процесу для однопроцессорной машини з кеш-пам'яттю. Якщо кешуються колективні дані, то їх поділяє значення реплицируется і може міститися в декількох кешах. Крім скорочення затримки доступу і необхідної смуги пропускання така реплікація даних сприяє також загальне скорочення кількості обмінів. Однак кешування поділюваних даних викликає нову проблему: когерентність кеш-пам'яті. [11]
Проблема, про яку йде мова, виникає через те, що значення елемента даних в пам'яті, що зберігається в двох різних процесорах, є цим процесорам тільки через їх індивідуальні кеші. На рис. 3.30 показаний простий приклад, який ілюструє цю проблему.
Проблема когерентності пам'яті для мультипроцессоров і пристроїв введення / виводу має багато аспектів. Зазвичай в малих мультипроцесорах використовується апаратний механізм, званий протоколом, що дозволяє вирішити цю проблему. Такі протоколи називаються протоколами когерентності кеш-пам'яті. Існують два класи таких протоколів:
1. Протоколи на основі довідника (directory based). Інформація про стан блоку фізичної пам'яті міститься тільки в одному місці, званому довідником (фізично довідник може бути розподілений по вузлах системи). Цей підхід буде розглянуто в розд. 3.30.
2. Протоколи спостереження (snooping). Кожен кеш, який містить копію даних деякого блоку фізичної пам'яті, має також відповідну копію службової інформації про його стан. Централізована система записів відсутня. Зазвичай кеші розташовані на загальною (що розділяється) шині і контролери всіх кешей спостерігають за шиною (переглядають її) для визначення того, чи не містять вони копію відповідного блоку.
У мультипроцесорних системах, що використовують мікропроцесори з кеш-пам'яттю, під'єднані до централізованої загальної пам'яті, протоколи спостереження набули популярності, оскільки для опитування стану кешів вони можуть використовувати заздалегідь існуюче фізичне з'єднання - шину пам'яті.
Малюнок 2 - Ілюстрація проблеми когерентності кеш-пам'яті
Неформально, проблема когерентності пам'яті полягає в необхідності гарантувати, що будь-який зчитування елемента даних повертає останнім за часом записане в нього значення. Це визначення не зовсім коректно, оскільки неможливо вимагати, щоб операція зчитування миттєво бачила значення, записане в цей елемент даних деяким іншим процесором. Якщо, наприклад, операція запису на одному процесорі передує операції читання тієї ж осередки на іншому процесорі в межах дуже короткого інтервалу часу, то неможливо гарантувати, що читання поверне записане значення даних, оскільки в цей момент часу записуються дані можуть навіть не залишити процесор. Питання про те, коли точно записується значення має бути доступне процесору, що виконує читання, визначається обраною моделлю узгодженого (несуперечливого) стану пам'яті і пов'язаний з реалізацією синхронізації паралельних обчислень. Тому з метою спрощення припустимо, що ми вимагаємо лише, щоб записане операцією запису значення було доступно операції читання, що виникла трохи пізніше записи і що операції записи даного процесора завжди видно в порядку їх виконання. [12]
З цим простим визначенням узгодженого стану пам'яті ми можемо гарантувати когерентність шляхом забезпечення двох властивостей:
Операція читання комірки пам'яті одним процесором, яка слідує за операцією запису в ту ж комірку пам'яті іншим процесором отримає записане значення, якщо операції читання і запису досить відокремлені один від одного за часом.
Операції запису в одну і ту ж комірку пам'яті виконуються строго послідовно (іноді кажуть, що вони серіалізовані): це означає, що дві поспіль йдуть операції записи в одну і ту ж комірку пам'яті спостерігатимуться іншими процесорами саме в тому порядку, в якому вони з'являються в програмі процесора, що виконує ці операції записи.
Перше властивість очевидно пов'язано з визначенням когерентного (погодженого) стану пам'яті: якби процесор завжди б зчитував тільки старе значення даних, ми сказали б, що пам'ять некогерентного.
Необхідність строго послідовного виконання операцій запису є більш тонким, але також дуже важливою властивістю. Уявімо собі, що строго послідовне виконання операцій запису не дотримується. Тоді процесор P1 може записати дані в клітинку, а потім в цей осередок виконає запис процесор P2. Строго послідовне виконання операцій запису гарантує два важливих наслідки для цієї послідовності операцій запису. По-перше, воно гарантує, що кожен процесор в машині в певний момент часу буде спостерігати запис, виконувану процесором P2. Якщо послідовність операцій записи не дотримується, то може виникнути ситуація, коли який-небудь процесор буде спостерігати спочатку операцію записи процесора P2, а потім операцію записи процесора P1, і буде зберігати це записане P1 значення необмежено довго. Більш тонка проблема виникає з підтриманням розумної моделі порядку виконання програм і когерентності пам'яті для користувача: уявіть, що третій процесор постійно читає ту ж саму комірку пам'яті, в яку записують процесори P1 і P2; він повинен спостерігати спочатку значення, записане P1, а потім значення, записане P2. Можливо він ніколи не зможе побачити значення, записаного P1, оскільки запис від P2 виникла раніше читання. Якщо він навіть бачить значення, записане P1, він повинен бачити значення, записане P2, при подальшому читанні. Подібним чином будь-який інший процесор, який може спостерігати за значеннями, записуваними як P1, так і P2, повинен спостерігати ідентичне поведінка. Найпростіший спосіб домогтися таких властивостей полягає в строгому дотриманні порядку операцій записи, щоб всі записи в одну і ту ж комірку могли спостерігатися в тому ж самому порядку. Це властивість називається послідовним виконанням (сериализацией) операцій записи (write serialization). Питання про те, коли процесор повинен побачити значення, записане іншим процесором досить складний і має помітний вплив на продуктивність, особливо в великих машинах. [13]
Альтернативою протоколу записи з анулюванням є оновлення всіх копій елемента даних в разі запису в цей елемент даних. Цей тип протоколу називається протоколом записи з оновленням (write update protocol) або протоколом записи з трансляцією (write broadcast protocol). Зазвичай в цьому протоколі для зниження вимог до смуги пропускання корисно відстежувати, чи є слово в кеш-пам'яті, що розділяється об'єктом, чи ні, а саме, чи міститься воно в інших кешах. Якщо немає, то немає ніякої необхідності оновлювати інший кеш або транслювати в нього оновлені дані.
Різниця в продуктивності між протоколами записи з оновленням і з анулюванням визначається трьома характеристиками:
1. Кілька послідовних операцій записи в один і той же слово, що не перемежовуються операціями читання, вимагають декількох операцій трансляції при використовуванні протоколу запису з оновленням, але тільки однієї початкової операції анулювання при використанні протоколу записи з анулюванням.
2. При наявності багатослівних блоків в кеш-пам'яті кожне слово, що записується в блок кешу, вимагає трансляції при використовуванні протоколу запису з оновленням, в той час як тільки перший запис в будь-яке слово блоку потребує генерації операції анулювання при використанні протоколу записи з анулюванням. Протокол запису з анулюванням працює на рівні блоків кеш-пам'яті, в той час як протокол записи з оновленням повинен працювати на рівні окремих слів (або байтів, якщо виконується запис байта).
3. Затримка між записом слова в одному процесорі і читанням записаного значення іншим процесором зазвичай менше при використанні схеми запису з оновленням, оскільки записані дані негайно транслюються в процесор, що виконує читання (передбачається, що цей процесор має копію даних). Для порівняння, при використанні протоколу записи з анулюванням в процесорі, що виконує читання, спочатку відбудеться анулювання його копії, потім буде проводитися читання даних і його припинення до тих пір, поки оновлена копія блоку не стане доступною і не повернеться в процесор.