Universidad Nacional Experimental Vicerrectorado de Planificación y
de los Llanos Occidentales Desarrollo Regional Programa
Ezequiel Zamora Académico Ciencias Básicas Aplicadas
. Carrera: Ingeniería en informática
PARALELISMO - MULTIPROCESADOR
Profesora: Alumna:
◦ Maria Ortiz. ◦ Joskani Mendoza
. Nº 28.222.168.
San Fernando, Noviembre de 2022.
¿Qué es el paralelismo a nivel de instrucciones?
El paralelismo es una función que realiza el procesador para ejecutar varias tareas al
mismo tiempo, es decir puede realizar varios cálculos simultáneamente, basados en
principio de dividir los problemas grandes para obtener varios problemas pequeños. El
paralelismo a nivel de instrucción se obtuvo por primera vez en las arquitecturas
computacionales como un medio para agilizar el código de máquina secuencial ordinaria.
Un programa de ordenador es, en esencia, una corriente de instrucciones ejecutadas
por un procesador. Estas instrucciones pueden ser reordenadas y se combinan en grupos
que luego se ejecutan en paralelo sin cambiar el resultado del programa. Esto se conoce
como paralelismo a nivel de instrucción. Los procesadores modernos tienen tuberías de
instrucciones de múltiples etapas. Cada etapa en la tubería corresponde a una acción
diferente que el procesador lleva a cabo en el que la instrucción en esa etapa; un procesador
con una tubería N-etapa puede tener hasta N diferentes instrucciones en diferentes fases de
ejecución. El ejemplo canónico de un procesador segmentado es un procesador RISC, con
cinco etapas: extracción de instrucción, decodificar, ejecutar, acceso a la memoria, y
escribir de nuevo. El procesador Pentium 4 con una cartera de 35 etapas.
Este mecanismo consiste en romper el flujo secuencial de instrucciones para
simultanear la ejecución de varias en el mismo procesador. Existen diferentes estrategias
para lograrlo.
Segmentación
Superescalaridad
Supersegmentación
ILP no debe confundirse con concurrencia :
ILP es la ejecución paralela de una secuencia de instrucciones que pertenecen a
un hilo específico de ejecución de un proceso (un programa en ejecución con su
conjunto de recursos: espacio de direcciones , un conjunto de registros , sus
identificadores, su estado, contador de programa (también conocido como puntero
de instrucción) ), y más).
Por otro lado, la concurrencia implica la asignación de subprocesos de uno o más
procesos al núcleo de una CPU en una alternancia estricta, o en verdadero
paralelismo si hay suficientes núcleos de CPU, idealmente un núcleo para cada
subproceso ejecutable.
Hay dos enfoques para el paralelismo a nivel de instrucción: hardware y software.
El nivel de hardware funciona con un paralelismo dinámico, mientras que el nivel de
software funciona con un paralelismo estático. El paralelismo dinámico significa que el
procesador decide en tiempo de ejecución qué instrucciones ejecutar en paralelo, mientras
que el paralelismo estático significa que el compilador decide qué instrucciones ejecutar en
paralelo.
Limitaciones del paralelismo entre instrucciones.
La expresión de paralelismo a nivel de instrucciones se refiere al grado en que, en
promedio, las instrucciones de un programa se pueden ejecutar en paralelo. Las
limitaciones fundamentales del paralelismo son:
Dependencia de datos verdaderos: Se produce una dependencia verdadera de
datos entre dos instrucciones cuando una instrucción no se puede ejecutar hasta que
finalice la ejecución de la otra.
Dependencia relativa al procedimiento: Como sabemos, la presencia de una
bifurcación (una instrucción de salto condicional) puede afectar al funcionamiento
del cauce. Las instrucciones que siguen a la instrucción de la bifurcación tienen una
dependencia relativa al procedimiento. Esto es, como dicho salto puede realizarse o
no (dependiendo del flag de condición), las instrucciones que siguen a la
bifurcación no pueden ejecutarse hasta que se conozca el camino que tomará el flujo
del programa
Conflictos en los recursos: Un conflicto en un recurso es una pugna de dos o más
instrucciones por el mismo recurso, al mismo tiempo cuando se produce un
conflicto con un recurso, ambas instrucciones necesitan la misma unidad funcional
para ejecutarse, sólo puede ejecutarse una instrucción mientras que la otra debe
esperar para poder acceder al recurso y poder ejecutarse.
Antidependencia y dependencia de salida: Ocurren cuando el programador o el
compilador reúsan espacio de memoria para reducir el espacio de variables del
programa.
Procesador superescalar.
Un procesador superescalar es un tipo de procesador que puede ejecutar varios
conjuntos de instrucciones al mismo tiempo. Este tipo de procesador contiene varias
subunidades que controlan ciertos tipos de funciones básicas. Mientras que otros
procesadores también tienen estas unidades, un procesador superescalar puede enviar
información directamente a estas unidades para su procesamiento mientras el procesador
principal está ocupado con otra cosa. El procesador superescalar es el punto medio de los
tres tipos principales de procesadores.
Un procesador superescalar de grado m emite m instrucciones por ciclo, debiendo ser
también m el paralelismo a nivel de instrucción para explotarlo completamente. En estos
procesadores los recursos para la decodificación y ejecución de instrucciones se
incrementan hasta el punto de disponer de m cauces segmentados operando
concurrentemente, si bien en algunas etapas los cauces pueden compartir algunas unidades
funcionales. En general, los conflictos por dependencias de datos, de control y estructurales
de los procesadores escalares segmentados siguen existiendo en los superescalares con
mayor complejidad.
Ejecución fuera de orden frente a ejecución en orden.
Ejecución fuera de orden
Out-of-order o ejecución fuera de orden es la forma en la que las CPUs más avanzadas
ejecutan el código y está pensado para evitar las paradas en la ejecución. Como su nombre
indica consiste en ejecutar las instrucciones de un procesador en un orden diferente en las que
vienen indicadas en el código.
El motivo por el cual se hace esto es porque cada tipo de instrucción tiene un tipo de
unidad de ejecución asignada. Según el tipo de instrucción la CPU utiliza un tipo de unidad de
ejecución u otra, pero estas son limitadas. Esto puede provocar una parada en la ejecución, por
lo que lo que se hace es adelantar la siguiente instrucción en su ejecución, apuntando en una
memoria o registro interno cual es el orden real de las instrucciones, una vez han sido
ejecutadas estas son enviadas de vuelta en el orden original que estaban en el código.
Ejecución en orden
La ejecución in-order es la clásica ejecución de instrucciones, su nombre se debe a que
las instrucciones se ejecutan en el orden que aparecen en el código y la siguiente instrucción
no puede continuar hasta que no se ha resuelto la anterior.
La mayor dificultad de la ejecución in-order está en las instrucciones condicionales y de
salto, ya que esta se va a ejecutar cuando se dé la condición, enlenteciendo enormemente la
velocidad de ejecución del código. Esto es un problema enorme cuando la cantidad de etapas
de un procesador es sumamente alta, que es lo que ocurre cuando una CPU funciona a altas
velocidades de reloj.
Renombrado de registros.
El renombrado de registros es una de las técnicas utilizadas para aumentar el
paralelismo de instrucciones. Consiste básicamente en tener un número de registro físicos
mayores que el expuesto por la arquitectura, llamados normalmente registros lógicos, de
usuario o públicos. De esta forma, y siguiendo determinadas reglas, un mismo registro lógico
puede ser renombrado a como distintos registros físicos en distintas instrucciones.
Consiste en que el hardware del procesador asigne dinámicamente los registros, que
están asociados con los valores que necesitan las instrucciones en diversos instantes de
tiempo. Cuando se ejecuta una instrucción, donde su operando destino es un registro, se le
asigna un nuevo registro físico para almacenar el resultado, y las instrucciones posteriores
que accedan a ese valor como operando fuente en ese registro, tienen que atravesar un
proceso de renombramiento, donde se revisan las referencias a registros, para que
definitivamente hagan referencia al registro físico que contiene el valor que se necesita. De
este modo, diferentes instrucciones que tienen referencias a un único registro de la
arquitectura (registro lógico), pueden referirse a diferentes registros reales (registros
físicos), con valores diferentes. Para ilustrar esta técnica, vamos a considerar la siguiente
secuencia:
I1: r3 ← r3 op r5
I2: r4 ← r3 + 1
I3: r3 ← r5 + 1
I4: r7 ← r3 op r4
Como ya hemos visto, tiene varias dependencias, incluidas una dependencia de salida
y una antidependencia. Si aplicamos el renombramiento de registros a dicho código
tendremos:
I1: r3b ← r3a op r5a
I2: r4b ← r3b + 1
I3: r3c ← r5a + 1
I4: r7b ← r3c op r4b
Procesadores VLIW.
VLIW son las siglas de Very Long Instruction Word, lo que se traduce como
instrucción de palabra muy larga. En el mundo de la arquitectura de procesadores se utiliza
para definir un tipo de CPU o procesador que alcanza el paralelismo de instrucciones o ILP,
pero con una metodología distinta a la utilizada en los procesadores superescalares que es la
que se utiliza habitualmente en las CPUs.
Los procesadores con arquitecturas VLIW se caracterizan, por tener juegos de
instrucciones muy simples en cuanto a número de instrucciones diferentes, pero muy
grandes en cuanto al tamaño de cada instrucción. Esto es así porque en cada instrucción se
especifica el estado de todas y cada una de las unidades funcionales del sistema, con el
objetivo de simplificar el diseño del hardware al dejar todo el trabajo de planificar el código
en manos del programador/compilador, en oposición a un procesador superescalar, en el
que es el hardware en tiempo de ejecución el que planifica las instrucciones.
Las CPU del tipo VLIW tienen una serie de ventajas y desventajas en comparación
con el resto de procesadores y no solo se han visto siendo utilizadas en CPUs, sino también
como unidades shader de las GPU y también en los DSP.
Ventajas VLIW
Hardware simple.
Puede incrementarse el número de unidades funcionales (UFs) sin agregar hardware
de detección adicional.
Bajo consumo de potencia.
Los buenos compiladores pueden detectar paralelismo según un análisis global del
programa completo, por lo tanto se elimina el problema de la ventana de ejecución.
Desventajas VLIW
Gran número de registros visibles, necesarios para mantener las UFs activas
(operandos y resultados).
Gran capacidad de transporte entre las UFs y los registros, y entre los registros y la
memoria.
Gran ancho de banda entre el cache de instrucciones y la unidad de captación,
debido a las instrucciones largas.
Baja densidad de código, debido a las operaciones vacías.
Incompatibilidad binaria: si agrego UFs, el número de operaciones simultáneas se
incrementa, aumenta el ancho de la instrucción, y por lo tanto el código binario
anterior no se puede ejecutar en la nueva máquina.
Paralelismo y granularidad.
Granularidad
En la computación paralela, la granularidad (o tamaño de grano) de una tarea es una
medida de la cantidad de trabajo (o cálculo) que realiza esa tarea, la granularidad se define
como la relación entre el tiempo de cálculo y el tiempo de comunicación, donde el tiempo
de cálculo es el tiempo necesario para realizar el cálculo de una tarea y el tiempo de
comunicación es el tiempo necesario para intercambiar datos entre procesadores.
Si es el tiempo de cálculo y denota el tiempo de comunicación, entonces
la Granularidad G de una tarea se puede calcular como:
G=
La granularidad generalmente se mide en términos de la cantidad de instrucciones
ejecutadas en una tarea en particular. Alternativamente, la granularidad también se puede
especificar en términos del tiempo de ejecución de un programa, combinando el tiempo de
cálculo y el tiempo de comunicación.
La granularidad de los esquemas internos es el grado de detalle de éstos en función del
esquema lógico.
Cuanto más fina es la granularidad (a nivel de campo de registro es más fina que a
nivel de registro completo) se consigue mayor grado de independencia de los datos.
Paralelismo
Paralelismo de Grano Fino: El paralelismo de grado fino representa un uso
mucho más complejo del paralelismo que es encontrado en el uso de hebras.
Aunque muchos trabajos han sido hechos en aplicaciones altamente
paralelas, es un área especializada y fragmentada, con muchos enfoques
diferentes.
Paralelismo de Grano Medio: Una aplicación puede ser efectivamente
implementada como una colección de hebras con un paralelismo simple. En
este caso, el paralelismo potencial de una aplicación debe ser explícitamente
especificado por el programador. Generalmente se necesitará un alto grado
de coordinación e interacción entre las hebras de una aplicación, levando a
un nivel medio de sincronización.
Paralelismo de Grano Grueso: Con esta clase de paralelismo existe
sincronización entre procesos pero a nivel muy grosero. Esta clase de
situación es fácilmente entendible como un grupo de procesos concurrentes
ejecutándose en un monoprocesador multiprogramado y puede ser soportado
en un multiprocesador con un pequeño o no cambio al software del usuario.
Clasificación de FLYNN para sistemas computadores: análisis comparativo de
los diferentes tipos.
Clasificación de Flynn
Clasificación clásica de arquitectura de computadores que hace alusión a sistemas con
uno o varios procesadores. Flynn la publicó por primera vez en 1966 y por segunda vez en
1970.
Esta taxonomía se basa en el flujo que siguen los datos dentro de la máquina y de las
instrucciones sobre esos datos. Se define como:
Flujo de instrucciones: Al conjunto de instrucciones secuenciales que son
ejecutadas por un único procesador.
Flujo de datos: Al flujo secuencial de datos requeridos por el flujo de
instrucciones.
La clasificación de Flynn es un tipo de clasificación que se realiza según la forma de
procesar los datos paralelamente, que en este caso resulta una clasificación debido a la
cantidad de datos e instrucciones que se manejan
Las cuatro clasificaciones definidas por Flynn se basan en el número de secuencias de
instrucciones (o control) concurrentes y secuencias de datos disponibles en la arquitectura.
SISD (Single Instruction stream, Single Data stream): Flujo ´único de
instrucciones y flujo ´único de datos. Este el concepto de arquitectura serie de Von
Neumann donde, en cualquier momento, sólo se está ejecutando una única
instrucción. A menudo a los SISD se les conoce como computadores serie escalares.
Todas las maquinas SISD poseen un registro simple que se llama contador de
programa que asegura la ejecución en serie del programa. Conforme se van leyendo
las instrucciones de la memoria, el contador de programa se actualiza para que
apunte a la siguiente instrucción a procesar en serie.
MISD (Multiple Instruction Single Data): Arquitectura que se refiere a múltiples
instrucciones ejecutándose sobre un único dato. Comúnmente se considera esta
arquitectura poco práctica ya que en tiempo de ejecución la efectividad del
paralelismo requiere un múltiple flujo de datos y, además, el acceso concurrente a
un mismo dato en memoria puede ocasionar que un CPU tenga que esperar a que el
recurso (dato) esté disponible para poder acceder a él.
SIMD (Single Instruction Multiple Data): Es una técnica empleada para
conseguir paralelismo a nivel de datos. Los repertorios SIMD consisten en
instrucciones que aplican una misma operación sobre un conjunto más o menos
grande de datos. Es una organización en donde una única unidad de control común
despacha las instrucciones a diferentes unidades de procesamiento. Todas éstas
reciben la misma instrucción, pero operan sobre diferentes conjuntos de datos. Es
decir, la misma instrucción es ejecutada de manera sincronizada por todas las
unidades de procesamiento.
MIMD (Multiple Instruction Multiple Data): Múltiples procesadores autónomos
que ejecutan simultáneamente diferentes instrucciones sobre diferentes datos. Las
arquitecturas MIMD incluyen procesadores superescalares de varios núcleos y
sistemas distribuidos, que utilizan un espacio de memoria compartida o un espacio
de memoria distribuida.
Diagrama de comparación de las clasificaciones de la Taxonomía de Flynn.
Esas cuatro arquitecturas son mostradas visualmente a continuación en donde cada
"PU" (processing unit) es una unidad de procesamiento:
Técnicas de compilación para mejorar el paralelismo entre instrucciones.
En inglés es Instruction-Level Parallelism (ILP), y se refiere a ejecutar más de una
instrucción a la vez, en paralelo. Pipelining permite ejecutar múltiples instrucciones en
paralelo. El mejor CPI que podemos obtener es 1, un ciclo por instrucción. En definitiva,
queremos mejorar el rendimiento del procesador, que medimos con el tiempo de respuesta,
entonces ¿qué más se puede hacer para aumentar el ILP?
Si bien hay varias técnicas, nos centraremos en 2:
Pipelines más profundos
o más etapas en la segmentación → más instrucciones en el datapath a la vez.
o menos trabajo por etapa → ciclo de reloj más corto
o disminuye el tiempo de respuesta, manteniendo el CPI ideal en 1.
Emisión múltiple (multiple issue)
o replicando el hardware de la pipeline → múltiples pipelines
o comienzo de múltiples instrucciones por ciclo
o CPI (ideal) < 1 → se usa IPC
Por ejemplo: 4 GHz 4-way multiple-issue
16 BIPS, mejor CPI = 0.25, mejor IPC = 4
pero dependencias terminan reduciendo estos valores en la práctica.
Emisión múltiple
Con las técnicas que vimos hasta ahora, usando lo mejor que tengamos a disposición
en una implementación segmentada, el CPI ideal que podemos esperar es 1. El valor 1
significa que por cada ciclo de reloj finalizamos una instrucción, que tampoco está mal. Sin
embargo, si queremos reducir todavía más el CPI, necesitamos que por cada ciclo de reloj
se termine más de una instrucción, y los procesadores que lo logran se llaman de emisión
múltiple (multiple issue). Por ejemplo, si se emiten y completan dos instrucciones por ciclo
de reloj, el CPI que se logra es 0.5. Supongamos que la cantidad máxima de instrucciones
que se pueden emitir en un ciclo de reloj es m, entonces se dice que el procesador es de m-
vías, o en inglés, m-issue wide.
Hay dos categorías de procesadores de emisión múltiple, que si bien difieren mucho en
el hardware, y vamos a ver varias diferencias, parten de una idea fundamental en la división
del trabajo. Esta división, entre el compilador y el hardware, está dada por cómo se toma la
decisión para la emisión de las instrucciones y define las categorías de emisión múltiple. Si
la decisión se hace en tiempo de compilación, es estática, y el procesador es de emisión
múltiple estática (static multiple issue). Si la decisión se hace mientras se ejecuta el
programa, es dinámica (la está tomando el hardware), y el procesador es de emisión
múltiple dinámica (dynamic multiple issue).
Emisión estática:
o El compilador organiza las instrucciones para ser emitidas juntas
o Se agrupan las instrucciones en espacios de emisión (issue slots)
o Es el compilador quien detecta y evita los riesgos del pipeline
Todo lo que puede
Emisión dinámica:
o La CPU examina el flujo de instrucciones y decide qué instrucciones se
emiten en cada ciclo
El compilador puede haber ayudado organizando las instrucciones de
manera propicia
o La CPU resuelve los riesgos usando técnicas más avanzadas en tiempo de
ejecución
Ganancia en velocidad y prestaciones.
Se utiliza la ganancia en velocidad para estudiar en qué medida se incrementan las
prestaciones de un sistema al ejecutar una aplicación en paralelo en un sistema con
múltiples procesadores frente a su ejecución en un sistema uniprocesador. Este estudio nos
puede interesar por dos motivos: para evaluar el computador paralelo y también para
evaluar la implementación paralela de la aplicación. La ganancia en prestaciones o
ganancia en velocidad (speedup) alcanzada al aplicar paralelismo se puede obtener como
describe la fórmula. Es decir, dividiendo las prestaciones que se consiguen para la
aplicación en el sistema multiprocesador con p procesadores entre las prestaciones
obtenidas ejecutando la versión secuencial en un sistema uniprocesador.
Utilizando el tiempo de respuesta para evaluar prestaciones, las prestaciones vendrían
dadas por la inversa del tiempo; entonces:
T(p)=Tc(p) + To(p)
Con Tp (p) = Tc (p) + To(p)
Donde Ts sería el tiempo de ejecución (respuesta) del programa secuencial y T(p) el
tiempo de ejecución del programa paralelo con p procesadores.
Para obtener T(s) se debería escoger el mejor programa secuencial para la aplicación.
El tiempo de ejecución en paralelo no sólo depende del tiempo de cómputo (cálculo) en
paralelo de las tareas detectadas en la aplicación [Tc(p)], sino también de un tiempo de
penalización o sobrecarga (overhead).
En el tiempo de penalización [To(p)] influyen diversos factores tales como:
Tiempo de comunicación /sincronización entre procesos.
Tiempo para crear/terminar (enrolar/desenrolar) los procesos.
Tiempo de ejecución de operaciones añadidas en la versión paralela
no presentes en la secuencial.
Tiempo de desequilibrado de tareas paralelas.
Sistemas multiprocesador
Se denomina multiprocesador a un computador que cuenta con dos o más
microprocesadores (CPUs). Gracias a esto, el multiprocesador puede ejecutar
simultáneamente varios hilos pertenecientes a un mismo proceso o bien a procesos
diferentes. Generalmente estos sistemas trabajan de dos formas: simétrica o
asimétricamente.
Cuando se trabaja de manera asimétrica, el sistema operativo selecciona a uno de los
procesadores el cual jugará el papel de procesador maestro y servirá como pivote para
distribuir la carga a los demás procesadores, que reciben el nombre de esclavos.
Cuando se trabaja de manera simétrica, los procesos o partes de ellos (threads) son
enviados indistintamente a cualesquira de los procesadores disponibles, teniendo,
teóricamente, una mejor distribución y equilibrio en la carga de trabajo bajo este esquema.
Se dice que un thread es la parte activa en memoria y corriendo de un proceso, lo cual
puede consistir de un área de memoria, un conjunto de registros con valores específicos, la
pila y otros valores de contexto. Un aspecto importante a considerar en estos sistemas es la
forma de crear aplicaciones para aprovechar los varios procesadores.
Los ordenadores multiprocesador presentan problemas de diseño que no se
encuentran en ordenadores monoprocesador. Estos problemas derivan del hecho de que dos
programas pueden ejecutarse simultáneamente y, potencialmente, pueden interferirse entre
sí. Concretamente, en lo que se refiere a las lecturas y escrituras en memoria. Existen dos
arquitecturas que resuelven estos problemas:
La arquitecturaNUMA, donde cada procesador tiene acceso y control exclusivo a
una parte de la memoria.
La arquitecturaSMP, donde todos los procesadores comparten toda la memoria.
Sistemas de paso de mensaje.
En ciencias de la computación, el paso de mensajes es un paradigma de programación
ampliamente usado en el software moderno. Sus aplicaciones cubren un amplio campo, y
puede usarse para garantizar que los diferentes objetos que constituyen un programa
informático puedan trabajar de forma coherente entre ellos hasta para permitir que una tarea
pueda ejecutarse de forma sincronizada entre varios ordenadores. Es uno de los conceptos
clave en modelos de programación concurrente, programación distribuida y programación
orientada a objetos.
Para que el paso de mensajes funcione correctamente, hay varios factores que deben
tenerse en cuenta. Uno tiene que ver con identificar el formato utilizado para la transmisión.
Las formas reales de los mensajes pueden ser señales, paquetes de datos o algún tipo de
activación remota utilizando un lenguaje básico que los sistemas receptores están
programados para reconocer. Junto con el tipo de datos transmitidos, el paso de mensajes
también implica estructurar el orden en que se reciben las transmisiones, un factor que
ayuda en la asimilación de los datos en el extremo receptor.
El paso de mensajes puede usar lo que se conoce como un enfoque uno a uno, lo que
significa que hay un único destinatario del mensaje. En este escenario, el destinatario
asimila el mensaje y luego puede iniciar o no un nuevo mensaje que se transmite a un
segundo destinatario. También existe un proceso conocido como mensajería uno a muchos
que requiere un único punto de origen para iniciar la transmisión de un mensaje a múltiples
destinos, un método que puede ser muy deseable dependiendo de la construcción de una red
o plataforma.
Sistemas de memoria compartida.
La memoria compartida es el mecanismo de comunicación entre procesos más rápido.
El sistema operativo asigna un segmento de memoria en el espacio de direcciones de varios
procesos, de modo que varios procesos puedan leer y escribir en ese segmento de memoria
sin llamar a las funciones del sistema operativo.
El uso de la memoria para la comunicación dentro de un solo programa, por ejemplo,
entre sus múltiples subprocesos , también se denomina memoria compartida.
Los procesos y los subprocesos pueden comunicarse directamente entre sí
compartiendo partes de su espacio de memoria y luego leyendo y escribiendo los datos
almacenados en la memoria compartida. La sincronización de la memoria compartida es
responsabilidad del programa de aplicación.
En hardware
En el hardware de la computadora, la memoria compartida se refiere a un bloque
(generalmente grande) de memoria de acceso aleatorio (RAM) al que pueden acceder varias
unidades centrales de procesamiento (CPU) diferentes en un sistema informático
multiprocesador.
Los sistemas de memoria compartida pueden utilizar:
Acceso uniforme a la memoria (UMA): todos los procesadores comparten la
memoria física de manera uniforme;
Acceso a memoria no uniforme (NUMA): el tiempo de acceso a la memoria
depende de la ubicación de la memoria en relación con un procesador;
Arquitectura de memoria de solo caché (COMA): las memorias locales para los
procesadores en cada nodo se utilizan como caché en lugar de como memoria
principal real.
En software
En el software de computadora, la memoria compartida es
Un método de comunicación entre procesos (IPC), es decir, una forma de
intercambiar datos entre programas que se ejecutan al mismo tiempo. Un proceso
creará un área en la RAM a la que pueden acceder otros procesos;
Un método para conservar espacio en la memoria al dirigir los accesos a lo que
normalmente serían copias de un dato a una sola instancia en su lugar, mediante el
uso de asignaciones de memoria virtual o con el apoyo explícito del programa en
cuestión. Esto se usa con mayor frecuencia para bibliotecas compartidas y para
Ejecutar en el lugar (XIP).
Comparación entre el paso de mensajes y la memoria compartida.
MODELO DE MEMORIA MODELO DE PASO DE MENSAJES
COMPARTIDA
La región de memoria compartida se La función de paso de mensajes se utiliza
utiliza para la comunicación. para la comunicación.
Se utiliza para la comunicación entre Por lo general, se usa en un entorno
procesos en un solo procesador o sistemas distribuido donde los procesos de
multiprocesador donde los procesos de comunicación residen en máquinas remotas
comunicación residen en la misma máquina conectadas a través de una red.
ya que los procesos de comunicación
comparten un espacio de direcciones
común.
El programador de la aplicación debe No se requiere tal código aquí, ya que la
escribir explícitamente el código para leer y función de paso de mensajes proporciona un
escribir los datos de la memoria compartida. mecanismo para la comunicación y
sincronización de las acciones realizadas
por los procesos de comunicación.
Proporciona la máxima velocidad de Lleva mucho tiempo ya que el paso de
cálculo ya que la comunicación se realiza a mensajes se implementa mediante la
través de la memoria compartida, por lo que intervención del kernel (llamadas al
las llamadas al sistema se realizan solo para sistema).
establecer la memoria compartida.
Aquí los procesos deben asegurarse de Es útil para compartir pequeñas
que no escriban en la misma ubicación cantidades de datos, ya que no es necesario
simultáneamente. resolver los conflictos.
Estrategia de comunicación más rápida. Estrategia de comunicación relativamente
más lenta.