Спільна пам'ять
Спільна пам'ять (англ. Shared memory) — регіон комп'ютерної пам'яті, до якої мають доступ кілька програм водночас. Такий доступ може організовуватись з метою зв'язку або передачі даних між програмами (чи їх потоками виконання), коли зайве копіювання даних небажане. Залежно від контексту, програми можуть запускатись як на одному процесорі, так і на кількох.
![](../I/Shared_memory.svg.png.webp)
У апаратному забезпеченні
Стосовно апаратної реалізації комп'ютера, термін спільна пам'ять означає блок оперативної пам'яті, до якого мають доступ кілька центральних процесорів (ЦП) у багатопроцесорних комп'ютерних системах.
Існує кілька різновидів архітектури систем зі спільною пам'яттю:
- однорідний доступ до пам'яті (англ. 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-пам'яті до якої мають доступ інші процеси;
- метод збереження простору пам'яті завдяки направленню доступу до того, що є копіями даних замість одиничних екземплярів, використовуючи планування віртуальної пам'яті. Найчастіше це використовується для розподілених бібліотек та для execute in place-систем.
Оскільки обидва процеси можуть отримати доступ до області розподіленої пам'яті як для звичайної робочої пам'яті, це дуже швидкий шлях до комунікації. З іншої сторони, це менш масштабовано, для прикладу, взаємодійні процеси повинні бути запущені на одній машині, і необхідно бути обережним, щоби уникнути проблем, у випадку, якщо процеси, що використовують розподілену пам'ять, виконуються на окремих про CPU й архітектура не є кеш-когерентною.
Підтримка
Підтримка на 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
функції для розміщення області файлу у пам'яті в кількох процесах.