Спільна пам’ять

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

Спільна пам'ять (англ. Shared memory) — регіон комп'ютерної пам'яті, до якої мають доступ кілька програм водночас. Такий доступ може організовуватись з метою зв'язку або передачі даних між програмами (чи їх потоками виконання), коли зайве копіювання даних небажане. Залежно від контексту, програми можуть запускатись як на одному процесорі, так і на кількох.

У апаратному забезпеченні[ред. | ред. код]

Стосовно апаратної реалізації комп'ютера, термін спільна пам'ять означає блок оперативної пам'яті, до якого мають доступ кілька центральних процесорів (ЦП) у багатопроцесорних комп'ютерних системах.

Існує кілька різновидів архітектури систем зі спільною пам'яттю:

  • однорідний доступ до пам'яті (англ. uniform memory access): рівномірний доступ до пам'яті всіма процесорами;
  • неоднорідний доступ до пам'яті (англ. non-uniform memory access): час доступу до пам'яті залежить від розташування пам'яті стосовно процесора;
  • архітектура пам'яті із використанням лише кешу (англ. cache-only memory architecture): локальні блоки пам'яті для процесорів у кожному вузлі використовуються як кеш-пам’ять, а не як основна.

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

  • збільшення часу доступу: коли кілька процесорів намагаються отримати доступ до одного блоку пам'яті, це викликає незгоду. Системи із розподіленою пам'яттю не можуть добре маштабуватись. Більшість із них мають 10, або менше процесорів;
  • відсутність узгодженості даних: всякий час, коли один кеш оновлюється інформацією що може бути використана іншими процесорами, зміна повинна відбутись у інших процесорах інакше, різні процесори будуть працювати із різними даними. Така когерантність кешу, коли вона добре працює, може забезпечити надзвичайно високопродуктивний доступ до розподіленої між багатьма процесорами інформації. З іншої сторони, інколи вони можуть бути перевантажені і стати надто вузьким місцем для продуктивності.

У випадку з Heterogeneous System Architecture (архітектура процесорів, у якій різні типи процесорів, такі як(GPU), або (CPU) поєднуються за допомогою розподіленої пам'яті), CPU-Модуль керування пам'яттю (MMU) та GPU-Блок управління пам'яттю для вводу/виводу (IOMMU) повинні ділити певні характеристики, як загальний адресний простір.

Альтернативами до розподіленої пам'яті є distributed memory і distributed shared memory, які мають той же список проблем.

У програмному забезпеченні[ред. | ред. код]

У програмному забезпеченні, розподілена пам'ять являє собою:

  • метод взаємодії між процесами, тобто шлях обміну даними між програмами які працюють одночасно. Один процес створює область у RAM-пам'яті до якої мають доступ інші процеси;
  • метод збереження простору пам'яті завдяки направленню доступу до того, що є копіями даних замість одиничних екземплярів, використовуючи планування віртуальної пам'яті. Найчастіше це використовується для розподілених бібліотек та для еxecute in place-систем.

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

Підтримка[ред. | ред. код]

Підтримка на UNIX-системах[ред. | ред. код]

POSIX забезпечує стандартизоване API для використання розподіленої пам'яті, POSIX Shared Memory. Воно використовує функцію shm_open із sys/mman.h. міжпроцесорна комунікація POSIX (частина POSIX:XSI розширення) функції для роботи із розподіленою пам'яттю : shmat, shmctl, shmdt and shmget.

Unix System V чудово забезпечує API для розподіленої пам'яті. Воно використовує shmget з sys/shm.h. BSD-системи забезпечують "anonymous mapped memory" яка може бути використана кількома процесорами.

Розподілена пам'ять, створена за допомогою shm_open є стійкою. Вона залишається у процесі, поки не буде явно видалена за допомогою процесу. У цьому є недолік, який полягає у тому, що якщо процес вийде з ладу і не вдається очистити загальну пам'ять він буде залишатись активним до завершення роботи системи.

POSIX також забезпечує mmap API для відображення файлів у пам'ять; відображення може бути розподіленим, дозволяючи вміст пам'яті, в ролі розподіленої.

Дистрибутиви Linux які базуються на 2.6 та новіших версіях kernel пропонують /dev/shm як розподілену пам'ять у формі RAM-диску, конкретніше, як каталог, доступний для запису (директорія, у якій кожен користувач системи може створювати файли) що зберігається у пам'яті. Дистрибутиви, які базуються на RedHat та Debian включають це за замовчуванням. Підтримка цього типу RAM-пам'яті не є обов'язковим у файлі конфігурації kernel.

Підтримка у Windows[ред. | ред. код]

У Windows функція CreateSharedMemory може бути використана для створення розподіленої пам'яті. Також може бути використана CreateFileMapping і MapViewOfFile функції для розміщення області файлу у пам'яті в кількох процесах.

Підтримка у кросплатформенних системах[ред. | ред. код]

Деякі C++ бібліотеки забезпечують портативний та об'єктно-орієнтований доступ до функціоналу розподіленої пам'яті. Для прикладу, Boost вміщує в собі Boost.Interprocess C++ бібліотеку. Qt забезпечує клас QSharedMemory.

Підтримка мов програмування[ред. | ред. код]

У мовах окрім C/C++ також забезпечена нативна підтримка розподіленої пам'яті. Для прикладу, PHP забезпечує API для створення розподіленої пам'яті, схоже на функції із POSIX.