πŸ“Œ Shared Memory

Shared Memory β€” ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ IPC (мСТпроцСссного взаимодСйствия), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ нСскольким процСссам ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ участку RAM Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· копирования Π΄Π°Π½Π½Ρ‹Ρ….

🧠 Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚ ΠΎΠ±Ρ‰Π΅ΠΉ памяти создаётся ΠΎΠ΄Π½ΠΈΠΌ процСссом ΠΈ отобраТаСтся (Ρ‡Π΅Ρ€Π΅Π· mmap ΠΈΠ»ΠΈ shmget) Π² адрСсныС пространства Π΄Ρ€ΡƒΠ³ΠΈΡ…. ВсС участники ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² этот сСгмСнт, ΠΊΠ°ΠΊ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ массив.

Π’ΠΈΠΏΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

  • POSIX: shm_open, mmap, ftruncate, close, unlink
  • System V: shmget, shmat, shmdt, shmctl

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ:

  • НС обСспСчиваСт ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ: Π½ΡƒΠΆΠ½Π° Semaphore ΠΈΠ»ΠΈ Mutex
  • Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ систСмными ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, /dev/shm Π² Linux)

βš™οΈ Π“Π΄Π΅ примСняСтся

ΠžΠ±Π»Π°ΡΡ‚ΡŒΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅
MultithreadingРаздСляСмый Π±ΡƒΡ„Π΅Ρ€ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами
High-Performance ComputingОбмСн Π² NUMA-систСмах, MPI
Database EngineShared Buffer Cache Π² PostgreSQL
GPU / AcceleratorОбмСн Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с CPU Π±Π΅Π· копирования
RTOS / EmbeddedБыстрый ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ

πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ (POSIX Shared Memory, C)

int fd = shm_open("/myshm", O_CREAT | O_RDWR, 0666);
ftruncate(fd, 4096);
char *ptr = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
strcpy(ptr, "hello world");

βœ… ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

  • Максимальная ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½Π° (Π±Π΅Π· копирования)

  • Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΏΡ€ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΡ‘ΠΌΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ (массив Π² памяти)

❌ НСдостатки

  • НСт встроСнной синхронизации β€” трСбуСтся Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅

  • ΠœΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π³ΠΎΠ½ΠΊΠ°ΠΌ ΠΈ рассинхронизации

  • Риск ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ, Ссли Π½Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ munmap/shm_unlink

  • ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈ ΠΏΡ€Π°Π²Π°ΠΌΠΈ доступа