Az osztott memória a folyamatok közötti adatcsere leggyorsabb eszköze [1] .
Más folyamatközi kommunikációs ( IPC ) eszközökben a folyamatok közötti kommunikáció a kernelen keresztül megy végbe , ami kontextusváltást eredményez a folyamat és a kernel között, azaz. teljesítményveszteségekhez [2] .
Az osztott memória technika lehetővé teszi az információcserét egy megosztott memória szegmensen keresztül a folyamatok számára kernel rendszerhívások használata nélkül. Az osztott memória szegmens a folyamat virtuális címterének szabad részéhez kapcsolódik [3] . Így két különböző folyamat különböző címekkel rendelkezhet ugyanazon megosztott memóriahelyen.
A megosztott memória szegmens létrehozása után bármelyik felhasználói folyamat hozzákapcsolhatja azt a saját virtuális teréhez, és úgy dolgozhat vele, mint egy normál memóriaszegmenssel. Az ilyen információcsere hátránya a szinkronizálási eszközök hiánya, azonban ennek a hátránynak a kiküszöbölésére a szemafor technika használható .
A megosztott memóriát használó két folyamat ( kliens és szerver ) közötti adatcsere sémájában két szemaforból álló csoportnak kell működnie. Az első szemafor az osztott memóriához való hozzáférés blokkolására szolgál, engedélyező jele 1, tiltó jele 0. A második szemafor arra szolgál, hogy jelezze a szervernek, hogy a kliens megkezdte a munkát, míg a megosztott memóriához való hozzáférés blokkolva van, ill. a kliens adatokat olvas ki a memóriából. Most, amikor a műveletet a szerver meghívja, a működése felfüggesztésre kerül, amíg a kliens fel nem szabadítja a memóriát.
A szoftverben az osztott memóriát:
Mivel mindkét folyamat normál memóriaként hozzáférhet a megosztott memóriaterülethez, ez egy nagyon gyors módja a kommunikációnak (ellentétben más IPC-mechanizmusokkal, mint például a named pipes , UNIX sockets vagy CORBA ). Másrészt ez a módszer kevésbé rugalmas, például a kommunikációs folyamatoknak ugyanazon a gépen kell futniuk (a felsorolt IPC módszerek közül csak a hálózati socketek tudnak kommunikálni, nem összetévesztendő a UNIX tartományi socketekkel) , és ügyelni kell arra, hogy elkerüljük a problémákat, amikor a megosztott memóriát különböző processzormagokon és hardverarchitektúrán használjuk koherens gyorsítótár nélkül .
Az osztott memória kommunikációja például képek átvitelére szolgál egy alkalmazás és egy X szerver között Unix rendszereken, vagy a CoMarshalInterThreadInterfaceInStream által visszaadott IStream objektumon belül a Windows COM könyvtárban.
A megosztott könyvtárak általában egyszer töltődnek be a memóriába, és több folyamatra vannak leképezve, és csak az egyetlen folyamatra jellemző oldalak duplikálódnak (mivel bizonyos azonosítók különböznek egymástól), általában a másolás írásra nevű mechanizmussal , amely írási kísérletkor az osztott memóriába, csendben az írást hívó folyamathoz, átmásolja a memória lapjait, majd az adatokat a másolatba írja.
UNIX-szerű operációs rendszerekenA POSIX szabványos API -t biztosít a megosztott memóriával való munkához, a POSIX Shared Memory . A UNIX operációs rendszercsalád egyik legfontosabb jellemzője a folyamatmásoló mechanizmus (rendszerhívás fork()), amely lehetővé teszi a megosztott memória névtelen területeinek létrehozását a folyamat másolása előtt, és azokat a leszármazott folyamatok által örökölheti. A folyamat másolása után a megosztott memória a szülő és a gyermekfolyamat számára is elérhető lesz. [3] [4]
Két különböző megközelítés létezik a megosztott memória csatlakoztatására és használatára:
A UNIX System V egy sor C nyelvi funkciót biztosít, amelyek lehetővé teszik az osztott memóriával való munkát [7] :
Az elnevezett megosztott memória azt jelenti, hogy minden memóriahelyhez egyedi számkulcs tartozik az operációs rendszeren belül, amely később egy másik folyamat során használható a megosztott memória csatlakoztatására. [nyolc]
POSIX megosztott memóriaA POSIX lehetővé teszi, hogy fájlleírót társítson egy megosztott memória objektumhoz , ami egységesebb mechanizmus, mint a UNIX System V. A következő C nyelvi funkciók használhatók a memória kezeléséhez:
A Windows operációs rendszeren az MSDNCreateFileMapping függvényei és MapViewOfFile[13] -ja megosztott memória létrehozására szolgál .
Támogatás programozási nyelvekbenEgyes C++-könyvtárak platformközi hozzáférést kínálnak a megosztott memóriához . Például a Boost könyvtár egy osztályt boost::interprocess::shared_memory_object[14] biztosít a POSIX-kompatibilis operációs rendszerek számára, a Qt könyvtár pedig egy olyan osztályt QSharedMemory, amely bizonyos korlátozásokkal egyesíti a megosztott memóriához való hozzáférést az operációs rendszerek között [15] .
A Java 7 -ben GNU/Linux operációs rendszer alatt az osztott memória úgy valósítható meg, hogy egy fájlt egy könyvtárból /dev/shm/(vagy /run/shm/a disztribúciótól függően) a memóriába [16] leképez egy maposztálymetódus java.nio.MappedByteBuffer[17] segítségével .
Az osztott memória támogatását számos más programozási nyelven is megvalósították . Így a PHP egy API -t [18] biztosít az osztott memória létrehozásához, amelynek funkciói hasonlóak a POSIX funkcióihoz .
Folyamatközi kommunikáció | |
---|---|
Mód | |
Válogatott protokollok és szabványok |