Características:
El dibujo anterior es un sistema de memoria compartida con acceso uniforme a la memoria (UMA), esto es, cada procesador o core acceden con las mismas velocidades a la memoria.
Cada proceso o thread generado en este tipo de sistemas tienen acceso a la memoria principal (RAM). La comunicación en este tipo de sistemas depende si se utilizan procesos o threads pues aunque los procesos generados por un proceso principal tienen acceso a la memoria principal, los cambios que haga uno de ellos en una variable (p.ej.) no lo llegan a ver los otros procesos. Esto es distinto con los threads pues un cambio que realice un thread en una variable sí lo pueden ver los otros threads. Lo anterior se debe a las distintas direcciones de memoria que utilizan los procesos vs la misma dirección de memoria que utilizan los threads.
Trabajar sobre este tipo de sistemas tiene ventajas y desventajas. Por ejemplo, crear variables globales o que pueden ser accesadas por todos los threads (variable compartida) facilita la comunicación. Una desventaja es la coordinación para ejecutar instrucciones pues al tener una variable compartida o global debemos crear candados, locks, ya que si un thread por ejemplo con etiqueta $1$ accede a ella, otro thread por ejemplo con etiqueta $2$, no pueda utilizarla hasta que finalice el thread $1$ de usarla. Ver Thread Safety y Race Condition *.
* En una race condition múltiples threads intentan acceder a un recurso compartido, al menos uno de los accesos resulta en una modificación al recurso y posteriormente los siguientes accesos pueden no ver la modificación. A la sección del código que causa la race condition se le llama critical section. Las critical sections se ejecutan con código secuencial o con locks para evitar las race conditions.
Nota:
* En distintas implementaciones hay soporte para sistemas de memoria compartida. La implementación más utilizada por ejemplo de Python es CPython, pero hay otras más, ver liga para explicación de implementaciones de Python. Ver Alternative R implementations y liga#Implementations) para otras implementaciones de R.
Un ejemplo de una máquina de sistema de memoria compartida son las laptops.
En el SO Ubuntu podemos obtener información de cuántos cores tiene mi máquina con el comando lscpu
:
In [1]:
%%bash
lscpu
Revisaremos en los siguientes lenguajes librerías, paquetes y API's para cómputo en sistemas de memoria compartida:
Preguntas de comprehensión:
1) Menciona diferencias que surgen en un programa que se ejecuta en un sistema de memoria compartida contra los que se ejecutan en un sistema de memoria distribuida.
2) ¿A qué se le llama no determinismo y da un ejemplo en el que esto surge en un sistema de memoria compartida?
3) ¿Qué es una critical section? ¿qué es una race condition? ¿cómo se puede lidiar con las critical sections?
4) ¿Cuál es la terminología para nombrar a las variables que pueden ser accesadas por todos los threads y para las variables que sólo pueden ser accesadas por un thread?