Deljena memorija

S Vikipedije, slobodne enciklopedije

Deljena memorija (engl. Shared Memory) u računarskim sistemima je RAM memorija (engl. RAM) kojoj može da se istovremeno pristupi od strane više programa sa namerom da se ostvari komunikacija između tih programa ili da se izbegne nepotrebno kopiranje identičnih podataka.

Ilustracija sistema deljene memorije tri računara

U arhitekturi računara, deljena memorija uglavnom označava RAM memoriju kojoj može da pristupi više centralnih procesorskih jedinica (engl. CPU) u višeprocesorskim računarskim sistemima (en:Multiprocessing). Pošto u višeprocesorskim računarskim sistemima deljena memorija vrlo lako može da postane usko grlo, većina sistema ima i niz keš memorija između procesora i deljene memorije. Da bi se osigurao konzistentan pristup podacima u deljenoj memoriji, keš memorija i procesori se pridržavaju nekog protokola za koherentan pristup deljenoj memoriji.

Sistemi sa deljenom memorijom su relativno jednostavni za programiranje zato što svi procesori imaju pristup istoj memoriji (samim tim i istim strukturama podataka u toj memoriji) i komunikacija između procesora može biti brza koliko i pristup toj zajedničkoj deljenoj memoriji.

U hardveru[uredi | uredi izvor]

U hardveru računara, deljena memorija se odnosi na (obično velike) blokove memorije sa slučajnim pristupom (RAM) kojoj može pristupiti nekoliko različitih procesora (CPU) u višeprocesorskim računarskim sistemima.

Sistemei sa deljenom memorijom su relativno laki za programiranje, jer svi procesori dele jedan prikaz podataka i komunikacija između procesora može biti tako brza kao memorijski pristup istoj lokaciji. Problem sa sistemima sa deljenom memorijom je taj da mnogi procesori zahtevaju brz pristup memoriji i verovatno keš memoriji, koji ima dve komplikacije:

  • Veza CPU-memorija postaje usko grlo. Računari sa deljenom memorijom ne mogu razmeravati baš dobro. Većina njih ima deset ili manje procesora.
  • Keš koherencija: Kad god se keš ažurira sa informacijama koje se mogu koristiti od strane drugih procesora, promena treba da se ogleda u drugim procesorima, u suprotnom različiti procesori će raditi sa neusaglašenim podacima. Takvi koherentni protokoli mogu, kad dobro rade, obezbediti pristup izuzetno visokih performansi deljenim informacijama između više procesora. S druge strane, oni ponekad mogu postati preopterećeni i postati usko grlo za performanse.

Tehnologije poput engl. crossbar switch, Omega network, HyperTransport или Front-side bus mogu da se koriste da ublaže efekte uskog grla.

Alternativa deljenoj memoriji je raspodeljena memorija i raspodeljena opšta memorija, svaka ima sličan skup proeblematike. Takođe pogledati NUMA.

U softveru[uredi | uredi izvor]

Softveru računara, deljena memorija je ili

  • metod međuprocesne komunikacije (IPC), odnosno način razmene podataka između programa koji rade u isto vreme. Jedan proces će stvoriti prostor u RAM memoriju kojem će drugi procesi moći pristupiti, ili
  • metod očuvanja memorijskog prostora pomoću direktnog pristupa onome što bi obično bilo kopija dela podataka na jednu instancu umesto toga, primenom mapiranja virtuelne memorije ili sa eksplicitnom podrškom programa koji je u pitanju. Ovo se najčešće koristi za deljene biblioteke i za engl. XIP.

Pošto oba procesa mogu da pristupe deljenom memorijskom prostoru kao redovna radna memorija, ovo je veoma brz način komunikacije (za razliku od drugih mehanizama IPC-a poput (engl. named pipe, Unix domain socket или CORBA). S druge strane, manje je moćna, kao na primer, procesi komunikacije moraju da rade na istoj mašini (od drugih IPC metoda samo soketi internet domena (ne soketi UNIXa) mogu da koriste utičnice koriste računarske mreže), i mora se voditi računa da se izbegnu problemi ako procesi deljene memorije rade na odvojenim procesorima i u osnovi arhihekture nije povezan keš.

IPC, od strane denjene memorije, se koristi, na primer, za prenos slike između aplikacije i Iks servera na Juniks sistemima, ili unutar engl. IStream vraćenih objekata od strane engl. CoMarshalInterThreadInterfaceInStream u COM bibliotekama pod Windows operativnim sistemom.

Dinamičke biblioteke se obično jednom održavaju u memoriji i mapriraju u više procesa, i samo stranice koje je trebalo prilagoditi za pojedinačni proces (jer je tamo simbol drugačije rešen) su duplirane, obično sa mehanizmom poznatim kao engl. copy-on-write koji na transparentan način kopira stranicu kada je u pitanju pokušaj pisanja, a zatim omogućava uspešno pisanje na privatnoj kopiji.

Podrška na Juniks (UNIX) platformama[uredi | uredi izvor]

Posiks obezbeđuje standardizovan API za korišćenje deljene memorije, Posiks Deljena Memorija. Ovo koristi funkciju shm_open iz sys/mman.h.[1] Posiks interprocesorske komunukacije (deo engl. POSIX:XSI ekstenzije) uključujući funkcije deljene memorije shmat, shmctl, shmdt i shmget.[2][3] Juniks Sistem V obezbeđuje API i za deljenu memoriju. Koristi shmget iz sys/shm.h. BSD sistemi obezbeđuju "anonimnu mapiranu memoriju" koju mogu da koriste nekoliko procesa.

Deljena memorija kreirana pomoću shm_open je izdržljiva. Ona ostaje u sistemu dok je izričito ne ukloni proces. Ovo ima nedostatak, da ako se proces "sruši" i ne očisti deljenu memoriju, ona će ostati sve do isključivanja sistema. Da biste izbegli ovaj problem, mmap može da se koristi za kreiranje deljene memorije.[4] Dva procesa koja komuniciraju, treba da otvore privremeni fajl sa istim imenom i da na njemu urade mmap da bi dobili preslikavanje fajla u memoriju. Kao rezultat promena, preslikana memorija je vidljiva od strane oba procesa istovremeno. Prednost ovih pristupa je da kada oba procesa izlaze, operativni sistem će automatski zatvoriti fajlove i ukloniti zajedničku memoriju.

Nedavne Linuksove distribucije zasnovane na kernelu 2.6, su počele da nude /dev/shm kao deljenu memoriju u obliku RAM diska, konkretno kao world-writable direktorijum (direktorijum u kome svaki korisnik sistema može da kreira datoteke) koji se čuva u memoriji. I engl. RedHat i Debijan su zasnovani na distribucijama i uključuju ih kao podrazumevane. Podrška za ovaj tip RAM diska je potpuno opciona unutar kernelove datoteke za konfiguraciju.[5]

Podrška na drugim platformama[uredi | uredi izvor]

Na Windows-u, funkcija CreateSharedMemory može da se koristi da se kreira deljena memorija.[6] Alternativno se može koristiti CreateFileMapping i MapViewOfFile funkcije[7]

Neke C++ biblioteke pružaju prenosivi i objektno-orijentisani pristup funkcionalnosti deljene memorije. Na primer, engl. Boost sadrži Boost. Interprocesorsku C++ Biblioteku.[8] Qt obezbeđuje QSharedMemory class.[9]

Postoji ugrađena podrška za deljenu memoriju, isto u programskim jezicima, pored jezika C/C++. Na primer, PHP obezbeđuje API da bi kreirao deljenu memoriju, slično Posiks funkcijama.[10]

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  1. ^ Documentation of shm_open from the Single UNIX Specification
  2. ^ Robbins, Kay A.; Robbins, Steven (2003). UNIX systems programming: communication, concurrency, and threads (2 izd.). Prentice Hall PTR. str. 512. ISBN 978-0-13-042411-2. Pristupljeno 13. 05. 2011. „The POSIX interprocess communication (IPC) is part of the POSIX:XSI Extension and has its origin in UNIX System V interprocess communication. 
  3. ^ Shared memory facility from the Single UNIX Specification.
  4. ^ Stevens, Richard (1999). UNIX Network Programming, Volume 2, Second Edition: Interprocess Communications. (2 izd.). Prentice Hall PTR. str. 311. ISBN 978-0-13-081081-6. 
  5. ^ Rohland, Christoph; Dickins, Hugh; Motohiro, KOSAKI. „tmpfs.txt”. kernel.org. Arhivirano iz originala 17. 04. 2010. g. Pristupljeno 16. 03. 2010. 
  6. ^ CreateSharedMemory function from Win32-SDK
  7. ^ Creating Named Shared Memory from MSDN.
  8. ^ Gaztanaga, Ion (12. 11. 2011). „Boost.Interprocess C++ Library”. Boost.org. Pristupljeno 17. 02. 2014. 
  9. ^ „QSharedMemory Class Reference”. Doc.qt.nokia.com. Arhivirano iz originala 12. 06. 2016. g. Pristupljeno 17. 02. 2014. 
  10. ^ „Shared Memory Functions in PHP-API”. Php.net. Pristupljeno 17. 02. 2014. 

Literatura[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]