Jaettu muisti
Nopea IPC.
Jaettu muisti on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.
Nopea IPC jaettu muisti
Jaetun muistin avulla useat prosessit voivat yhdistää saman fyysisen muistin alueen omiin osoiteavaruuksiinsa. Se on nopein IPC-muoto, koska dataa ei kopioida ytimen kautta.
Miksi se on nopeaa
Putket ja socket-yhteydet kopioivat datan prosessista ytimeen ja takaisin. Jaettu muisti ohittaa tämän vaiheen: kun alue on yhdistetty, prosessit lukevat samoja tavuja ja kirjoittavat niihin suoraan ilman viestikohtaista kopiointia.
POSIX vai System V
Saatavilla on kaksi API:a:
- POSIX:
shm_open+mmap, tiedostomainen ja nykyaikainen - System V:
shmget+shmat, vanhempi avainpohjainen ratkaisu
POSIXia suositaan yleensä uudessa koodissa.
Vaihe 1: Luo olio
shm_open luo nimetyn jaetun muistin olion tai avaa sen ja palauttaa tiedostokuvaajan. Nimen alussa on kauttaviiva, esimerkiksi /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 */
}Vaihe 2: Määritä koko
Uuden jaetun muistin olion pituus on nolla. Asettakaa sen koko komennolla ftruncate ennen yhdistämistä.
#include <unistd.h>
#include <stddef.h>
int size_shm(int fd, size_t bytes) {
return ftruncate(fd, (off_t)bytes); /* set the region size */
}Vaihe 3: Yhdistä muistiin
mmap yhdistää olion prosessin osoiteavaruuteen ja palauttaa osoittimen, jota käytätte tavallisen muistin tavoin.
#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 */
}Lukeminen ja kirjoittaminen
Kun alue on yhdistetty, lukekaa ja kirjoittakaa yksinkertaisesti viittaamalla osoittimeen. Jaetussa muistissa oleva struct näkyy jokaiselle prosessille, joka yhdistää saman olion.
#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 on välttämätön
Teidän on välitettävä MAP_SHARED, jotta kirjoitukset näkyvät muille prosesseille. MAP_PRIVATE luo copy-on-write-periaatteella yksityisen yhdistyksen, jota muut prosessit eivät koskaan näe.
Synkronointi on teidän vastuullanne
Jaettu muisti ei tarjoa sisäänrakennettua synkronointia. Ilman koordinointia kaksi prosessia voi kilpailutilanteessa vioittaa dataa. Suojatkaa data semaforeilla, mutex-lukoilla tai atomisilla operaatioilla.
Nimetyn semaforin käyttäminen
POSIX-nimetty semafori (sem_open) koordinoi käyttöä. Tuottaja ilmoittaa viestillä, kun data on valmis, ja kuluttaja odottaa ennen lukemista.
#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); */Siivous
Vapauttakaa resurssit aina:
munmappoistaa muistialueen yhdistyksenclosesulkee tiedostokuvaajanshm_unlinkpoistaa nimetyn olion
Muuten olio säilyy kohteessa /dev/shm prosessin päättymisen jälkeen.
#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);
}Pikatarkistus
Testatkaa jaettua muistia koskeva ymmärryksenne.
Kertaus
Opitte käyttämään jaettua muistia, nopeinta IPC-muotoa.
shm_open,ftruncateja sittenmmapyhdessäMAP_SHARED-lipun kanssa- Lukekaa jaettuun dataan viittaamalla osoittimeen ja kirjoittakaa siihen
- Teidän on lisättävä synkronointi itse (semaforit)
- Siivotkaa resurssit komennoilla munmap, close ja shm_unlink
Opi C tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 39
- Oppitunnit
- 144
Usein kysytyt kysymykset
Onko oppitunti ”Jaettu muisti” ilmainen?
Kyllä – oppitunnin ”Jaettu muisti” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Jaettu muisti”?
Nopea IPC. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Jaettu muisti”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?
Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Putket
- Jaettu muisti
- Viestijonot
- Signaalit