Gedeeld geheugen
Snelle IPC
Gedeeld geheugen is een gratis C Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C Academy bevat in totaal 4 lessen.
Snelle IPC met gedeeld geheugen
Met gedeeld geheugen kunnen meerdere processen hetzelfde gebied van het fysieke geheugen in hun adresruimten koppelen. Dit is de snelste vorm van IPC, omdat gegevens niet via de kernel worden gekopieerd.
Waarom het snel is
Pipes en sockets kopiëren gegevens van het ene proces naar de kernel en weer terug. Gedeeld geheugen slaat dit over: zodra het is gekoppeld, lezen en schrijven processen dezelfde bytes rechtstreeks, zonder kopie per bericht.
POSIX versus System V
Er zijn twee API's:
- POSIX:
shm_open+mmap, vergelijkbaar met bestanden en modern - System V:
shmget+shmat, ouder en gebaseerd op sleutels
POSIX heeft over het algemeen de voorkeur voor nieuwe code.
Stap 1: het object maken
shm_open maakt een benoemd object voor gedeeld geheugen of opent het en retourneert een bestandsdescriptor. De naam begint met een schuine streep, zoals /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 */
}Stap 2: de grootte instellen
Een nieuw gedeeld object heeft lengte nul. Gebruik ftruncate om de grootte ervan in te stellen voordat u het koppelt.
#include <unistd.h>
#include <stddef.h>
int size_shm(int fd, size_t bytes) {
return ftruncate(fd, (off_t)bytes); /* set the region size */
}Stap 3: het object koppelen
mmap koppelt het object aan de adresruimte van het proces en retourneert een pointer die u als gewoon geheugen gebruikt.
#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 */
}Lezen en schrijven
Zodra het object is gekoppeld, hoeft u de pointer alleen maar te derefereren. Een struct in gedeeld geheugen is zichtbaar voor elk proces dat hetzelfde object koppelt.
#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 is essentieel
U moet MAP_SHARED meegeven, zodat schrijfbewerkingen zichtbaar zijn voor andere processen. MAP_PRIVATE levert een private koppeling met copy-on-write, die andere processen nooit zien.
Synchronisatie is uw taak
Gedeeld geheugen biedt geen ingebouwde synchronisatie. Zonder coördinatie kunnen twee processen gegevens beschadigen tijdens een race. Bescherm het geheugen met semaforen, mutexen of atomics.
Een benoemde semafoor gebruiken
Een benoemde POSIX-semafoor (sem_open) coördineert de toegang. De producent geeft een signaal wanneer de gegevens gereed zijn; de consument wacht voordat deze ze leest.
#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); */Opruimen
Geef resources altijd vrij:
munmapom het gebied los te koppelencloseom de descriptor te sluitenshm_unlinkom het benoemde object te verwijderen
Anders blijft het object bestaan in /dev/shm nadat het proces is beëindigd.
#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);
}Korte controle
Test uw begrip van gedeeld geheugen.
Samenvatting
U hebt geleerd wat gedeeld geheugen is, de snelste vorm van IPC.
shm_open,ftruncateen daarnammapmetMAP_SHARED- Dereferereer de pointer om gedeelde gegevens te lezen en te schrijven
- U moet zelf synchronisatie toevoegen (semaforen)
- Ruim op met munmap, close en shm_unlink
Leer C met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 39
- Lessen
- 144
Veelgestelde vragen
Is de les “Gedeeld geheugen” gratis?
Ja — de volledige tekst van “Gedeeld geheugen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C Academy bevat in totaal 4 lessen.
Wat leer ik in “Gedeeld geheugen”?
Snelle IPC Je oefent met C Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C Academy te beginnen?
Ervaring vooraf is niet nodig. C Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Gedeeld geheugen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C Academy?
Ja. Elke les over C Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Pipes
- Gedeeld geheugen
- Berichtenwachtrijen
- Signalen