Разделяемая память
Быстрый 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 — локальная установка не требуется.
Все уроки этого курса
- Каналы
- Разделяемая память
- Очереди сообщений
- Сигналы