# Barrera de memòria

En informàtica, una barrera de memòria, també coneguda com a membar, tanca de memòria o instrucció de tanca, és un tipus d'instrucció de barrera que fa que una unitat de processament central (CPU) o un compilador faci complir una restricció d'ordre en les operacions de memòria emeses abans i després de la barrera. instrucció. Normalment, això significa que es garanteix que les operacions emeses abans de la barrera es realitzen abans que les operacions emeses després de la barrera.
Les barreres de memòria són necessàries perquè la majoria de les CPU modernes utilitzen optimitzacions de rendiment que poden provocar una execució fora d'ordre. Aquesta reordenació de les operacions de memòria (càrregues i emmagatzematges) normalment passa desapercebuda dins d'un sol fil d'execució, però pot provocar un comportament impredictible en programes i controladors de dispositiu concurrents tret que es controli acuradament. La naturalesa exacta d'una restricció d'ordenació depèn del maquinari i està definida pel model d'ordenació de memòria de l'arquitectura. Algunes arquitectures proporcionen múltiples barreres per fer complir diferents restriccions d'ordenació.
Les barreres de memòria s'utilitzen normalment quan s'implementa codi de màquina de baix nivell que funciona amb memòria compartida per diversos dispositius. Aquest codi inclou primitives de sincronització i estructures de dades sense bloqueig en sistemes multiprocessador i controladors de dispositiu que es comuniquen amb el maquinari de l'ordinador.

## Exemple

Quan un programa s'executa en una màquina d'una sola CPU, el maquinari realitza la comptabilitat necessària per assegurar-se que el programa s'executa com si totes les operacions de memòria s'haguessin realitzat en l'ordre especificat pel programador (ordre del programa), de manera que no calen barreres de memòria. Tanmateix, quan la memòria es comparteix amb diversos dispositius, com ara altres CPU d'un sistema multiprocessador o perifèrics assignats a memòria, l'accés fora d'ordre pot afectar el comportament del programa. Per exemple, una segona CPU pot veure els canvis de memòria realitzats per la primera CPU en una seqüència que difereix de l'ordre del programa.
Un programa s'executa mitjançant un procés que pot ser multifil (és a dir, un fil de programari com pthreads en lloc d'un fil de maquinari). Els diferents processos no comparteixen un espai de memòria, de manera que aquesta discussió no s'aplica a dos programes, cadascun s'executa en un procés diferent (per tant, un espai de memòria diferent). S'aplica a dos o més fils (de programari) que s'executen en un sol procés (és a dir, un sol espai de memòria on diversos fils de programari comparteixen un únic espai de memòria). Diversos fils de programari, dins d'un sol procés, es poden executar simultàniament en un processador de diversos nuclis.
El següent programa multifils, que s'executa en un processador multinucli, ofereix un exemple de com aquesta execució fora d'ordre pot afectar el comportament del programa:
Inicialment, les ubicacions de memòria x i f tenen el valor 0. El fil de programari que s'executa al processador núm. 1 fa un bucle mentre el valor de f és zero, després imprimeix el valor de x. El fil de programari que s'executa al processador #2 emmagatzema el valor 42 a x i després emmagatzema el valor 1 a f. A continuació es mostra el pseudocodi dels dos fragments de programa.
Els passos del programa corresponen a instruccions individuals del processador.
En el cas del processador PowerPC, la instrucció eioio assegura, com a tanca de memòria, que qualsevol operació de càrrega o emmagatzematge iniciada prèviament pel processador s'ha completat completament respecte a la memòria principal abans que qualsevol operació de càrrega o emmagatzematge posterior iniciada pel processador accedeixi al memòria principal.
Fil 1 Nucli 1:
Fil 2 Nucli 2:
Es podria esperar que la declaració d'impressió imprimeixi sempre el número "42"; tanmateix, si les operacions d'emmagatzematge del fil núm. 2 s'executen fora d'ordre, és possible que f s'actualitzi before x, per tant, la sentència d'impressió podria imprimir "0". De la mateixa manera, les operacions de càrrega del fil núm. 1 es poden executar fora d'ordre i és possible que x es llegeixi before de comprovar f, i una altra vegada la instrucció d'impressió pot imprimir un valor inesperat. Per a la majoria de programes cap d'aquestes situacions és acceptable. S'ha d'inserir una barrera de memòria abans de l'assignació del fil núm. 2 a f per assegurar-se que el nou valor de x és visible per a altres processadors en o abans del canvi en el valor de f. Un altre punt important és que també s'ha d'inserir una barrera de memòria abans de l'accés del fil #1 a x per assegurar-se que el valor de x no es llegeix abans de veure el canvi en el valor de f.
Un altre exemple és quan un controlador realitza la següent seqüència:
Si les operacions de magatzem del processador s'executen fora d'ordre, el mòdul de maquinari es pot activar abans que les dades estiguin a punt a la memòria.
Per obtenir un altre exemple il·lustratiu (un no trivial que sorgeix a la pràctica real), vegeu el bloqueig de doble verificació.

## Referències

* ↑ Hawthorne, Mel. «What Is a Memory Barrier?» (en anglès americà), 07-11-2022. [Consulta: 19 setembre 2024].
* ↑ «[https://ics.uci.edu/~aburtsev/cs5460/lectures/lecture13-memory-ordering/lecture13-memory-barriers.pdf CS5460/6460: Operating Systems Lecture 13: Memory barriers]» (en anglès). [Consulta: 20 setembre 2024].
* ↑ May, Cathy. The PowerPC Architecture: A Specification for a New Family of RISC Processors (en anglès). Morgan Kaufmann Publishers, 1993, p. 350. ISBN 1-55860-316-6.
* ↑ Kacmarcik, Cary. Optimizing PowerPC Code (en anglès). Addison-Wesley Publishing Company, 1995, p. 188. ISBN 0-201-40839-2.