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.
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 .
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.
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 operativsystemerPOSIX 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 giver et sæt C-sprogfunktioner, der giver dig mulighed for at arbejde med delt hukommelse [7] :
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 hukommelsePOSIX 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:
På WindowsCreateFileMapping -operativsystemet bruges funktioner og MapViewOfFile[13] fra MSDN til at skabe delt hukommelse .
Support i programmeringssprogNogle 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 .
Inter-proces kommunikation | |
---|---|
Metoder | |
Udvalgte protokoller og standarder |