Delat minne

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.

Kort beskrivning av arbetet

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 .

Implementering av klient-server-teknik

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.

Scenario med delat minne

  1. Servern kommer åt delat minne med hjälp av en semafor.
  2. Servern skriver data till delat minne.
  3. Efter att dataskrivningen är klar släpper servern åtkomst till det delade minnet med hjälp av semaforen.
  4. Klienten får åtkomst till delat minne genom att låsa åtkomst till detta minne för andra processer med hjälp av en semafor.
  5. Klienten läser data från det delade minnet och släpper sedan minnet med en semafor.

Programvaruimplementering

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 operativsystem

POSIX 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 -stil delat minne

UNIX System V tillhandahåller en uppsättning C-språkfunktioner som låter dig arbeta med delat minne [7] :

  • shmget — skapande av ett delat minnessegment bundet till en heltalsidentifierare, eller ett anonymt delat minnessegment (om IPC_PRIVATE-värdet anges istället för identifieraren) [8] ;
  • shmctl - ställa in parametrarna för minnessegmentet [9] ;
  • shmat - anslutning av segmentet till processens adressutrymme [4] ;
  • shmdt - koppla bort segmentet från processens adressutrymme [10] .

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 minne

POSIX 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:

  • shm_open — skapande eller anslutning av ett POSIX- delat minnesobjekt med dess namn [6] ;
  • shm_unlink — radera ett delat minnesobjekt med dess namn (i detta fall kommer segmentet delat minne att existera tills det kopplas bort från alla processer) [11] ;
  • ftruncate - ställer in eller ändrar storleken på delat minne (eller minnesmappad fil) [12] ;
  • mmap — bifogar ett befintligt eller skapar ett anonymt delat minnessegment till processadressutrymmet [3] .
I operativsystem i Windows- familjen

I WindowsCreateFileMapping -operativsystemet används funktioner och MapViewOfFile[13] från MSDN för att skapa delat minne .

Stöd i programmeringsspråk

Vissa 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 .

Se även

Anteckningar

  1. Kolisnichenko Denis Nikolaevich. Utveckling av Linux-applikationer . - BHV-Petersburg, 2012-01-01. — 430 sid. — ISBN 9785977507479 . Arkiverad 23 juli 2016 på Wayback Machine
  2. Hyok-Sung Choi, Hee-Chul Yun. Kontextväxling och IPC-prestandajämförelse mellan uClinux och Linux på den ARM9-baserade processorn  //  Samsung Electronics: Teknisk rapport. - 2004. Arkiverad 6 mars 2016.
  3. ↑ 1 2 3 mmkarta . pubs.opengroup.org. Hämtad 3 januari 2016. Arkiverad från originalet 6 december 2015.
  4. ↑ 12 shmat . _ pubs.opengroup.org. Hämtad 3 januari 2016. Arkiverad från originalet 30 december 2015.
  5. Systemgränssnitt Kapitel 2 . pubs.opengroup.org. Hämtad 3 januari 2016. Arkiverad från originalet 8 januari 2016.
  6. ↑ 12 shm_open . _ pubs.opengroup.org. Tillträdesdatum: 3 januari 2016. Arkiverad från originalet 21 november 2015.
  7. Kay A. Robbins. UNIX-systemprogrammering: kommunikation, samtidighet och trådar . - Prentice Hall PTR, 2003. - s. 512. Arkiverad 22 september 2014 på Wayback Machine
  8. ↑ 12 shmget . _ pubs.opengroup.org. Hämtad 3 januari 2016. Arkiverad från originalet 5 mars 2016.
  9. shmctl . pubs.opengroup.org. Tillträdesdatum: 3 januari 2016. Arkiverad från originalet den 7 december 2015.
  10. shmdt . pubs.opengroup.org. Hämtad 3 januari 2016. Arkiverad från originalet 12 december 2015.
  11. shm_unlink . pubs.opengroup.org. Hämtad 3 januari 2016. Arkiverad från originalet 9 november 2015.
  12. ftruncate . pubs.opengroup.org. Tillträdesdatum: 3 januari 2016. Arkiverad från originalet 1 februari 2016.
  13. Skapa ett namngivet delat minne . Hämtad 26 juni 2014. Arkiverad från originalet 5 juni 2014.
  14. Dela minne mellan processer - 1.60.0 . www.boost.org. Tillträdesdatum: 4 januari 2016. Arkiverad från originalet 29 december 2015.
  15. QSharedMemory Class | Qt Core 5.5 . doc.qt.io. Tillträdesdatum: 4 januari 2016. Arkiverad från originalet den 7 december 2015.
  16. shm_overview(7) - Linux manualsida . man7.org. Tillträdesdatum: 4 januari 2016. Arkiverad från originalet 4 januari 2016.
  17. MappedByteBuffer (Java Platform SE 7) . docs.oracle.com. Tillträdesdatum: 4 januari 2016. Arkiverad från originalet 15 januari 2016.
  18. Delade minnesfunktioner i PHP-API . Hämtad 26 juni 2014. Arkiverad från originalet 25 juni 2014.