0Pricing
C Academy · Lekcja

Pamięć współdzielona

Szybka komunikacja międzyprocesowa

Pamięć współdzielona to bezpłatna lekcja C Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.

Szybka komunikacja IPC za pomocą pamięci współdzielonej

Pamięć współdzielona pozwala wielu procesom odwzorować ten sam obszar pamięci fizycznej w swoich przestrzeniach adresowych. Jest to najszybsza forma IPC, ponieważ dane nie są kopiowane za pośrednictwem jądra.

Dlaczego działa szybko

Potoki i sockety kopiują dane z jednego procesu do jądra, a następnie z powrotem. Pamięć współdzielona pomija ten etap: po odwzorowaniu procesy odczytują i zapisują te same bajty bezpośrednio, bez kopiowania każdej wiadomości.

POSIX a System V

Istnieją dwa interfejsy API:

  • POSIX: shm_open + mmap, przypomina pliki i jest nowocześniejszy
  • System V: shmget + shmat, starszy, oparty na kluczach

W nowym kodzie zazwyczaj preferuje się POSIX.

Krok 1: utworzenie obiektu

shm_open tworzy nazwany obiekt pamięci współdzielonej lub otwiera istniejący, zwracając deskryptor pliku. Nazwa zaczyna się od ukośnika, na przykład /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 */
}

Krok 2: określenie rozmiaru

Nowo utworzony obiekt pamięci współdzielonej ma zerową długość. Przed odwzorowaniem należy ustawić jego rozmiar za pomocą 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 */
}

Krok 3: odwzorowanie

mmap odwzorowuje obiekt w przestrzeni adresowej procesu i zwraca wskaźnik, z którego można korzystać jak ze zwykłej pamięci.

#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 */
}

Odczyt i zapis

Po odwzorowaniu wystarczy wyłuskać wskaźnik. Struktura znajdująca się w pamięci współdzielonej jest widoczna dla każdego procesu, który odwzorował ten sam obiekt.

#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 jest niezbędne

Należy przekazać MAP_SHARED, aby zapisy były widoczne dla innych procesów. MAP_PRIVATE tworzy prywatne odwzorowanie typu copy-on-write, którego inne procesy nigdy nie zobaczą.

Synchronizacja należy do Państwa

Pamięć współdzielona nie zapewnia żadnej wbudowanej synchronizacji. Bez odpowiedniej koordynacji dwa procesy mogą uszkodzić dane w wyniku wyścigu. Należy je chronić za pomocą semaforów, mutexów lub operacji atomowych.

Używanie nazwanego semafora

Named semaphore POSIX (sem_open) koordynuje dostęp. Producent sygnalizuje gotowość danych, a konsument czeka przed ich odczytaniem.

#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); */

Sprzątanie

Zawsze należy zwalniać zasoby:

  • munmap do usunięcia odwzorowania obszaru
  • close do zamknięcia deskryptora
  • shm_unlink do usunięcia nazwanego obiektu

W przeciwnym razie obiekt pozostanie w /dev/shm po zakończeniu procesu.

#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);
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat pamięci współdzielonej.

Podsumowanie

Dowiedziano się, jak używać pamięci współdzielonej, najszybszej formy IPC.

  • shm_open, ftruncate, a następnie mmap z MAP_SHARED
  • Wyłuskanie wskaźnika umożliwia odczyt i zapis współdzielonych danych
  • Należy samodzielnie dodać synchronizację (semafory)
  • Zasoby należy zwolnić za pomocą munmap, close i shm_unlink

Często zadawane pytania

Czy lekcja „Pamięć współdzielona” jest bezpłatna?

Tak — pełny tekst „Pamięć współdzielona” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Pamięć współdzielona”?

Szybka komunikacja międzyprocesowa Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C Academy?

Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Pamięć współdzielona”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?

Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Potoki
  2. Pamięć współdzielona
  3. Kolejki komunikatów
  4. Sygnały
← Powrót do C Academy