Что такое разделяемая память?devops-84

Разделяемая память — это механизм межпроцессного взаимодействия (IPC), который позволяет нескольким процессам получать доступ к общей области памяти.

1. Основные принципы работы

A. Общая концепция

  • Область памяти, доступная нескольким процессам одновременно
  • Изменения видны всем процессам, подключенным к этой области
  • Самый быстрый способ IPC (не требует системных вызовов после создания)

B. Техническая реализация

ipcs -m  # Просмотр существующих сегментов разделяемой памяти

2. Типы разделяемой памяти в Linux

A. System V Shared Memory

Создание сегмента:

key_t key = ftok("/tmp", 'A');
int shmid = shmget(key, size, IPC_CREAT | 0666);

B. POSIX Shared Memory

Работа с POSIX:

ls /dev/shm  # Просмотр POSIX shared memory объектов

C. Memory-mapped files

Пример использования:

void *addr = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

3. Ключевые особенности

ХарактеристикаОписание
СкоростьНаибольшая среди всех IPC-механизмов
СинхронизацияТребует дополнительных механизмов (семафоры, мьютексы)
Жизненный циклСуществует пока не удалена явно или пока работает система
БезопасностьКонтроль доступа через права (аналогично файлам)

4. Практическое применение

A. Базы данных

  • PostgreSQL использует shared memory для буферного кэша
  • Oracle DB применяет для SGA (System Global Area)

B. Контейнеры и виртуализация

  • Механизм для быстрого обмена данными между хостовой системой и гостями

C. Графические системы

  • Обмен большими объемами данных (например, буферами изображений)

5. Пример создания и использования

A. Создание сегмента

#include <sys/ipc.h>
#include <sys/shm.h>

int main() {
    int segment_id = shmget(IPC_PRIVATE, size, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
    char *shared_memory = (char *)shmat(segment_id, NULL, 0);
    sprintf(shared_memory, "Hello, shared memory!");
    shmdt(shared_memory);
}

B. Подключение к существующему сегменту

char *shared_memory = (char *)shmat(segment_id, NULL, 0);
printf("%s\n", shared_memory);
shmdt(shared_memory);

6. Управление разделяемой памятью

Просмотр:

ipcs -m  # Показать все сегменты

Удаление:

ipcrm -m <shmid>  # Удалить конкретный сегмент

7. Безопасность и ограничения

A. Настройки ядра

sysctl -a | grep shm  # Параметры shared memory

B. Лимиты системы

cat /proc/sys/kernel/shmmax  # Максимальный размер сегмента

Резюмируем: разделяемая память — это высокопроизводительный механизм для обмена данными между процессами, который широко используется в СУБД, системах реального времени и высоконагруженных приложениях. Её эффективность обусловлена отсутствием необходимости копирования данных между процессами.