Delat minne är det snabbaste sättet för datautbyte mellan processer [1] .
I andra verktyg för inter-process communication ( IPC ) går kommunikationen mellan processer genom kärnan , vilket resulterar i en kontextväxling mellan processen och kärnan, dvs. till prestationsförluster [2] .
Tekniken med delat minne tillåter utbyte av information genom ett delat minnessegment för processer utan att använda kärnsystemanrop. Det delade minnessegmentet är anslutet till den fria delen av processens virtuella adressutrymme [3] . Således kan två olika processer ha olika adresser för samma delade minnesplats.
Efter att ha skapat ett delat minnessegment kan vilken som helst av användarprocesserna koppla det till sitt eget virtuella utrymme och arbeta med det som med ett vanligt minnessegment. Nackdelen med ett sådant informationsutbyte är frånvaron av något sätt för synkronisering, men för att övervinna denna nackdel kan semafortekniken användas .
I systemet för datautbyte mellan två processer ( klient och server ) som använder delat minne, måste en grupp av två semaforer fungera. Den första semaforen används för att blockera åtkomst till delat minne, dess aktiveringssignal är 1 och dess förnekarsignal är 0. Den andra semaforen används för att signalera servern att klienten har börjat arbeta, medan åtkomst till delat minne är blockerad, och klienten läser data från minnet. Nu, när operationen anropas av servern, kommer dess arbete att avbrytas tills minnet frigörs av klienten.
I programvara kallas delat minne:
Eftersom båda processerna kan komma åt det delade minnesområdet som normalt minne, är det ett mycket snabbt sätt att kommunicera (till skillnad från andra IPC-mekanismer som namngivna rör , UNIX-sockets eller CORBA ). Å andra sidan är den här metoden mindre flexibel, till exempel måste kommunikationsprocesserna köras på samma maskin (av de listade IPC-metoderna kan endast nätverkssockets, inte att förväxla med UNIX-domänsockets, kommunicera över nätverket) , och försiktighet måste iakttas för att undvika problem när man använder delat minne på olika processorkärnor och hårdvaruarkitektur utan en sammanhängande cache .
Kommunikation med delat minne används till exempel för att överföra bilder mellan en applikation och en X-server på Unix-system, eller inom IStream-objektet som returneras av CoMarshalInterThreadInterfaceInStream i Windows COM-biblioteket.
Delade bibliotek läses vanligtvis in i minnet en gång och mappas över flera processer, och endast sidor som är specifika för en enskild process (eftersom vissa ID:n skiljer sig) dupliceras, vanligtvis med en mekanism som kallas kopiera-på-skriv , som när man försöker skriva till delat minne, tyst till processen som anropar skrivningen, kopierar minnessidorna och skriver sedan data till den kopian.
På UNIX-liknande operativsystemPOSIX tillhandahåller ett standardiserat API för att arbeta med delat minne, POSIX Shared Memory . En av nyckelfunktionerna i UNIX- familjen av operativsystem är processkopieringsmekanismen (systemanrop fork()), som låter dig skapa anonyma områden med delat minne innan du kopierar processen och ärver dem av efterkommande processer. Efter att processen har kopierats kommer det delade minnet att vara tillgängligt för både förälder- och barnprocessen. [3] [4]
Det finns två olika sätt att ansluta och använda delat minne:
UNIX System V tillhandahåller en uppsättning C-språkfunktioner som låter dig arbeta med delat minne [7] :
Namngivet delat minne innebär att varje minnesplats är associerad med en unik numerisk nyckel inom operativsystemet, som senare kan användas för att ansluta delat minne i en annan process. [åtta]
POSIX delat minnePOSIX låter dig associera en filbeskrivning med ett delat minnesobjekt , vilket är en mer enhetlig mekanism än UNIX System V. Följande C-språkfunktioner kan användas för att manipulera minne:
I WindowsCreateFileMapping -operativsystemet används funktioner och MapViewOfFile[13] från MSDN för att skapa delat minne .
Stöd i programmeringsspråkVissa C++-bibliotek erbjuder plattformsoberoende åtkomst till delat minne . Till exempel tillhandahåller Boost -biblioteket en klass boost::interprocess::shared_memory_object[14] för POSIX-kompatibla operativsystem, och Qt -biblioteket tillhandahåller en klass QSharedMemorysom förenar åtkomst till delat minne mellan operativsystem med vissa begränsningar [15] .
I Java 7 under operativsystemet GNU/Linux kan delat minne implementeras genom att mappa en fil från en katalog /dev/shm/(eller /run/shm/, beroende på distributionen) till minnet [16] med en mapklassmetod java.nio.MappedByteBuffer[17] .
Stöd för delat minne har implementerats i många andra programmeringsspråk . Således tillhandahåller PHP ett API [18] för att skapa delat minne, vars funktioner liknar POSIX .
Kommunikation mellan processer | |
---|---|
Metoder | |
Utvalda protokoll och standarder |