Megosztott memória

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 munka rövid leírása

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

Kliens-szerver technológia megvalósítása

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.

Megosztott memória forgatókönyve

  1. A szerver egy szemafor segítségével éri el a megosztott memóriát.
  2. A szerver az adatokat a megosztott memóriába írja.
  3. Az adatírás befejezése után a kiszolgáló a szemafor segítségével felszabadítja a hozzáférést a megosztott memóriához.
  4. A kliens úgy fér hozzá a megosztott memóriához, hogy egy szemafor segítségével lezárja a memória hozzáférését más folyamatok számára.
  5. A kliens beolvassa az adatokat a megosztott memóriából, majd egy szemafor segítségével felszabadítja a memóriát.

Szoftver implementáció

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 rendszereken

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

UNIX System V stílusú megosztott memória

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

  • shmget — egész szám azonosítóhoz kötött osztott memóriaszegmens vagy névtelen osztott memóriaszegmens létrehozása (ha az azonosító helyett az IPC_PRIVATE értéket adjuk meg) [8] ;
  • shmctl - a memóriaszegmens paramétereinek beállítása [9] ;
  • shmat - a szegmens csatlakoztatása a folyamat címteréhez [4] ;
  • shmdt - a szegmens leválasztása a folyamat címteréről [10] .

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ória

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

  • shm_open— POSIX osztott memória objektum  létrehozása vagy csatlakoztatása a név alapján [6] ;
  • shm_unlink — egy megosztott memória objektum törlése a nevével (ebben az esetben az osztott memória szegmens mindaddig létezni fog, amíg az összes folyamatról le nem válik) [11] ;
  • ftruncate - beállítja vagy módosítja a megosztott memória (vagy memórialeképezett fájl) méretét [12] ;
  • mmap — meglévő vagy névtelen megosztott memória szegmenst csatol a folyamat címteréhez [3] .
A Windows család operációs rendszereiben

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 nyelvekben

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

Lásd még

Jegyzetek

  1. Kolisnichenko Denis Nikolaevich. Linux alkalmazások fejlesztése . - BHV-Pétervár, 2012-01-01. — 430 p. — ISBN 9785977507479 . Archivált : 2016. július 23. a Wayback Machine -nál
  2. Hyok-Sung Choi, Hee-Chul Yun. Kontextusváltás és IPC teljesítmény Az uClinux és a Linux közötti összehasonlítás az ARM9 alapú processzoron  //  Samsung Electronics: Technical Report. - 2004. Archiválva : 2016. március 6.
  3. ↑ 1 2 3 mm-es térkép . pubs.opengroup.org. Letöltve: 2016. január 3. Az eredetiből archiválva : 2015. december 6..
  4. ↑ 12 shmat . _ pubs.opengroup.org. Letöltve: 2016. január 3. Az eredetiből archiválva : 2015. december 30.
  5. Rendszer interfészek 2. fejezet . pubs.opengroup.org. Letöltve: 2016. január 3. Az eredetiből archiválva : 2016. január 8..
  6. ↑ 12 shm_open . _ pubs.opengroup.org. Hozzáférés dátuma: 2016. január 3. Az eredetiből archiválva : 2015. november 21..
  7. Kay A. Robbins. UNIX rendszerek programozása: kommunikáció, párhuzamosság és szálak . - Prentice Hall PTR, 2003. - 512. o. Archiválva : 2014. szeptember 22. a Wayback Machine -nél
  8. ↑ 12 shmget . _ pubs.opengroup.org. Letöltve: 2016. január 3. Az eredetiből archiválva : 2016. március 5..
  9. shmctl . pubs.opengroup.org. Hozzáférés dátuma: 2016. január 3. Az eredetiből archiválva : 2015. december 7.
  10. shmdt . pubs.opengroup.org. Letöltve: 2016. január 3. Az eredetiből archiválva : 2015. december 12.
  11. shm_unlink . pubs.opengroup.org. Letöltve: 2016. január 3. Az eredetiből archiválva : 2015. november 9..
  12. fcsonka . pubs.opengroup.org. Hozzáférés dátuma: 2016. január 3. Az eredetiből archiválva : 2016. február 1..
  13. Elnevezett megosztott memória létrehozása . Letöltve: 2014. június 26. Az eredetiből archiválva : 2014. június 5..
  14. Memóriamegosztás folyamatok között - 1.60.0 . www.boost.org. Hozzáférés dátuma: 2016. január 4. Az eredetiből archiválva : 2015. december 29.
  15. QSharedMemory Class | Qt Core 5.5 . doc.qt.io. Hozzáférés időpontja: 2016. január 4. Eredetiből archiválva : 2015. december 7.
  16. shm_overview(7) - Linux kézikönyv oldal . man7.org. Hozzáférés időpontja: 2016. január 4. Eredetiből archiválva : 2016. január 4.
  17. MappedByteBuffer (Java Platform SE 7) . docs.oracle.com. Hozzáférés dátuma: 2016. január 4. Eredetiből archiválva : 2016. január 15.
  18. Megosztott memóriafunkciók a PHP-API-ban . Letöltve: 2014. június 26. Az eredetiből archiválva : 2014. június 25.