Спільна пам'ять
Ця стаття не містить посилань на джерела. (травень 2016) |
Спільна пам'ять (англ. Shared memory) — регіон комп'ютерної пам'яті, до якої мають доступ кілька програм водночас. Такий доступ може організовуватись з метою зв'язку або передачі даних між програмами (чи їх потоками виконання), коли зайве копіювання даних небажане. Залежно від контексту, програми можуть запускатись як на одному процесорі, так і на кількох.
Цей розділ потребує доповнення. |
Стосовно апаратної реалізації комп'ютера, термін спільна пам'ять означає блок оперативної пам'яті, до якого мають доступ кілька центральних процесорів (ЦП) у багатопроцесорних комп'ютерних системах.
Існує кілька різновидів архітектури систем зі спільною пам'яттю:
- однорідний доступ до пам'яті (англ. uniform memory access): рівномірний доступ до пам'яті всіма процесорами;
- неоднорідний доступ до пам'яті (англ. non-uniform memory access): час доступу до пам'яті залежить від розташування пам'яті стосовно процесора;
- архітектура пам'яті із використанням лише кешу (англ. cache-only memory architecture): локальні блоки пам'яті для процесорів у кожному вузлі використовуються як кеш-пам’ять, а не як основна.
Системи із розподіленою пам'яттю відносно прості для програм? оскільки усі процеси розподіляють єдине представлення даних і комунікація між процесорами може бути такою ж швидкою як доступ до пам'яті в одному місці. Проблема із системами із розподіленою пам'яттю полягає у тому, що багато центральних процесорів потребують швидкого доступу до пам'яті та швидше за все, доступу до кешу процесора, тому з'являються такі ускладнення:
- збільшення часу доступу: коли кілька процесорів намагаються отримати доступ до одного блоку пам'яті, це викликає незгоду. Системи із розподіленою пам'яттю не можуть добре масштабуватись. Більшість із них мають 10, або менше процесорів;
- відсутність узгодженості даних: всякий час, коли один кеш оновлюється інформацією, котра може бути використана іншими процесорами, зміна повинна відбутись в інших процесорах інакше, різні процесори будуть працювати із різними даними. Така когерентність кешу, коли вона добре працює, може забезпечити надзвичайно високопродуктивний доступ до розподіленої між багатьма процесорами інформації. З іншої сторони, інколи вони можуть бути перевантажені й стати надто вузьким місцем для продуктивності.
У випадку з гетерогенною архітектурою системи (архітектура процесорів, у якій різні типи процесорів, такі як (GPU), або (CPU) поєднуються за допомогою розподіленої пам'яті), CPU-модуль керування пам'яттю (MMU) та GPU-блок управління пам'яттю для вводу/виводу (IOMMU) повинні ділити певні характеристики, як загальний адресний простір.
Альтернативами до розподіленої пам'яті є distributed memory і distributed shared memory, які мають той же список проблем.
У програмному забезпеченні, розподілена пам'ять являє собою:
- метод взаємодії між процесами, тобто шлях обміну даними між програмами які працюють одночасно. Один процес створює область у RAM-пам'яті до якої мають доступ інші процеси;
- метод збереження простору пам'яті завдяки направленню доступу до того, що є копіями даних замість одиничних екземплярів, використовуючи планування віртуальної пам'яті. Найчастіше це використовується для розподілених бібліотек та для execute in place-систем.
Оскільки обидва процеси можуть отримати доступ до області розподіленої пам'яті, як для звичайної робочої пам'яті, це являє собою дуже швидкий шлях до комунікації. З іншої сторони, це менш масштабовано, для прикладу, взаємодійні процеси повинні бути запущені на одній машині, і необхідно бути обережним, щоби уникнути проблем, у випадку, якщо процеси, що використовують розподілену пам'ять, виконуються на окремих процесорах й архітектура не є кеш-когерентною.
З боку багатьох сучасних операційних систем надаються потужні інструменти та API для організації міжпроцесової взаємодії (й, навіть, міжпроцесорної[1]), у тому числі семафори і м'ютекси.
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 функція CreateSharedMemory
може бути використана для створення розподіленої пам'яті. Також може бути використана CreateFileMapping
і MapViewOfFile
функції для розміщення області файлу у пам'яті в кількох процесах.
Деякі C++ бібліотеки забезпечують портативний та об'єктноорієнтований доступ до функціонала розподіленої пам'яті. Для прикладу, Boost вміщує в собі Boost.Interprocess C++ бібліотеку. Qt забезпечує клас QSharedMemory.
У мовах окрім C/C++ також забезпечена нативна підтримка розподіленої пам'яті. Для прикладу, PHP забезпечує API для створення розподіленої пам'яті, схоже на функції із POSIX.
- ↑ Тема 11. Багатопроцесорні системи. — Вікі ЦДПУ. wiki.cuspu.edu.ua. Процитовано 30 квітня 2022.