Jaettu muisti on nopein tapa vaihtaa tietoja prosessien välillä [1] .
Muissa prosessienvälisissä viestintätyökaluissa ( IPC ) prosessien välinen viestintä kulkee ytimen kautta , mikä johtaa kontekstin vaihtoon prosessin ja ytimen välillä, ts. suorituskyvyn menetyksiin [2] .
Jaettu muistitekniikka mahdollistaa tietojen vaihdon jaetun muistisegmentin kautta prosesseja varten ilman ytimen järjestelmäkutsuja. Jaettu muistisegmentti on kytketty prosessin virtuaalisen osoiteavaruuden vapaaseen osaan [3] . Näin ollen kahdella eri prosessilla voi olla eri osoitteet samasta jaetun muistin sijainnista.
Jaetun muistisegmentin luomisen jälkeen mikä tahansa käyttäjäprosessi voi liittää sen omaan virtuaalitilaansa ja työskennellä sen kanssa kuten tavallisen muistisegmentin kanssa. Tällaisen tiedonvaihdon haittapuolena on synkronointikeinojen puuttuminen, mutta tämän haitan voittamiseksi voidaan käyttää semaforitekniikkaa .
Kahden prosessin ( asiakas ja palvelin ) välisessä tiedonvaihdossa jaetun muistin avulla kahden semaforin ryhmän on toimittava. Ensimmäistä semaforia käytetään estämään pääsy jaettuun muistiin, sen aktivointisignaali on 1 ja sen estosignaali on 0. Toista semaforia käytetään ilmoittamaan palvelimelle, että asiakas on aloittanut työn, kun taas pääsy jaettuun muistiin on estetty, ja asiakas lukee tietoja muistista. Nyt kun palvelin kutsuu toiminnon, sen työ keskeytyy, kunnes asiakas vapauttaa muistin.
Ohjelmistossa jaettua muistia kutsutaan nimellä:
Koska molemmat prosessit voivat käyttää jaettua muistialuetta normaalina muistina, se on erittäin nopea tapa kommunikoida (toisin kuin muut IPC-mekanismit, kuten nimetyt putket , UNIX-pistokkeet tai CORBA ). Toisaalta tämä menetelmä on vähemmän joustava, esimerkiksi viestintäprosessien on oltava käynnissä samassa koneessa (luetelluista IPC-menetelmistä vain verkkopistokkeet, joita ei pidä sekoittaa UNIX-verkkoalueen pistokkeisiin, voivat kommunikoida verkon yli) , ja on huolehdittava ongelmien välttämisestä käytettäessä jaettua muistia eri prosessoriytimissä ja laitteistoarkkitehtuurissa ilman yhtenäistä välimuistia .
Jaetun muistin tiedonsiirtoa käytetään esimerkiksi kuvien siirtämiseen sovelluksen ja X-palvelimen välillä Unix-järjestelmissä tai CoMarshalInterThreadInterfaceInStreamin palauttaman IStream-objektin sisällä Windowsin COM-kirjastossa.
Jaetut kirjastot ladataan tavallisesti muistiin kerran ja kartoitetaan useiden prosessien kesken, ja vain yhdelle prosessille ominaiset sivut (koska jotkin tunnukset eroavat toisistaan) monistetaan, yleensä mekanismilla, joka tunnetaan nimellä copy-on-write . jaettuun muistiin, hiljaa kirjoitusta kutsuvaan prosessiin, kopioi muistin sivut ja kirjoittaa sitten tiedot kyseiseen kopioon.
UNIX-tyyppisissä käyttöjärjestelmissäPOSIX tarjoaa standardoidun sovellusliittymän jaetun muistin kanssa työskentelemiseen, POSIX Shared Memory . Yksi UNIX -käyttöjärjestelmien avainominaisuuksista on prosessin kopiointimekanismi (järjestelmäkutsu fork()), jonka avulla voit luoda jaetun muistin nimettömiä alueita ennen prosessin kopioimista ja periä ne jälkeläisille prosesseille. Kun prosessi on kopioitu, jaettu muisti on sekä vanhemman että lapsiprosessin käytettävissä. [3] [4]
Jaetun muistin yhdistämiseen ja käyttämiseen on kaksi erilaista tapaa:
UNIX System V sisältää joukon C-kielen toimintoja, joiden avulla voit työskennellä jaetun muistin kanssa [7] :
Nimetty jaettu muisti tarkoittaa, että jokaiseen muistipaikkaan liittyy käyttöjärjestelmässä ainutlaatuinen numeroavain, jota voidaan myöhemmin käyttää jaetun muistin yhdistämiseen toisessa prosessissa. [kahdeksan]
POSIX jaettu muistiPOSIX antaa sinun liittää tiedostokuvaajan jaettuun muistiobjektiin , joka on yhtenäisempi mekanismi kuin UNIX System V. Seuraavia C-kielen toimintoja voidaan käyttää muistin käsittelyyn:
Windows- käyttöjärjestelmässä MSDNCreateFileMapping :n toimintoja ja MapViewOfFile[13] : a käytetään jaetun muistin luomiseen .
Ohjelmointikielien tukiJotkut C++-kirjastot tarjoavat käyttöympäristöjen välisen pääsyn jaettuun muistiin . Esimerkiksi Boost -kirjasto tarjoaa luokan boost::interprocess::shared_memory_object[14] POSIX-yhteensopiville käyttöjärjestelmille , ja Qt -kirjasto tarjoaa luokan QSharedMemory, joka yhdistää pääsyn jaettuun muistiin eri käyttöjärjestelmissä tietyin rajoituksin [15] .
Java 7 : ssä GNU/Linux - käyttöjärjestelmässä jaettu muisti voidaan toteuttaa yhdistämällä tiedosto hakemistosta /dev/shm/(tai /run/shm/jakelusta riippuen) muistiin [16] käyttämällä mapluokkamenetelmää java.nio.MappedByteBuffer[17] .
Jaetun muistin tuki on otettu käyttöön monissa muissa ohjelmointikielissä . Siten PHP tarjoaa API :n [18] jaetun muistin luomiseen, jonka toiminnot ovat samanlaisia kuin POSIX .
Prosessien välinen viestintä | |
---|---|
menetelmät | |
Valitut protokollat ja standardit |