Memoria partajată este cel mai rapid mijloc de schimb de date între procese [1] .
În alte instrumente de comunicare între procese ( IPC ), comunicarea între procese trece prin nucleu , rezultând o comutare de context între proces și nucleu, de exemplu. la pierderi de performanță [2] .
Tehnica memoriei partajate permite schimbul de informații printr-un segment de memorie partajată pentru procese fără a utiliza apeluri de sistem kernel. Segmentul de memorie partajată este conectat la partea liberă a spațiului de adrese virtuale a procesului [3] . Astfel, două procese diferite pot avea adrese diferite ale aceleiași locații de memorie partajată.
După crearea unui segment de memorie partajată, oricare dintre procesele utilizatorului îl poate atașa la propriul spațiu virtual și poate lucra cu el ca și cu un segment de memorie normal. Dezavantajul unui astfel de schimb de informații este absența oricăror mijloace de sincronizare, totuși, pentru a depăși acest dezavantaj, se poate folosi tehnica semaforului .
În schema schimbului de date între două procese ( client și server ) folosind memoria partajată, trebuie să funcționeze un grup de două semafore. Primul semafor este folosit pentru a bloca accesul la memoria partajată, semnalul său de activare este 1, iar semnalul de refuz este 0. Al doilea semafor este folosit pentru a semnala serverului că clientul a început să lucreze, în timp ce accesul la memoria partajată este blocat și clientul citește datele din memorie. Acum, când operația este apelată de către server, activitatea acesteia va fi suspendată până când memoria este eliberată de client.
În software, memoria partajată se numește:
Deoarece ambele procese pot accesa zona de memorie partajată ca memorie normală, este o modalitate foarte rapidă de comunicare (spre deosebire de alte mecanisme IPC, cum ar fi named pipes , socket-uri UNIX sau CORBA ). Pe de altă parte, această metodă este mai puțin flexibilă, de exemplu, procesele de comunicare trebuie să ruleze pe aceeași mașină (dintre metodele IPC enumerate, numai socket-urile de rețea, a nu fi confundate cu socket-urile de domeniu UNIX, pot comunica prin rețea) și trebuie avut grijă pentru a evita problemele atunci când utilizați memoria partajată pe diferite nuclee de procesor și arhitectură hardware fără un cache coerent .
Comunicarea cu memorie partajată este utilizată, de exemplu, pentru a transfera imagini între o aplicație și un server X pe sisteme Unix sau în cadrul obiectului IStream returnat de CoMarshalInterThreadInterfaceInStream în biblioteca COM Windows.
Bibliotecile partajate sunt de obicei încărcate în memorie o singură dată și mapate în mai multe procese și numai paginile care sunt specifice unui singur proces (deoarece unele ID-uri diferă) sunt duplicate, de obicei printr-un mecanism cunoscut sub numele de copiere la scriere , care atunci când încearcă să scrie în memoria partajată, în tăcere la procesul care apelează la scriere, copiază paginile de memorie și apoi scrie datele în acea copie.
Pe sisteme de operare asemănătoare UNIXPOSIX oferă un API standardizat pentru lucrul cu memoria partajată, POSIX Shared Memory . Una dintre caracteristicile cheie ale familiei de sisteme de operare UNIX este mecanismul de copiere a procesului (apel de sistem fork()), care vă permite să creați zone anonime de memorie partajată înainte de a copia procesul și să le moșteniți de procesele descendente. După ce procesul este copiat, memoria partajată va fi disponibilă atât pentru procesul părinte, cât și pentru cel copil. [3] [4]
Există două abordări diferite pentru conectarea și utilizarea memoriei partajate:
UNIX System V oferă un set de funcții în limbaj C care vă permit să lucrați cu memoria partajată [7] :
Memoria partajată numită înseamnă că fiecare locație de memorie este asociată cu o cheie numerică unică în sistemul de operare, care poate fi folosită ulterior pentru a conecta memoria partajată într-un alt proces. [opt]
Memoria partajată POSIXPOSIX vă permite să asociați un descriptor de fișier cu un obiect de memorie partajată , care este un mecanism mai unificat decât UNIX System V. Următoarele funcții ale limbajului C pot fi folosite pentru a manipula memoria:
Pe sistemul de operare WindowsCreateFileMapping , funcțiile și MapViewOfFile[13] de la MSDN sunt utilizate pentru a crea memorie partajată .
Suport în limbaje de programareUnele biblioteci C++ oferă acces pe mai multe platforme la memoria partajată . De exemplu, biblioteca Boost oferă o clasă boost::interprocess::shared_memory_object[14] pentru sistemele de operare compatibile cu POSIX , iar biblioteca Qt oferă o clasă QSharedMemorycare unifică accesul la memoria partajată între sistemele de operare cu unele restricții [15] .
În Java 7 sub sistemul de operare GNU/Linux , memoria partajată poate fi implementată prin maparea unui fișier dintr-un director /dev/shm/(sau /run/shm/, în funcție de distribuție) la memorie [16] folosind o metodă mapde clasă java.nio.MappedByteBuffer[17] .
Suportul pentru memorie partajată a fost implementat în multe alte limbaje de programare . Astfel, PHP oferă un API [18] pentru crearea memoriei partajate, ale cărei funcții sunt similare cu cele ale POSIX .
Comunicarea intraprocesuala | |
---|---|
Metode | |
Protocoale și standarde selectate |