2.2 Sistemas de memoria compartida o shared memory systems

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:

  • Para generar procesos o threads en los lenguajes de programación de C, Python o R, utilizamos las librerías, API's o extensiones vía paquetes a tales lenguajes pues tanto C, Python como R en sus implementaciones* más utilizadas, fueron diseñados con el propósito de utilizarse sobre sistemas con un sólo procesador.

* 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


Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2
On-line CPU(s) list: 0,1
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           2
Vendor ID:           GenuineIntel
CPU family:          6
Model:               61
Model name:          Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
Stepping:            4
CPU MHz:             2699.587
BogoMIPS:            5399.17
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            3072K
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht pbe syscall nx pdpe1gb lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq dtes64 ds_cpl ssse3 sdbg fma cx16 xtpr pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase bmi1 avx2 bmi2 erms xsaveopt arat

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?