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:
munmapdo usunięcia odwzorowania obszaruclosedo zamknięcia deskryptorashm_unlinkdo 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ępniemmapzMAP_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
- Potoki
- Pamięć współdzielona
- Kolejki komunikatów
- Sygnały