Memòria compartida

De Viquipèdia
Jump to navigation Jump to search

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[modifica]

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[1][2] (UMA): És una arquitectura de memòria compartida on tots els processadors comparteixen la memòria física (memòria principal) mitjançant un bus de dades. L'accés a memòria es uniforme amb independentcia 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)[3] pròpia, però s'ha de garantir la coherència de dades.
  • Accés no uniforme a memòria[4][5] (NUMA): És una arquitectura de memòria on els diferents processadors estan interconnectats de manera directa o per mitjà d'un processador comú que fa d'intermediari. 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é. És a dir, si l'accés és a la memòria pròpia del processador sol·licitant serà ràpid, però si l'accés és a la memòria d'un altre processador llavors el temps de resposta varia en funció del nombre de processadors intermediaris.

Software[modifica]

En el software d'ordinadors, la memòria pot ser:

  • Un mètode de Comunicació entre processos (de l'anglès IPC),[6] 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,[7] Unix domain socket[8] o CORBA).[9] D'altra banda, és menys escalable, com per exemple, si varis processos els quals 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 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[modifica]

Quan realitzem una execució multi-fils (multithreading)[10][11] 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 difernts Threads d’execució puguin compartir diferents recursos d’un o varis cores, així com la memoria caché, unitats de comput i Translation lookaside buffer[12] (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 ens pot provocar una mala concurrència, incoherència de les dades i interferències entre threads. Tot això pot desencadenar en una disminució del rendiment, un augment del temps d’execució o un mal funcionament del programa.

OpenMP[modifica]

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 assignarà un identificador(id) diferent de 0. En aquesta implementació a més es podrà especificar l’ús i gestió de variables que siguin compartides o privades per a cada fil.

Suport a altres plataformes[modifica]

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[13] i Qt que facilita QSharedMemory.

Altres llenguatges com PHP tenen suport natiu de la memòria compartida.

Referències[modifica]