Спільна пам'ять (англ.Shared memory) — регіон комп'ютерної пам'яті, до якої мають доступ кілька програм водночас. Такий доступ може організовуватись з метою зв'язку або передачі даних між програмами (чи їх потоками виконання), коли зайве копіювання даних небажане. Залежно від контексту, програми можуть запускатись як на одному процесорі, так і на кількох.
Існує кілька різновидів архітектури систем зі спільною пам'яттю:
однорідний доступ до пам'яті (англ.uniform memory access): рівномірний доступ до пам'яті всіма процесорами;
неоднорідний доступ до пам'яті (англ.non-uniform memory access): час доступу до пам'яті залежить від розташування пам'яті стосовно процесора;
архітектура пам'яті із використанням лише кешу (англ.cache-only memory architecture): локальні блоки пам'яті для процесорів у кожному вузлі використовуються як кеш-пам’ять, а не як основна.
Системи із розподіленою пам'яттю відносно прості для програм? оскільки усі процеси розподіляють єдине представлення даних і комунікація між процесорами може бути такою ж швидкою як доступ до пам'яті в одному місці. Проблема із системами із розподіленою пам'яттю полягає у тому, що багато центральних процесорів потребують швидкого доступу до пам'яті та швидше за все, доступу до кешу процесора, тому з'являються такі ускладнення:
збільшення часу доступу: коли кілька процесорів намагаються отримати доступ до одного блоку пам'яті, це викликає незгоду. Системи із розподіленою пам'яттю не можуть добре масштабуватись. Більшість із них мають 10, або менше процесорів;
відсутність узгодженості даних: всякий час, коли один кеш оновлюється інформацією, котра може бути використана іншими процесорами, зміна повинна відбутись в інших процесорах інакше, різні процесори будуть працювати із різними даними. Така когерентність кешу, коли вона добре працює, може забезпечити надзвичайно високопродуктивний доступ до розподіленої між багатьма процесорами інформації. З іншої сторони, інколи вони можуть бути перевантажені й стати надто вузьким місцем для продуктивності.
Альтернативами до розподіленої пам'яті є distributed memory і distributed shared memory, які мають той же список проблем.
У програмному забезпеченні
У програмному забезпеченні, розподілена пам'ять являє собою:
метод взаємодії між процесами, тобто шлях обміну даними між програмами які працюють одночасно. Один процес створює область у RAM-пам'яті до якої мають доступ інші процеси;
метод збереження простору пам'яті завдяки направленню доступу до того, що є копіями даних замість одиничних екземплярів, використовуючи планування віртуальної пам'яті. Найчастіше це використовується для розподілених бібліотек та для execute in place-систем.
Оскільки обидва процеси можуть отримати доступ до області розподіленої пам'яті, як для звичайної робочої пам'яті, це являє собою дуже швидкий шлях до комунікації. З іншої сторони, це менш масштабовано, для прикладу, взаємодійні процеси повинні бути запущені на одній машині, і необхідно бути обережним, щоби уникнути проблем, у випадку, якщо процеси, що використовують розподілену пам'ять, виконуються на окремих процесорах й архітектура не є кеш-когерентною.
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.