# data[].attributes.body
Los multiprocesadores son computadoras que tienen memoria compartida y se pueden clasificar en:
UMA (uniform memory acces).
NUMA (nonuniform memory access).
COMA (cache only memory access).

# data[].attributes.body
Todos los accesos a memoria tardan el mismo tiempo. La memoria se encuentra, dividida en módulos a los que se accede a través de una red de interconexión basada en switches. Eso es cierto y, para conseguir esta uniformidad de acceso, se tiene que aumentar el tiempo de los accesos más rápidos. El hecho de que todos los procesadores accedan al mismo bus para acceder a memoria puede significar un cuello de botella.

# data[].attributes.body
En los multiprocesadores NUMA los accesos a memoria pueden
tener tiempos distintos. En estas máquinas la memoria también está compartida, pero los
módulos de memoria están distribuidos entre los diferentes procesadores con el objetivo
de reducir la contención de acceso a memoria.
El módulo de memoria que está junto a un procesador en un mismo nodo recibe el nombre
de memoria local a este procesador. Así, los accesos de un procesador a su memoria
local suelen ser mucho más rápidos que los accesos a la memoria local de otro procesador
(memoria remota). Se incorporaron las cachés para reducir la contención de memoria.

# data[].attributes.body
La arquitectura COMA (cache onlymemory access) tratan la memoria principal como una memoria caché grande. Las páginas de memoria desaparecen y todos los datos se tratan como líneas de caché. pueden requerir de soporte hardware adicional. Normalmente se implementan utilizando un mecanismo de directorio distribuido.

# data[].attributes.headline
Conexión a memoria basada en un crossbar

# data[].attributes.subject
Conexión a memoria basada en un crossbar

# data[].attributes.body
Las redes de interconexión crossbar conectan los procesadores del sistema a los bancos de memoria que forman la memoria compartida evitando los conflictos en los accesos, es decir, evita el problema de escalabilidad de rendimiento. Esta consiste en una malla de switches que permite la conexión no bloqueante de cualquier procesador a cualquier banco de memoria. Cada switch del crosbar puede ser electrónicamente cerrado o abierto, permitiendo o no que la línea vertical se conecte a la línea horizontal, respectivamente.

La desventaja de este sistema de conexión con memoria es que se precisan alrededor de P ²switches para poder montar este sistema, siendo este coste importante.

# data[].attributes.body
En este sistema es que todos los procesadores están conectados con la memoria de “forma directa”, y todos están a una distancia de un bus. En estas conexiones una parte del bus se utiliza para comunicar la dirección de memoria a la que se quiere acceder, otra para los datos, y otra para las señales de control. La gran desventaja de estos sistemas es la poca escalabilidad que tienen desde el punto de vista de rendimiento si es que el número de procesadores conectados es muy elevado, pero una forma de aliviar esta desventaja es incorporar cachés a los procesadores o incorporando memorias privadas en cada procesador.

# data[].attributes.headline
Conexion a memoria basada en un multistage

# data[].attributes.subject
Conexion a memoria basada en un multistage

# data[].attributes.body
Los sistemas basados en multistage consisten en una serie de etapas que están unas conectadas a las otras de tal forma que se conecten los procesadores con los bancos de memoria. Este tipo de sistema de conexión es menos costoso que un sistema basado en crossbar, ya que ahora sólo se necesitan P/2 × log p switches, en comparación con los P × P switches del crossbar. Sin embargo, esta reducción de coste se produce como contrapartida al hecho de que dos accesos desde dos procesadores pueden necesitar compartir un mismo switch, por lo tanto, uno de los accesos se deberá bloquear y esperar a que el otro acabe de hacer el acceso.

# data[].attributes.body
La consistencia estricta garantiza que los valores que se ven en memoria estén en estricto orden de escritura. En este modelo de consistencia, cualquier lectura sobre una posición de memoria deberá tener como resultado la ultima escritura realizada en esa posición de memoria.
Por ejemplo si una CPU 0 realiza un acceso de escritura de valor X en una posición de memoria, una CPU 1 realiza un acceso de escritura de valor Y en la misma posición de memoria y una CPU 2 realiza un acceso de lectura del valor de esa misma posición de memoria, recibiría el valor Y.

# data[].attributes.body
La consistencia secuencial garantiza que los valores que se ven en memoria se vean en el mismo orden por todas las CPU. No importan si es en un orden diferente al que se hicieron las escrituras.
Por ejemplo, si CPU 0 y CPU 1 realizan un acceso de escritura de valores X y Y sobre la misma posición de memoria, separados mínimamente en el tiempo. Y poco después las CPU'S 2 y 3 realizan dos accesos de lectura en esa misma memoria, ambas CPU'S verían el mismo valor, ya sea X o Y, sin importar el orden en cual fueran escritas.

# data[].attributes.body
El problema de consistencia de memoria aparece cuando una memoria está formada por varios módulos de memoria conectados a través de una red de interconexión a un conjunto de procesadores. En particular, cuando varios procesadores acceden a un dato para escritura.
Un modelo de consistencia es el conjunto de normas que nos indica qué valores deberían ver los procesadores en sucesivas lecturas de una o varias posiciones de memoria.
Algunos de los modelos de consistencia conocidos son: strict consistency, sequencial consistency, processor consistency, weak consistency y release consistencty

# data[].attributes.body
La consistencia weak no garantiza nigún orden entre
las escrituras de un mismo procesador, pero dispone
que hay unas operaciones de sincronización que garantizan que todas las operaciones de escrituras se deben acabar antes de que esta operación acabe.

# data[].attributes.body
La consistencia de procesador garantiza que los valores que se ven en memoria respetan el orden de las escrituras de un procesador. Sin embargo, dos procesadores pueden ver diferentes órdenes de escrituras.
Por ejemplo, si la CPU 0 realizas las escrituras 1, 2 y 3 sobre una posición de memoria 'm', el resto de CPU sólo podrán ver este orden de escrituras sobre la posición de memoria 'm'. Si ahora de forma intercalada, la CPU 2 realiza las escrituras a, b y c sobre la misma posición, el resto de procesadores verán las escrituras de la CPU 1 en el orden que se lanzaron. Sin embargo, dos CPU distintas, CPU 2 y CPU 3, podrían observar un orden diferente de escrituras, por ejemplo, la CPU 2 podría ver a, 1, 2, b, 3, c, y en cambio, la CPU 3 podría ver 1, a, b, 2, c, 3

# data[].attributes.body
La consistencia release garantiza que si se usan adecuadamente las operaciones de sincronización, las escrituras que se hayan hecho en una sección crítica de datos compartidos ya se habrán acabado antes de entrar otra vez.