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

Спільна пам'ять (англ. 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-пам'яті до якої мають доступ інші процеси;
  • метод збереження простору пам'яті завдяки направленню доступу до того, що є копіями даних замість одиничних екземплярів, використовуючи планування віртуальної пам'яті. Найчастіше це використовується для розподілених бібліотек та для 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 функції для розміщення області файлу у пам'яті в кількох процесах.

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

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

Підтримка мов програмування

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

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.