# Memòria compartida

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.

## Hardware

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:
* Accés uniforme a memòria (UMA): És una arquitectura de memòria compartida, on una sola memoria (memòria principal) és utilitzada per a tots els processadors que presenta el sistema mitjançant un bus de dades. Tots els processadors tenen el mateix temps (latencia) i velocitat d'accés a la memòria. L'accés a memòria es uniforme amb independècia del processador que realitza la sol·licitud de les dades i de la posició de memòria a la que s'accedeix. En aquesta arquitectura cada processador pot utilitzar una memòria cau (en anglès cache) pròpia, però s'ha de garantir la coherència de dades. És un model satisfacori per aplicacions de propósits generals i temps compartit per a diferents usuaris.
* Accés no uniforme a memòria (Arquitectura NUMA): És una arquitectura de memòria on els diferents processadors estàn connectats amb una memòria propia dedicada (Memòria cau). Aquestes petites memòries es combinen per formar un únic espai de direccions. Tots els processadors estan interconnectats de manera directa o per mitjà d'un processador comú que fa d'intermediari. A diferència de UMA, l'accés a memòria no és uniforme perquè varia segons on es troba el processador que sol·licita les dades respecte al bloc de memòria que las conté. Quan el accés és a la memòria local del processador, s'elimina la latència. Aquesta arquitectura, està dissenyada per augmentar l'ample de banda de la memòria.

## Software

En el software d'ordinadors, la memòria pot ser:
* Un mètode de Comunicació entre processos (de l'anglès IPC), per exemple una manera d'intercanviar dades entre programes executant-se al mateix temps. Un procés crearà una àrea en la RAM la qual podrà ser accedida per altres programes.
* Un mètode de conservar més espai de memòria es utilitzant mapejats de memòria virtual, és a dir, redirigir els accesos de memòria a una sola instància de les dades en comptes de duplicar-les. Aquest mètode és utilitzat comunament per a llibreries compartides i per XIP.
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.

## Multithreading

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

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.

## Suport a altres plataformes

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 i Qt que facilita QSharedMemory.
Altres llenguatges com PHP tenen suport natiu de la memòria compartida.

## Referències

* ↑ «Boost interprocess» (en anglés). Ion Gaztanaga.