Pamięć dzielona – rodzaj pamięci, z której może jednocześnie korzystać wiele programów. Służy do umożliwienia komunikacji pomiędzy nimi lub uniknięcia redundantnych kopii. W zależności od kontekstu, programy mogą być uruchamiane na pojedynczym lub wielu osobnych procesorach. Pamięć wykorzystywana do komunikacji w obrębie pojedynczego programu, na przykład pomiędzy jego wieloma wątkami, zwykle nie jest nazywana pamięcią dzieloną.
Sprzęt
W warstwie sprzętowej pamięć dzielona odnosi się (zwykle) do dużego bloku RAM, do którego dostęp może uzyskać wiele procesorów wieloprocesorowego systemu komputerowego. System taki jest stosunkowo łatwo programowalny ponieważ wszystkie procesory dzielą wspólny widok danych, a komunikacja pomiędzy procesorami może być tak szybka, jak dostęp do pamięci w tej samej lokalizacji.
Zagadnienie systemów z pamięcią dzieloną polega na tym, że wiele procesorów potrzebuje szybkiego dostępu do pamięci i będą prawdopodobnie buforować pamięć, z czym wiążą się dwie komplikacje:
- połączenie procesor-pamięć staje się wąskim gardłem. Komputery z dzieloną pamięcią nie radzą sobie dobrze ze skalowaniem. Większość z nich ma dziesięć lub mniej procesorów.
- spójność pamięci cache: kiedy jeden z cache'ów jest aktualizowany, zmiana taka musi być rozpropagowana na wszystkie procesory, aby zapewnić spójność danych. Istnieją odpowiednie protokoły zapewniania spójności, które w optymalnych warunkach zapewniają dobrą wydajność, lecz z drugiej strony przy dużej liczbie modyfikacji mogą ulec przeciążeniu.
Alternatywami dla pamięci dzielonej są pamięć rozproszona i rozproszona pamięć dzielona, z każdą z nich związane są podobne zagadnienia (zobacz też: niejednolity dostęp do pamięci).
Oprogramowanie
W oprogramowaniu komputerowym pamięć dzielona oznacza jedno z dwóch pojęć:
- metodę komunikacji międzyprocesowej, tj. sposób wymiany danych pomiędzy programami uruchomionymi jednocześnie. Jeden proces tworzy obszar w pamięci RAM, do którego pozostałe procesy mają dostęp.
- metodę konserwacji przestrzeni pamięci poprzez kierowanie pamięci do pojedynczej instancji (zamiast kopii fragmentów danych), za pomocą mapowania pamięci wirtualnej lub bezpośredniego wsparcia danego programu. Jest to najczęściej wykorzystywane w bibliotekach współdzielonych oraz przez XIP.
Jako że oba procesy uzyskują dostęp do obszaru dzielonej pamięci podobnie jak do normalnej pamięci roboczej, jest to bardzo szybki sposób komunikacji (w przeciwieństwie do innych mechanizmów komunikacji międzyprocesowej takich jak łącza nazwane, gniazdo dziedziny Uniksa czy CORBA). Z drugiej strony nie jest równie mocny, ponieważ biorące w komunikacji procesy muszą być uruchomione na tym samym sprzęcie (podczas gdy inne metody mogą korzystać z sieci komputerowych). Należy także zadbać o odpowiednią synchronizację dostępu.
Komunikacja międzyprocesowa jest używana przez dzieloną pamięć między innymi do transferowania obrazków pomiędzy aplikacją i serwerem X Window System w systemach uniksowych lub w obrębie obiektu IStream
zwracanego przez CoMarshalInterThreadInterfaceInStream
w bibliotekach COM w systemie Windows.
Biblioteki dynamiczne są zwykle przechowywane w pamięci i mapowane na wiele procesów. Duplikowane są jedynie strony specyficzne dla konkretnego procesu, zwykle poprzez mechanizm leniwego kopiowania (kopia tworzona jest przy pierwszej próbie modyfikacji).
POSIX dostarcza ustandaryzowany interfejs programowania aplikacji dla pamięci dzielonej, które wykorzystuje funkcję shmget()
z sys/shm.h
.
Systemy BSD dostarczają "anonimową pamięć mapowaną", która może być wykorzystana przez wiele procesów.
Niektóre buildy linuksowego jądra 2.6 zaczęły oferować folder /dev/shm
jako pamięć dzieloną w postaci ramdysku.