Дељена меморија (енгл.Shared Memory) у рачунарским системима је РАМ меморија (енгл.RAM) којој може да се истовремено приступи од стране више програма са намером да се оствари комуникација између тих програма или да се избегне непотребно копирање идентичних података.
У архитектури рачунара, дељена меморија углавном означава РАМ меморију којој може да приступи више централних процесорских јединица (енгл.CPU) у вишепроцесорским рачунарским системима (en:Multiprocessing). Пошто у вишепроцесорским рачунарским системима дељена меморија врло лако може да постане уско грло, већина система има и низ кеш меморија између процесора и дељене меморије. Да би се осигурао конзистентан приступ подацима у дељеној меморији, кеш меморија и процесори се придржавају неког протокола за кохерентан приступ дељеној меморији.
Системи са дељеном меморијом су релативно једноставни за програмирање зато што сви процесори имају приступ истој меморији (самим тим и истим структурама података у тој меморији) и комуникација између процесора може бити брза колико и приступ тој заједничкој дељеној меморији.
У хардверу
У хардверу рачунара, дељена меморија се односи на (обично велике) блокове меморије са случајним приступом (RAM) којој може приступити неколико различитих процесора (CPU) у вишепроцесорским рачунарским системима.
Системеи са дељеном меморијом су релативно лаки за програмирање, јер сви процесори деле један приказ података и комуникација између процесора може бити тако брза као меморијски приступ истој локацији. Проблем са системима са дељеном меморијом је тај да многи процесори захтевају брз приступ меморији и вероватно кеш меморији, који има две компликације:
Веза CPU-меморија постаје уско грло. Рачунари са дељеном меморијом не могу размеравати баш добро. Већина њих има десет или мање процесора.
Кеш кохеренција: Кад год се кеш ажурира са информацијама које се могу користити од стране других процесора, промена треба да се огледа у другим процесорима, у супротном различити процесори ће радити са неусаглашеним подацима. Такви кохерентни протоколи могу, кад добро раде, обезбедити приступ изузетно високих перформанси дељеним информацијама између више процесора. С друге стране, они понекад могу постати преоптерећени и постати уско грло за перформансе.
Технологије попут енгл.crossbar switch, Omega network, HyperTransport или Front-side bus могу да се користе да ублаже ефекте уског грла.
метод међупроцесне комуникације (IPC), односно начин размене података између програма који раде у исто време. Један процес ће створити простор у RAM меморију којем ће други процеси моћи приступити, или
метод очувања меморијског простора помоћу директног приступа ономе што би обично било копија дела података на једну инстанцу уместо тога, применом мапирања виртуелне меморије или са експлицитном подршком програма који је у питању. Ово се најчешће користи за дељене библиотеке и за енгл.XIP.
Пошто оба процеса могу да приступе дељеном меморијском простору као редовна радна меморија, ово је веома брз начин комуникације (за разлику од других механизама IPC-а попут (енгл.named pipe, Unix domain socket или CORBA). С друге стране, мање је моћна, као на пример, процеси комуникације морају да раде на истој машини (од других IPC метода само сокети интернет домена (не сокети UNIXа) могу да користе утичнице користе рачунарске мреже), и мора се водити рачуна да се избегну проблеми ако процеси дељене меморије раде на одвојеним процесорима и у основи архихектуре није повезан кеш.
IPC, од стране дењене меморије, се користи, на пример, за пренос слике између апликације и Икс сервера на Јуникс системима, или унутар енгл.IStream враћених објеката од стране енгл.CoMarshalInterThreadInterfaceInStream у COM библиотекама под Windows оперативним системом.
Динамичке библиотеке се обично једном одржавају у меморији и маприрају у више процеса, и само странице које је требало прилагодити за појединачни процес (јер је тамо симбол другачије решен) су дуплиране, обично са механизмом познатим као енгл.copy-on-write који на транспарентан начин копира страницу када је у питању покушај писања, а затим омогућава успешно писање на приватној копији.
Подршка на Јуникс (UNIX) платформама
Посикс обезбеђује стандардизован API за коришћење дељене меморије, Посикс Дељена Меморија. Ово користи функцију shm_open из sys/mman.h.[1] Посикс интерпроцесорске комунукације (део енгл.POSIX:XSI екстензије) укључујући функције дељене меморије shmat, shmctl, shmdt и shmget.[2][3]
Јуникс Систем V обезбеђује API и за дељену меморију. Користи shmget из sys/shm.h. BSD системи обезбеђују "анонимну мапирану меморију" коју могу да користе неколико процеса.
Дељена меморија креирана помоћу shm_open је издржљива. Она остаје у систему док је изричито не уклони процес. Ово има недостатак, да ако се процес "сруши" и не очисти дељену меморију, она ће остати све до искључивања система. Да бисте избегли овај проблем, mmap може да се користи за креирање дељене меморије.[4] Два процеса која комуницирају, треба да отворе привремени фајл са истим именом и да на њему ураде mmap да би добили пресликавање фајла у меморију. Као резултат промена, пресликана меморија је видљива од стране оба процеса истовремено. Предност ових приступа је да када оба процеса излазе, оперативни систем ће аутоматски затворити фајлове и уклонити заједничку меморију.
Недавне Линуксове дистрибуције засноване на кернелу 2.6, су почеле да нуде /dev/shm као дељену меморију у облику RAM диска, конкретно као world-writable директоријум (директоријум у коме сваки корисник система може да креира датотеке) који се чува у меморији. И енгл.RedHat и Debijan су засновани на дистрибуцијама и укључују их као подразумеване. Подршка за овај тип RAM диска је потпуно опциона унутар кернелове датотеке за конфигурацију.[5]
Подршка на другим платформама
На Windows-у, функција CreateSharedMemory може да се користи да се креира дељена меморија.[6] Алтернативно се може користити CreateFileMapping и MapViewOfFile функције[7]
Неке C++ библиотеке пружају преносиви и објектно-оријентисани приступ функционалности дељене меморије. На пример, енгл.Boost садржи Boost. Интерпроцесорску C++ Библиотеку.[8]Qt обезбеђује QSharedMemory class.[9]
Постоји уграђена подршка за дељену меморију, исто у програмским језицима, поред језика C/C++. На пример, PHP обезбеђује API да би креирао дељену меморију, слично Посикс функцијама.[10]