La memòria compartida es aquell tipus de memòria que pot ser accedida per múltiples programes alhora, afavorint l'intercanvi de dades entre programes, millorant el rendiment i evitant còpies redundants. Aquest fet converteix la memòria compartida en un mode eficaç de compartir dades entre aplicacions.
Els programes poden executar-se en un mateix processador o en processadors independents, i poden contenir mes d'un fil d'execució on la memòria utilitzada entre els diferents fils d'execució també es coneix com a memòria compartida.
La memòria compartida des del punt de vista hardware s'aconsegueix mitjançant diferents estratègies en el disseny de l'arquitectura i garanteix que tots els processadors del sistema (multiprocessador) tinguin accés a la memòria principal (RAM generalment).
Les arquitectures més utilitzades són les següents:
En el software d'ordinadors, la memòria pot ser:
Com que tots dos processos poden accedir a l'àrea de memòria compartida com una memòria de treball regular, aquest mètode ens proporciona una forma de comunicació ràpida (contràriament a altres mecanismes d'IPC com named pipe, Unix domain socket o CORBA). D'altra banda, és menys escalable. Si varis processos que s'están comunicant resideixen en una mateixa màquina, poden arribar a tenir problemes amb memòria cau si l'arquitectura que tenen per sota i els recursos compartits per diferents CPUs son incoherents.
La Comunicació entre processos de la memòria compartida és utilitzada per transferir imatges entre l'aplicació i el servidor X en sistemes Unix, o dins l'objecte IStream en les llibreries COM en Windows.
Les llibreries dinàmiques es copien una sola vegada en la memòria i son mapejades a múltiples processos i només aquelles pàgines que han de ser personalitzades per processos individuals són duplicades, normalment amb un mecanisme conegut com a copy-on-write (de l'anglès copiar en escriure) el qual copia de forma transparent la pàgina en produir-se una escriptura i després permet l'escriptura en la còpia privada.
Quan realitzem una execució multi-fils (multithreading) d'un programa o d'una secció de codi del programa, el que obtenim es una execució seqüencial per part de cada thread o fil d'execució en paral·lel. Amb aquest tipus d'execució del codi es provoca que els diferents Threads d'execució puguin compartir diferents recursos d'un o varis cores, així com la memoria caché, unitats de còmput i Translation lookaside buffer (TLB).
D'aquesta compartició de recursos, és la memòria compartida la més difícil de gestionar, ja que una mala gestió d'aquesta pot provocar una mala concurrència, incoherència de les dades i interferències entre threads. Tot això pot desencadenar en un empitjorament del rendiment, un augment del temps d'execució o un mal funcionament del programa.
OpenMP es una implementació de multi-fils (multithreading). Es tracta d'un mètode de paral·lelització on un fil (thread) màster (thread 0) divideix l'execució del codi en diferents threads esclaus amb la finalitat de que aquests fils esclaus puguin executar-se de manera concurrent en diferents processadors.
La secció del codi que es vol paral·lelitzar es implementada mitjançant l'ús de directives "#pragma omp" en C/C++ i "!$OMP PARALLEL" en Fortran incloses a la interfície de programació d'aplicacions (API) d'OpenMP, on a cada fil esclau se li assigna un identificador (ID) diferent de 0. En aquesta implementació, a més, es pot especificar l'ús i gestió de variables que siguin compartides o privades per a cada fil.
Windows és una plataforma on es pot utilitzar la funció CreateSharedMemory, CreateFileMapping o MapViewOfFile per crear memòria compartida.
Al llenguatge de programació C++ existeixen biblioteques que proporcionen accés portable i orientat a objectes, com per exemple Boost que inclou Boost.Interprocess[1] i Qt que facilita QSharedMemory.
Altres llenguatges com PHP tenen suport natiu de la memòria compartida.