Delt hukommelse

Delt hukommelse er det  hurtigste middel til dataudveksling mellem processer [1] .

I andre inter-process communication ( IPC ) værktøjer går kommunikation mellem processer gennem kernen , hvilket resulterer i et kontekstskifte mellem processen og kernen, dvs. til præstationstab [2] .

Teknikken med delt hukommelse tillader udveksling af information gennem et delt hukommelsessegment for processer uden brug af kernesystemkald. Det delte hukommelsessegment er forbundet med den frie del af processens virtuelle adresserum [3] . Således kan to forskellige processer have forskellige adresser på den samme delte hukommelsesplacering.

Kort beskrivelse af værket

Efter at have oprettet et delt hukommelsessegment, kan enhver af brugerprocesserne knytte det til deres eget virtuelle rum og arbejde med det som med et normalt hukommelsessegment. Ulempen ved en sådan udveksling af information er fraværet af nogen form for synkronisering, men for at overvinde denne ulempe kan semaforteknikken bruges .

Implementering af klient-server teknologi

I skemaet med dataudveksling mellem to processer ( klient og server ) ved hjælp af delt hukommelse, skal en gruppe på to semaforer fungere. Den første semafor bruges til at blokere adgang til delt hukommelse, dens aktiveringssignal er 1, og dens afvisningssignal er 0. Den anden semafor bruges til at signalere serveren, at klienten er begyndt at arbejde, mens adgang til delt hukommelse er blokeret, og klienten læser data fra hukommelsen. Nu, når operationen kaldes af serveren, vil dens arbejde blive suspenderet, indtil hukommelsen er frigivet af klienten.

Scenario med delt hukommelse

  1. Serveren får adgang til delt hukommelse ved hjælp af en semafor.
  2. Serveren skriver data til delt hukommelse.
  3. Når dataskrivningen er fuldført, frigiver serveren adgang til den delte hukommelse ved hjælp af semaforen.
  4. Klienten får adgang til delt hukommelse ved at låse adgangen til denne hukommelse for andre processer ved hjælp af en semafor.
  5. Klienten læser data fra den delte hukommelse og frigiver derefter hukommelsen ved hjælp af en semafor.

Softwareimplementering

I software kaldes delt hukommelse:

Fordi begge processer kan få adgang til det delte hukommelsesområde som normal hukommelse, er det en meget hurtig måde at kommunikere på (i modsætning til andre IPC-mekanismer såsom navngivne rør , UNIX-sockets eller CORBA ). På den anden side er denne metode mindre fleksibel, for eksempel skal kommunikationsprocesserne køre på den samme maskine (af de anførte IPC-metoder er det kun netværkssockets, der ikke må forveksles med UNIX-domænesockets, der kan kommunikere over netværket) , og der skal udvises forsigtighed for at undgå problemer ved brug af delt hukommelse på forskellige processorkerner og hardwarearkitektur uden en sammenhængende cache .

Delt hukommelseskommunikation bruges for eksempel til at overføre billeder mellem en applikation og en X-server på Unix-systemer eller inden for IStream-objektet, der returneres af CoMarshalInterThreadInterfaceInStream i Windows COM-biblioteket.

Delte biblioteker indlæses typisk i hukommelsen én gang og kortlægges på tværs af flere processer, og kun sider, der er specifikke for en enkelt proces (fordi nogle id'er adskiller sig), duplikeres, normalt ved en mekanisme kendt som copy-on-write , som når man forsøger at skrive til delt hukommelse, lydløst til processen, der kalder skrive, kopierer siderne i hukommelsen og skriver derefter dataene til den kopi.

På UNIX-lignende operativsystemer

POSIX leverer en standardiseret API til at arbejde med delt hukommelse, POSIX Shared Memory . En af nøglefunktionerne i UNIX -familien af ​​operativsystemer er proceskopieringsmekanismen (systemkald fork()), som giver dig mulighed for at oprette anonyme områder med delt hukommelse, før du kopierer processen og arver dem af efterkommerprocesser. Når processen er kopieret, vil den delte hukommelse være tilgængelig for både forældre- og underordnet processen. [3] [4]

Der er to forskellige tilgange til at forbinde og bruge delt hukommelse:

UNIX System V -stil delt hukommelse

UNIX System V giver et sæt C-sprogfunktioner, der giver dig mulighed for at arbejde med delt hukommelse [7] :

  • shmget — oprettelse af et delt hukommelsessegment bundet til en heltalsidentifikator eller et anonymt delt hukommelsessegment (hvis IPC_PRIVATE-værdien er angivet i stedet for identifikatoren) [8] ;
  • shmctl - indstilling af parametrene for hukommelsessegmentet [9] ;
  • shmat - forbindelse af segmentet til processens adresserum [4] ;
  • shmdt - frakobling af segmentet fra processens adresseområde [10] .

Navngivet delt hukommelse betyder, at hver hukommelsesplacering er forbundet med en unik numerisk nøgle i operativsystemet, som senere kan bruges til at forbinde delt hukommelse i en anden proces. [otte]

POSIX delt hukommelse

POSIX giver dig mulighed for at knytte en filbeskrivelse til et delt hukommelsesobjekt , som er en mere samlet mekanisme end UNIX System V. Følgende C-sprogfunktioner kan bruges til at manipulere hukommelsen:

  • shm_open — oprettelse eller forbindelse af et POSIX -delt hukommelsesobjekt ved dets navn [6] ;
  • shm_unlink — sletning af et delt hukommelsesobjekt ved dets navn (i dette tilfælde vil det delte hukommelsessegment eksistere, indtil det er afbrudt fra alle processer) [11] ;
  • ftruncate - indstiller eller ændrer størrelsen på delt hukommelse (eller hukommelseskortet fil) [12] ;
  • mmap — vedhæfter et eksisterende eller opretter et anonymt delt hukommelsessegment til procesadresserummet [3] .
I operativsystemer i Windows -familien

WindowsCreateFileMapping -operativsystemet bruges funktioner og MapViewOfFile[13] fra MSDN til at skabe delt hukommelse .

Support i programmeringssprog

Nogle C++-biblioteker tilbyder adgang på tværs af platforme til delt hukommelse . For eksempel giver Boost - biblioteket en klasse boost::interprocess::shared_memory_object[14] til POSIX-kompatible operativsystemer, og Qt -biblioteket giver en klasse QSharedMemory, der forener adgang til delt hukommelse på tværs af operativsystemer med nogle begrænsninger [15] .

I Java 7 under GNU/Linux -operativsystemet kan delt hukommelse implementeres ved at kortlægge en fil fra en mappe /dev/shm/(eller /run/shm/afhængigt af distributionen) til hukommelsen [16] ved hjælp af en mapklassemetode java.nio.MappedByteBuffer[17] .

Understøttelse af delt hukommelse er blevet implementeret i mange andre programmeringssprog . Således giver PHP en API [18] til at skabe delt hukommelse, hvis funktioner ligner dem i POSIX .

Se også

Noter

  1. Kolisnichenko Denis Nikolaevich. Udvikling af Linux-applikationer . - BHV-Petersburg, 2012-01-01. — 430 s. — ISBN 9785977507479 . Arkiveret 23. juli 2016 på Wayback Machine
  2. Hyok-Sung Choi, Hee-Chul Yun. Kontekstskift og IPC-ydelsessammenligning mellem uClinux og Linux på den ARM9-baserede processor  //  Samsung Electronics: Technical Report. - 2004. Arkiveret 6. marts 2016.
  3. ↑ 1 2 3 mmkort . pubs.opengroup.org. Hentet 3. januar 2016. Arkiveret fra originalen 6. december 2015.
  4. ↑ 12 shmat . _ pubs.opengroup.org. Hentet 3. januar 2016. Arkiveret fra originalen 30. december 2015.
  5. Systemgrænseflader Kapitel 2 . pubs.opengroup.org. Hentet 3. januar 2016. Arkiveret fra originalen 8. januar 2016.
  6. ↑ 12 shm_open . _ pubs.opengroup.org. Dato for adgang: 3. januar 2016. Arkiveret fra originalen 21. november 2015.
  7. Kay A. Robbins. UNIX-systemprogrammering: kommunikation, samtidighed og tråde . - Prentice Hall PTR, 2003. - s. 512. Arkiveret 22. september 2014 på Wayback Machine
  8. ↑ 12 shmget . _ pubs.opengroup.org. Hentet 3. januar 2016. Arkiveret fra originalen 5. marts 2016.
  9. shmctl . pubs.opengroup.org. Dato for adgang: 3. januar 2016. Arkiveret fra originalen 7. december 2015.
  10. shmdt . pubs.opengroup.org. Hentet 3. januar 2016. Arkiveret fra originalen 12. december 2015.
  11. shm_unlink . pubs.opengroup.org. Hentet 3. januar 2016. Arkiveret fra originalen 9. november 2015.
  12. ftruncate . pubs.opengroup.org. Dato for adgang: 3. januar 2016. Arkiveret fra originalen 1. februar 2016.
  13. Oprettelse af navngivet delt hukommelse . Hentet 26. juni 2014. Arkiveret fra originalen 5. juni 2014.
  14. Deling af hukommelse mellem processer - 1.60.0 . www.boost.org. Dato for adgang: 4. januar 2016. Arkiveret fra originalen 29. december 2015.
  15. QSharedMemory Class | Qt Core 5.5 . doc.qt.io. Dato for adgang: 4. januar 2016. Arkiveret fra originalen 7. december 2015.
  16. shm_overview(7) - Linux-manualside . man7.org. Dato for adgang: 4. januar 2016. Arkiveret fra originalen 4. januar 2016.
  17. MappedByteBuffer (Java Platform SE 7) . docs.oracle.com. Dato for adgang: 4. januar 2016. Arkiveret fra originalen 15. januar 2016.
  18. Delte hukommelsesfunktioner i PHP-API . Hentet 26. juni 2014. Arkiveret fra originalen 25. juni 2014.