0Pricing
C Academy · Урок

Разделяемая память

Быстрый IPC

«Разделяемая память» — бесплатный урок C Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.

Быстрый IPC с общей памятью

Общая память позволяет нескольким процессам отображать одну область физической памяти в свои адресные пространства. Это самая быстрая форма IPC, поскольку данные не копируются через ядро.

Почему это быстро

Каналы и сокеты копируют данные из одного процесса в ядро, а затем обратно. Общая память этого не делает: после отображения процессы напрямую читают и записывают одни и те же байты, без копирования каждого сообщения.

POSIX и System V

Существуют два API:

  • POSIX: shm_open + mmap, современный интерфейс, похожий на работу с файлами
  • System V: shmget + shmat, более старый интерфейс на основе ключей

Для нового кода обычно предпочтителен POSIX.

Шаг 1: создание объекта

shm_open создаёт или открывает именованный объект общей памяти и возвращает файловый дескриптор. Имя начинается с косой черты, например /myshm.

#include <sys/mman.h>
#include <fcntl.h>

int create_shm(const char *name) {
    int fd = shm_open(name, O_CREAT | O_RDWR, 0666);
    return fd; /* -1 on error */
}

Шаг 2: задание размера

Новый объект общей памяти имеет нулевую длину. Перед отображением используйте ftruncate, чтобы задать его размер.

#include <unistd.h>
#include <stddef.h>

int size_shm(int fd, size_t bytes) {
    return ftruncate(fd, (off_t)bytes); /* set the region size */
}

Шаг 3: отображение

mmap отображает объект в адресное пространство процесса и возвращает указатель, который можно использовать как обычную память.

#include <sys/mman.h>
#include <stddef.h>

void *map_shm(int fd, size_t bytes) {
    void *p = mmap(NULL, bytes, PROT_READ | PROT_WRITE,
                   MAP_SHARED, fd, 0);
    return p; /* MAP_FAILED on error */
}

Чтение и запись

После отображения просто разыменуйте указатель. Структура в общей памяти видна каждому процессу, отображающему тот же объект.

#include <string.h>

typedef struct { int counter; char text[64]; } Shared;

void producer(Shared *s) {
    s->counter = 42;
    strcpy(s->text, "hello from producer");
}

MAP_SHARED необходим

Необходимо передать MAP_SHARED, чтобы записи были видны другим процессам. MAP_PRIVATE создаёт частное отображение с копированием при записи, которое другие процессы никогда не увидят.

Синхронизация — Ваша задача

Общая память не предоставляет встроенной синхронизации. Без координации два процесса могут повредить данные из-за состояния гонки. Защитите данные с помощью семафоров, мьютексов или атомарных операций.

Использование именованного семафора

Именованный семафор POSIX (sem_open) координирует доступ. producer вызывает sem_post, когда данные готовы, а consumer вызывает sem_wait перед чтением.

#include <semaphore.h>
#include <fcntl.h>

sem_t *open_sem(const char *name) {
    return sem_open(name, O_CREAT, 0666, 0); /* initial value 0 */
}
/* producer: sem_post(s);   consumer: sem_wait(s); */

Освобождение ресурсов

Всегда освобождайте ресурсы:

  • munmap для отмены отображения области
  • close для закрытия дескриптора
  • shm_unlink для удаления именованного объекта

Иначе объект останется в /dev/shm после завершения процесса.

#include <sys/mman.h>
#include <unistd.h>
#include <stddef.h>

void cleanup(void *p, size_t bytes, int fd, const char *name) {
    munmap(p, bytes);
    close(fd);
    shm_unlink(name);
}

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете работу общей памяти.

Повторение

Вы изучили общую память — самую быструю форму IPC.

  • shm_open, ftruncate, затем mmap с MAP_SHARED
  • Разыменовывайте указатель для чтения и записи общих данных
  • Вы должны самостоятельно добавить синхронизацию (семафоры)
  • Освобождайте ресурсы с помощью munmap, close и shm_unlink

Часто задаваемые вопросы

Урок «Разделяемая память» бесплатный?

Да — полный текст урока «Разделяемая память» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.

Чему я научусь в уроке «Разделяемая память»?

Быстрый IPC Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C Academy?

Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Разделяемая память»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C Academy?

Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Каналы
  2. Разделяемая память
  3. Очереди сообщений
  4. Сигналы
← Назад к C Academy