Memoria Compartida Distribuida.pdf

22
Sistemas Operativos Distribuidos 6 - 1 Ing. Fausto M. Orozco Carvajal Las dos formas de implantar los sistemas distribuidos; sistemas multiprocesadores y sistemas multicomputadoras, imponen características distintas en el uso de la memoria. Los diseñadores de algoritmos para compartir de la memoria prefieren los sistemas multiprocesadores dado que ya se tiene gran experiencia en la compartición de la memoria entre varios procesos en ejecución ( sistemas multiprogramados ). Todos los procesos en ejecución concurrente leen y escriben sobre la misma memoria. Para evitar problemas, las áreas compartidas deben accederse por medio de secciones críticas protegidas mediante la exclusión mutua. Semáforos y monitores pueden utilizarse para practicar la exclusión mutua requerida. En un sistema multicomputador, cada computadora cuenta con su propia memoria y los procesos en ejecución en diferentes estaciones se comunican mediante el pase de mensajes. En este ambiente la compartición de las memorias entre los procesos en ejecución plantea problemas no encontrados en los sistemas multiprocesador. ¿ Como se puede compartir una estructura de datos presente en la memoria de una estación entre procesos que se ejecutan en estaciones distintas ?. El enviar una copia de la estructura de datos a cada estación resuelve el problema, pero crea otros relativos a la consistencia de los datos. Una estación puede actualizar la estructura haciendo que los datos presentes en las otras estaciones sean inválidos. El mecanismo de pase de mensajes, aún con el ocultamiento de su complejidad derivado del uso de los RPCs no puede manejar con eficiencia la transferencia de gráficas y otras estructuras de datos con apuntadores. Otro problema lo plantea el uso de variables globales cuando los procesos que las utilizan residen en estaciones distintas. En resumen, en la perspectiva de un diseñador de software, los multiprocesadores son en definitivo preferibles a las multicomputadoras lo cual plantea un dilema, puesto que en la perspectiva del implantador, es mucho más fácil y barato implantar un sistema distribuido mediante varias estaciones de trabajo conectadas por medio de una red. Lo que se necesitan son sistemas fáciles de construir y programar. El concepto de memoria compartida distribuida fue propuesto originalmente por Li ( 1986 ) y Li y Hudak ( 1989 ). En resumen proponían tener una colección de estaciones de trabajo conectadas por una LAN y compartiendo un solo espacio de direcciones virtuales con páginas. En la variante más simple, cada página esta presente en una máquina. Un intento por acceder a una página de alguna computadora diferente causa un fallo de página en hardware, el cual realiza un señalamiento al sistema operativo. El SO envía un mensaje a la máquina remota, quién encuentra la página necesaria y la envía al procesador que la solicito. Entonces se reinicia la instrucción detenida y se puede concluir. Este esquema se asemeja al de memoria virtual paginada en un sistema tradicional. La única diferencia es que las páginas requeridas en lugar de ser tomadas del disco del sistema, se solicitan a una máquina remota. De hecho Li y Hudak diseñaron un sistema que es fácil de programar ( memoria compartida lógicamente ) y fácil de construir ( sin memoria compartida físicamente ). Desafortunadamente, esta propuesta ocasiona que las páginas de memoria anden de un lado a otro en la red generando un fuerte tráfico. Las nuevas propuestas tienen como objetivo minimizar el tráfico de la red y reducir la latencia entre el momento de una solicitud a memoria y el momento que se satisface ésta. La memoria compartida.

Transcript of Memoria Compartida Distribuida.pdf

Page 1: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 1

Ing. Fausto M. Orozco Carvajal

Las dos formas de implantar los sistemas distribuidos; sistemas multiprocesadores y sistemas multicomputadoras, imponen características distintas en el uso de la memoria. Los diseñadores de algoritmos para compartir de la memoria prefieren los sistemas multiprocesadores dado que ya se tiene gran experiencia en la compartición de la memoria entre varios procesos en ejecución ( sistemas multiprogramados ). Todos los procesos en ejecución concurrente leen y escriben sobre la misma memoria. Para evitar problemas, las áreas compartidas deben accederse por medio de secciones críticas protegidas mediante la exclusión mutua. Semáforos y monitores pueden utilizarse para practicar la exclusión mutua requerida. En un sistema multicomputador, cada computadora cuenta con su propia memoria y los procesos en ejecución en diferentes estaciones se comunican mediante el pase de mensajes. En este ambiente la compartición de las memorias entre los procesos en ejecución plantea problemas no encontrados en los sistemas multiprocesador. ¿ Como se puede compartir una estructura de datos presente en la memoria de una estación entre procesos que se ejecutan en estaciones distintas ?. El enviar una copia de la estructura de datos a cada estación resuelve el problema, pero crea otros relativos a la consistencia de los datos. Una estación puede actualizar la estructura haciendo que los datos presentes en las otras estaciones sean inválidos. El mecanismo de pase de mensajes, aún con el ocultamiento de su complejidad derivado del uso de los RPCs no puede manejar con eficiencia la transferencia de gráficas y otras estructuras de datos con apuntadores. Otro problema lo plantea el uso de variables globales cuando los procesos que las utilizan residen en estaciones distintas. En resumen, en la perspectiva de un diseñador de software, los multiprocesadores son en definitivo preferibles a las multicomputadoras lo cual plantea un dilema, puesto que en la perspectiva del implantador, es mucho más fácil y barato implantar un sistema distribuido mediante varias estaciones de trabajo conectadas por medio de una red. Lo que se necesitan son sistemas fáciles de construir y programar. El concepto de memoria compartida distribuida fue propuesto originalmente por Li ( 1986 ) y Li y Hudak ( 1989 ). En resumen proponían tener una colección de estaciones de trabajo conectadas por una LAN y compartiendo un solo espacio de direcciones virtuales con páginas. En la variante más simple, cada página esta presente en una máquina. Un intento por acceder a una página de alguna computadora diferente causa un fallo de página en hardware, el cual realiza un señalamiento al sistema operativo. El SO envía un mensaje a la máquina remota, quién encuentra la página necesaria y la envía al procesador que la solicito. Entonces se reinicia la instrucción detenida y se puede concluir. Este esquema se asemeja al de memoria virtual paginada en un sistema tradicional. La única diferencia es que las páginas requeridas en lugar de ser tomadas del disco del sistema, se solicitan a una máquina remota. De hecho Li y Hudak diseñaron un sistema que es fácil de programar ( memoria compartida lógicamente ) y fácil de construir ( sin memoria compartida físicamente ). Desafortunadamente, esta propuesta ocasiona que las páginas de memoria anden de un lado a otro en la red generando un fuerte tráfico. Las nuevas propuestas tienen como objetivo minimizar el tráfico de la red y reducir la latencia entre el momento de una solicitud a memoria y el momento que se satisface ésta. La memoria compartida.

Page 2: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 2

Ing. Fausto M. Orozco Carvajal

La forma en que se comparte la memoria en los sistemas multiprocesadores ha inspirado algunos algoritmos para implantar la memoria compartida distribuida. Se analizan enseguida algunos esquemas de compartición de memoria en sistemas multiprocesadores. Memoria en circuitos. En esta forma de implantación, la memoria esta integrada en un mismo chip junto con el CPU. Direcciones y líneas de datos conectan la CPU con la memoria ( Fig. 6.1(a.)). Una modificación a dicha configuración permite conectar varios CPUs a las líneas que van hacia la memoria logrando compartir ésta entre todos los CPUs ( Fig. 6.1(b) ). Esta implantación sería muy complicada y poco usual además de impráctica desde el punto de vista de la ingeniería.

CPU MEMORIA

Paquete de

circuitos

Direcciones y líneas de

datos que conectan el

CPU con la memoria

( a )

CPU

CPU

CPU

CPUMEMORIA

.

.

.

( b )

Fig. 6.1 (a ) una computadora con un solo circuito. ( b ) un multiprocesador de

memoria Compartida hipotético.

Multiprocesadores basados en bus. Una colección de cables que conducen señales de datos, direcciones y control conforman un bus. El bus esta integrado en una tarjeta impresa ( como en el caso de las máquinas de escritorio ) o puede ser un cable externo que permite la interconexión de los componentes periféricos ( como en las macrocomputadroras ). La forma más simple y práctica de construir un sistema multiprocesador es basarlo en un bus con más de un CPU y una sola memoria compartida entre todos. ( Fig. 6.2. )

Page 3: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 3

Ing. Fausto M. Orozco Carvajal

CPU CPU CPUMemoria

Bus

Fig. 6.2. Un multiprocesador sencillo.

En esta implantación se requiere implementar algún protocolo de acceso al bus para evitar que dos o más CPUs intenten acceder simultáneamente al bus. La desventaja principal de esta implantación es que con unos cuantos CPUs el bus se sobrecargará cuando se acceda a la única memoria que posee el sistema. Una forma de reducir el número de accesos a la memoria es dotar a cada CPU con un pequeño caché de memoria, llamado caché husmeador por el hecho de estar pendiente de la actividad del bus y atrapar algunos accesos. ( Fig. 6.3 )

CPU CPU CPU Memoria

Bus

Caché Caché Caché

Fig. 6.3. Un multiprocesador con caché husmeador. Importante en esta forma de implantación son los protocolos de consistencia del caché, es decir, las reglas para asegurarse de que los diferentes cachés no contengan valores diferentes para la misma localidad de memoria. Un protocolo en particular común es el de escritura a través del caché. Cuando un CPU lee por primera vez una palabra de memoria, esa palabra es llevada por el bus y guardada en el caché del CPU solicitante. Si más tarde se necesita esa palabra, el CPU la toma del caché sin necesidad de hacer otra solicitud a memoria, reduciendo así el tráfico del bus. Cada CPU realiza el ocultamiento en forma independiente de los demás. En consecuencia es posible que una palabra en particular se oculte en dos o más CPUs al mismo tiempo. En este caso, ¿ Que sucede cuando se realiza una escritura ?. Si la palabra se encuentra en el caché del CPU que realiza la escritura, la entrada se actualiza. Esté o no en el caché, también se escribe en el bus para actualizar la memoria. Todos los demás cachés que están husmeando el bus se dan cuenta de esta actividad y si están ocultando la misma palabra, proceden a invalidarla de forma tal que cuando la referencíen tendrán que obtenerla de la memoria. Una alternativa es que los cachés sean actualizados en lugar de invalidar sus entradas. Pero lo primero es más lento que lo segundo, dado que la invalidación implica solo proporcionar una dirección, mientras que la actualización implica proporcionar la dirección más el valor a registrar.

Page 4: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 4

Ing. Fausto M. Orozco Carvajal

La tabla siguiente resume el protocolo de escritura a través del caché. La primera columna muestra los evento básicos que pueden suceder. La columna 2 muestra lo que hace el caché en respuesta a las acciones del propio CPU. La tercer columna indica lo que sucede cuando un caché ve ( al husmear ) que un CPU diferente tiene éxito o fracaso.

Acción realizada por un caché en respuesta Acción realizada por un caché a la operación de su propio CPU en respuesta a una operación de

Evento un CPU remoto.

Fracaso de lectura Buscar datos en memoria y guardar en el caché

No hay acción

Éxito de lectura Buscar datos del caché local No hay acción

Fracaso de escritura

Actualizar los datos en memoria y guardar en caché

No hay acción

Éxito de escritura Actualizar memoria y caché Invalida la entrada del caché

Este protocolo es fácil de entender e implantar, pero tiene la seria desventaja de que todas las escrituras utilizan el bus. Aunque es cierto que el protocolo reduce el tráfico del bus en cierta medida, el número de procesadores que se conectan al bus es aún pequeño como para permitir la construcción de multiprocesadores a gran escala que lo utilicen. De la observación del uso de variables por parte de los programas en ejecución se desprende el hecho de que una vez que un CPU ha escrito una palabra es probable que la necesite otra vez, y es poco probable que otro CPU la utilice con rapidez. Esto sugiere que un CPU que ha actualizado una palabra adquiera una cierta membresía sobre la misma, de forma tal que posteriores actualizaciones no ocurran en la memoria hasta que otro CPU exhiba un interés en la misma palabra. Goodman ( 1983 ) diseñó un protocolo llamado de una escritura basado en un bus existente y más complicado de lo estrictamente necesario. Se revisa aquí una versión simplificada de éste ( Fig. 6.4 ). El protocolo maneja bloques de caché que pueden estar en uno de 3 estados posibles:

1. INVALIDO. Este bloque de caché no contiene datos válidos. 2. LIMPIO. La memoria está actualizada; el bloque puede estar en otros cachés. 3. SUCIO. La memoria es incorrecta; ningún otro caché puede contener al bloque.

La idea básica es que una palabra leída por varios CPU esté presente en todos sus cachés. Una palabra en la que una máquina escribe repetidamente se guarda en su caché y no se vuelve a escribir en memoria después de cada escritura, para reducir el tráfico del bus. La Fig. 6.4. ilustra un protocolo de membresía de caché. En la Fig. 6.4(a) el procesador B lee la palabra W de la memoria obteniendo el valor W1 que almacena en su caché, que se marca como LIMPIO. En la Fig. 6.4(b) el procesador A obtiene también el valor de W y lo guarda en su caché marcándose también como LIMPIO al igual que el de B. En la Fig. 6.4(c) el procesador A escribe un nuevo valor W2 para W. Puesto que el caché de B esta husmeando el bus se da cuenta de esta acción e invalida su entrada. A marca su caché como SUCIO dado que la memoria no esta actualizada. En la Fig. 6.4(d). A vuelve a escribir un nuevo valor W3

Page 5: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 5

Ing. Fausto M. Orozco Carvajal

para W en su caché. El estado de los cachés no cambia. En la Fig. 6.4(e) C lee la variable W de la memoria. Puesto que el caché de A esta husmeando el bus, se da cuenta de la petición y envía el valor W3 de W al procesador C. A marca su caché como INVALIDO y C marca el suyo como SUCIO dado que tiene la copia actualizada de W. En este momento C puede leer o escribir en el caché sin requerir accesos a la memoria. La memoria se actualiza cuando W se elimine del caché de C por razones de espacio.

CPU

A B C W1

W1W1

LIMPIOLIMPIO

A B C W1

W1

LIMPIO

A B C W1

W1W2

INVALIDO

A B C W1

W1W3

INVALIDO

A B C W1

W1W3 W3

SUCIO

SUCIO

INVALIDOINVALIDO SUCIO

La memoria es

correcta

Estado inicial.

La palabra " que contiene el valor W1 está

en la memoria y también está en el caché

de B

( a )

A lee la palabra W y obtiene W1. B no

responde a la lectura, pero la memoria

si.

La memoria es

correcta

La memoria es

correcta

La memoria es

correcta

La memoria es

correcta

A escribe un valor W2. B husmea en el

bus, ve la escritura e invalida su entrada.

La copia de A se marca como SUCIO

A escribe W de nuevo. Esta y olas escrituras

posteriores por A se realizan de manera local,

sin tráfico en el bus.

C lee o escribe W. A ve la solicitud al husmear en

el bus, proporciona el valor e invalida su propia

entrada. C tiene ahora la única copia válida.

( b )

( c )

( d )

( e )

Page 6: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 6

Ing. Fausto M. Orozco Carvajal

Fig. 6.4. Un ejemplo de cómo funciona un protocolo de membresía de caché. Muchos procesadores pequeños utilizan un protocolo de consistencia de caché similar al anterior, por lo general con pequeñas variaciones. Tres propiedades son importantes:

1. La consistencia se logra haciendo que todos los cachés husmeen el bus. 2. El protocolo se integra dentro de la unidad de administración de memoria. 3. todo el algoritmo se realiza en un ciclo de memoria.

Como se verá posteriormente, nada de esto es válido para la memoria compartida distribuida. Multiprocesadores basados en anillo. En este tipo de configuraciones se tiene un conjunto de procesadores interconectados formando un anillo y comunicándose utilizando el pase de ficha. Cada procesador tiene su propia memoria ( no hay memoria centralizada ) la cual se divide en una parte privada y una compartida o pública. La memoria compartida se divide en bloques que es la unidad de transferencia en el sistema. Cada procesador posee un caché para el ocultamiento y una unidad de gestión de la memoria. Cuando se accede a una palabra no presente en el caché, el procesador espera que le llegue la ficha y envía una petición por el bloque que contiene la palabra. El bloque deberá estar presente en algún procesador del sistema el cual, cuando llegue la ficha con la petición lo colocará en el mensaje cambiando el tipo de ficha para que los otros procesadores no lo procesen. Los protocolos de consistencia del caché son similares al de los multiprocesadores basados en bus. La diferencia con esta forma de implantación es que la memoria no esta en un solo lugar, sino que esta distribuida en todos los procesadores. La máquina de Memnet ( 1988 ) es un ejemplo de esta implantación ( Fig. 6.5 ).

CPU

CPU

CPU

CPU

CPU

CPU

Dispositivo de Memnet

Fig. 6.5. El anillo de memnet.

En el dispositivo de Memnet presente en cada computadora se integran la interfaz del anillo, la MMU ( unidad de administración de memoria ), el caché y una parte de la memoria. Multiprocesadores con conmutador. Aunque los multiprocesadores basados en bus y los basados en anillo trabajan bien para sistemas pequeños ( alrededor de 64 CPUs ), no se escalan bien a sistemas con cientos o miles de CPUs. Al agregar un CPU, en algún punto se satura el ancho de banda del bus o el anillo. Añadir más CPUs no mejora el desempeño del sistema.

Page 7: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 7

Ing. Fausto M. Orozco Carvajal

Se tienen dos métodos para atacar el problema del ancho de banda insuficiente:

1. Reducir la cantidad de comunicación. 2. Incrementar la capacidad de comunicación. El uso de los cachés es un intento por reducir la cantidad de comunicación mediante el ocultamiento. Se pueden buscar mejores protocolos para el ocultamiento, optimizar el tamaño del bloque intercambiado entre cachés y memoria, reorganizar los programas para incrementar los éxitos debido a datos presentes en los cachés, pero llegará el momento en que se hayan probado todas las alternativas y no podrán adicionarse más CPUs debido a la saturación del bus. La única salida será incrementar el ancho de banda del bus o modificar el esquema de conexión de los CPUs. Se puede cambiar la topología de la interconexión cambiando un bus por dos, o un árbol o una cuadrícula tratando de lograr una capacidad de comunicación adicional. Un método diferente consiste en construir el sistema como una jerarquía. Varios CPUs conectados en bus con su memoria constituye una unidad de interconexión. Se pueden conectar varias unidades entre sí mediante buses de alta velocidad. Mientras más CPUs se comuniquen principalmente dentro de su unidad, habrá relativamente menos tráfico entre las unidades. Si un bus entre las unidades es inadecuado, se añade un segundo bus de este tipo, o se ordenan las unidades en un árbol o cuadrícula. Si se necesita mayor ancho de banda, se reúne un bus, un árbol o una cuadrícula de unidades en una superunidad, y se separa al sistema en varias superunidades. Las superunidades se pueden conectar mediante un bus, árbol, o cuadrícula, y así en lo sucesivo ( Fig. 6.6 ).

C C C M

C C C M

C C C M

Unidad

Bus entre

unidades

( a )

C C C M

C C C M

C C C M

C C C M

C C C M

C C C M

Bus entre superunidades

Interfaz

( b )

Fig. 6.6. (a) tres grupos conectados por un bus entre unidades para formar una superunidad. (b)

dos superunidades conectadas mediante un bus de superunidad.

Page 8: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 8

Ing. Fausto M. Orozco Carvajal

Un ejemplo de esta forma de implementación lo constituye la máquina Dash ( Directory and Architecture for Shared Memory ) propuesta por la Universidad de Stanford ( Lenosky 1992 ) que esta formada por 64 CPUs distribuidos en 16 unidades, cada una de las cuales tiene 4 CPUs, 16 MB de memoria global y algo de equipo de E/S. Cada CPU esta equipado con un caché husmeador y el ocultamiento se practica con un protocolo basado en la membresía y la invalidación. El espacio total de memoria es de 256 MB dividido en 16 regiones de 16 MB cada una. La memoria global de la unidad 0 contiene las direcciones de la 0 a la 16 MB, la unidad 1 contiene las direcciones de 16MB a 32 MB, etc. El bloque de transferencia entre unidades es de 16 bytes de modo que en cada unidad hay espacio para manejar hasta 1 M de bloques. Maquinas NUMA y Multiprocesadores UMA. Como debe quedar claro, el ocultamiento del hardware en grandes multiprocesadores no es simple. El hardware y algunos intrincados protocolos deben mantener estructuras de datos complejas integrados al controlador del caché o MMU. La consecuencia de ello es que los multiprocesadores grandes son caros y no tienen uso amplio. Los investigadores han invertido mucho esfuerzo buscando alternativas de diseño que no requieran intrincados esquemas de ocultamiento. Una de estas propuestas es el procesador NUMA ( Non Uniform Memory Access ). Como un multiprocesador UMA ( Uniform Memory Access ) tradicional, una máquina NUMA tiene un espacio de direcciones virtuales visible para todos los CPUs. Cuando cualquier CPU escribe un valor en una localidad, una lectura posterior por un procesador diferente a la misma localidad regresará el valor recién escrito. La diferencia entre las máquinas NUMA y UMA no sólo descansa en la semántica sino también en el desempeño. En la máquina NUMA el acceso a la memoria remota es mucho más lento que el acceso a una local, y no se intenta ocultar este hecho mediante un ocultamiento de hardware. Dos ejemplos de máquinas NUMA son la Cm* ( Jones 1977 ) ( Fig. 6.7 ) que estaba formada por varias unidades, cada una con un CPU, un MMU microprogramable, un módulo de memoria y posiblemente algunos dispositivos de I/O, todos conectados mediante un bus. No había cachés y no se husmeaba al bus. Las unidades se interconectaban mediante buses. La máquina BBN Butterfly ( Fig. 6.7 ) es otra máquina NUMA en la que cada CPU se acopla de forma directa a una memoria. Los procesadores se conectan a conmutadores con varios puertos de entrada y salida. Las solicitudes de memoria local se manejan de forma directa; las solicitudes remotas se cambian por paquetes de solicitudes y se envían a la memoria apropiada por medio de la red de conmutadores. Los programas se pueden ejecutar en forma remota pero con una falla tremenda en el desempeño. Las máquinas NUMA tienen tres propiedades claves de interés:

1. Es posible el acceso a la memoria remota. 2. El acceso a la memoria remota es más lento que el de la memoria local. 3. El tiempo de acceso remoto no se oculta mediante el uso de los cachés.

Page 9: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 9

Ing. Fausto M. Orozco Carvajal

El último punto es de primordial importancia en el desempeño de las maquinas NUMA Cuando un CPU tiene acceso a una página que no se encuentra asociada en ese momento en su espacio de direcciones, ocurre un fallo de página. El SO nota este fallo y toma una decisión. Si la página es exclusiva para lectura, la opción es duplicar la página ( es decir, crear una copia local sin perturbar la original ) o asociar la página virtual con la memoria remota, lo que obliga entonces a un acceso remoto para todas las direcciones de esa página. Si la página puede utilizarse para lectura y escritura, la opción consiste en mover la página al procesador que falló ( invalidando la página original ) o asociar la página virtual en la memoria remota. Las consecuencias de esto son sencillas. Si se creó una copia local ( réplica o migración ) y la página no se vuelve a utilizar demasiado, habrá un gasto considerable de tiempo perdido por nada. Por otro lado, si

Unidad

( a ) ( b )

Bus local

CPU E/S M

CPU E/S M

CPU E/S M

MMU microprogramado

Memoria local

Bus e

ntr

e u

nid

ades

10

11

12

13

14

15

4

5

6

7

8

9

0

1

2

3

10

11

12

13

14

15

4

5

6

7

8

9

0

1

2

3

Conmutador

CPU

Fig. 6.7. (a) Una vista simplificada del sistema Cm*. (b) BBN Butterfly. Los CPU de la Derecha son los mismos que los de la izquierda ( es decir, la arquitectura es en realidad un cilindro ).

Page 10: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 10

Ing. Fausto M. Orozco Carvajal

no se realiza ninguna copia, la página se asocia de manera remota, y vendrán muchos accesos, que serán muy lentos. En esencia, el sistema operativo tiene que ver si la página será utilizada con frecuencia en el futuro. Si falla, será una falla en el desempeño. Comparación de los sistemas con memoria compartida. Los sistemas de memoria compartida cubren un espectro amplio, desde los sistemas que mantienen la consistencia por completo en hardware hasta aquellos que lo hacen en software. La Fig.6.8 muestra el especto de manera explícita con indicaciones de sistemas en los cuales se han implementado los diferentes modelos.

Multiproce-

sador con

bus

Multiproce-

sador con

conmutador

Máquina

NUMA

DSM

basado en

páginas

DSM con

variables

compartidas

DSM

basado en

objetos

Controlado por

MMU

Controlador por el

Sistema OperativoControlado por el sistema de timepo

de ejecución del lenguaje

Ocultamiento controlado por el

hardware

Ocultamiento controlado por el

software

Sequent

Firely

Dash

Alewife

Cm*

Butterfly

Ivy

MIrage

Munin

MidwayLinda

Orca

Bloque

cachéPágina

Estructura

de

datos

Objeto

Vagamente

acoplado

Fuertemente

acoplado

Unidad

de

transferencia

Acceso remoto en hardware Acceso remoto en software

PáginaBloque

caché

Fig. 6.8. El especto de máquinas de memoria compartida. Del lado izquierdo de la Fig. 6.8. tenemos los multiprocesadores con un bus, con cachés en hardware y que mantienen la consistencia al husmear en el bus. Estas son las máquinas de memoria compartidas más sencillas y operan por completo en hardware. Estos diseños trabajan bien para un número pequeño o mediano de CPU, pero se degradan con rapidez al saturarse el bus. Después vienen los multiprocesadores conmutadores que también tienen ocultamiento de hardware pero utilizan directorios y otras estructuras de datos para llevar un registro de los CPU o unidades que tienen ciertos bloques de cachés. Utilizan protocolos complicados para la consistencia del caché que se guardan en el microcódigo de la MMU y se cuentan como implantaciones en hardware.

Page 11: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 11

Ing. Fausto M. Orozco Carvajal

Luego vienen las máquinas NUMA que son híbridas entre el control del hardware o del software. Aquí el ocultamiento queda controlado por el software y no por el hardware. Siguiendo en el espectro están las máquinas que ejecutan un sistema de memoria compartida distribuida basado en páginas. Luego vienen los sistemas que comparten solo una porción selecta de sus espacios de direcciones, como las variables compartidas y otras estructuras de datos. Se requiere información adicional del usuario para determinar cuáles variables son compartidas y cuáles no. En estos sistemas, el enfoque cambia de pretender que existe una memoria común, a cómo mantener consistente un conjunto de estructuras de datos distribuidas duplicadas frente a las actualizaciones, potencialmente desde todas las máquinas que utilizan los datos compartidos. Por último se tienen los sistemas que trabajan con memoria compartida distribuida basada en objetos. A diferencia de los demás, aquí los programas no pueden sólo tener acceso a los datos compartidos. Tienen que recorrer métodos protegidos, lo que significa que el sistema de ejecución puede tener siempre el control de cada acceso para ayudar a mantener la consistencia. Todo se hace en software, sin ningún tipo de soporte de hardware. Las diferencias entre estos seis tipos de sistemas se resumen en la tabla siguiente que muestre desde el hardware fuertemente acoplado a la izquierda hasta el software vagamente acoplado a la derecha.

Multiprocesadores DSM

Punto

Un bus

Con con- mutador

NUMA

Basado en Páginas

Con vars. compartidas

Basado en Objetos

¿Tienen un espacio de direcciones virtuales, compartido y lineal ?

Si Si Si Si No No

Operaciones posibles L/E L/E L/E L/E L/E General

¿Encapsulado y métodos ? No No NO No No Si

¿Es posible el acceso remoto en hardware ?

Si Si Si No No No

¿ Es posible una memoria no conectada ?

Si Si Si No No No

¿Quién convierte los accesos a memoria remota en mensajes ?

MMU MMU MMU Sistema Operativo

Sistema de tiempo de ejecución

Sistema de tiempo de ejecución

Medio de transferencia Bus Bus Bus Red Red Red

La migración de datos es Realizada mediante

Hardware

Hardware Software

Software Software Software

Unidad de transferencia Bloque Bloque Página Página Variable Compartid

Objeto

Page 12: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 12

Ing. Fausto M. Orozco Carvajal

a

Tabla 6.1. Comparación de los seis tipos de sistemas de memoria compartida.

Modelos de consistencia. El problema del mantenimiento de la consistencia cuando las páginas que se escriben son compartidas entre varios procesadores presenta un problema fundamental en las implantaciones de la memoria compartida distribuida. Si se permite sólo una copia de cada página muy utilizada para escritura se puede tener un serio cuello de botella en cuanto al desempeño. Si se permite la existencia de varias copias , se facilita el problema del desempeño, pues basta con actualizar cualquier copia, pero esto introduce de nuevo el problema de mantener consistentes las diversas copias. El mantenimiento de una consistencia es particularmente difícil cuando las diversas copias se encuentran en máquinas diferentes que sólo puede comunicarse al enviar mensajes por una red lenta. En algunos sistemas DSM ( y multiprocesadores ), la solución consiste en aceptar una menos perfecta como precio de mejor desempeño. Un modelo de consistencia es en esencia un contrato entre el software y la memoria ( Adve y Hill, 1990 ). Dice que si el software acuerda obedecer ciertas reglas, la memoria promete trabajar de forma correcta. Si el software viola estas reglas, todo acaba y ya no se garantiza que la operación de la memoria sea la correcta. Consistencia estricta. Es el modelo de consistencia más estricto. Se define mediante la condición siguiente: Cualquier lectura a una localidad de memoria x regresa el valor guardado por la operación de escritura más reciente en x. Los sistemas con un solo procesador han observado tradicionalmente la consistencia estricta y los programadores esperan que este comportamiento sea el normal. En un sistema DSM, el asunto es más complicado. Para explicar este tipo de consistencia y los problemas que se presentan en su ausencia en la Fig. 6.9 (a) y (b) se presentan dos procesos P1 y P2 que acceden a una variable compartida x presente en la máquina que ejecuta P2. W(x)1 indica que el proceso correspondiente ejecuta una escritura sobre x cambiando su valor a 1. R(x)0 indica que un proceso leyó la variable x y obtuvo el valor 0. En la Fig. 6.9(a) se presenta lo que sucede cuando se practica la consistencia estricta. En la Fig. 6.9(b) el proceso P1 envío un mensaje de escritura cambiando el valor a 1. P2, con una pequeña diferencia de tiempo en relación al tiempo en que se generó el mensaje de escritura, lee la variable x obteniendo el valor anterior no actualizado de 0. Si en algún tiempo posterior P2 vuelve a leer la misma variable x obtendrá ya el valor actualizado 1. En este caso falla la consistencia

Page 13: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 13

Ing. Fausto M. Orozco Carvajal

estricta por el retardo de la recepción del mensaje de escritura en relación a la primer lectura de la variable por parte de P2.

P1: W(x)1

R(x)1P2:

( a )

W(x)1

( b )

P1:

P2: R(x)1R(x)0

Fig. 6.9 El comportamiento de dos procesos. El eje horizontal es el tiempo.

(a) Memoria con consistencia estricta. (b) Memoria sin consistencia estricta. En resumen, cuando la memoria tiene consistencia estricta, todas las escrituras son visibles al instante a todos los procesos y se mantiene un orden de tiempo global absoluto. Si se cambia una localidad de memoria, todas las lecturas posteriores desde esa localidad ven el nuevo valor, sin importar qué tan pronto se haga la lectura después del cambio y sin importar los procesos que estén haciendo la lectura ni la posición de éstos. De manera análoga, si se realiza una lectura, se obtiene el valor actual, sin importar lo rápido que se realice la siguiente escritura. Consistencia secuencial. Es un modelo de memoria un poco más débil que la consistencia estricta. Fue definida por primera vez por Lamport ( 1979 ), quién dijo que una memoria con consistencia secuencial es la que satisface la siguiente condición:

El resultado de cualquier ejecución es el mismo si las operaciones de todos los procesos fueran ejecutados en algún orden secuencial, y las operaciones de cada proceso individual aparecen en esta secuencia en el orden especificado por su programa.

Lo que significa esta definición es que cuando los procesos se ejecutan en paralelo en diferentes máquinas ( o aun en pseudoparalelo en un sistema de tiempo compartido ), cualquier intercalado válido es un comportamiento aceptable, pero todos los procesos deben ver la misma serie de llamadas a memoria. Una memoria donde un proceso ( o procesos ) ven un intercalado y otro proceso ve otro distinto no es una memoria con consistencia secuencial. La memoria con consistencia secuencial no garantiza que una lectura regrese el valor escrito por otro proceso un nanosegundo antes, un microsegundo antes, o incluso un minuto antes. Sólo garantiza que todos los procesos vean todas las referencias a memoria en el mismo orden. Si el programa que general la Fig. 6.10(a) se ejecuta de nuevo, podrá dar el resultado de la figura 6.10(b).

( a )

W(x)1

( b )

P1:

P2: R(x)1R(x)0

P1:

P2: R(x)1R(x)1

W(x)1

Fig. 6.10. Dos resultados posibles de ejecutar el mismo programa.

Page 14: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 14

Ing. Fausto M. Orozco Carvajal

Una memoria con consistencia secuencial se puede construir en un sistema DSM o multiprocesador que duplique las páginas que se pueden escribir, garantizando que ninguna operación de memoria comienza hasta que las anteriores hayan concluido. Se han propuesto varios sistemas formales para expresar la consistencia secuencial ( y otros modelos de consistencia ). En el sistema de Ahamad ( 1993 ), la serie de operaciones de lectura y escritura del proceso i se denotan por Hi ( la historia de Pi ). En la Fig. 6.10(a) se muestran dos de estas series, H1 y H2 para P1 y P2, respectivamente, como sigue: H1 = W(x)1 H2=R(x)0R(x)1 El conjunto de todas estas series de series se llama H. Para obtener el orden relativo en que aparecen las operaciones por ejecutar, se deben fusionar las cadenas de operación H en una cadena S, donde cada operación que aparezca en H estará una vez en S. S da el orden en que se hubieran realizado las operaciones en el caso de contar con una memoria centralizada. Todos los valores válidos de S cumplen las restricciones siguientes:

1. Debe mantenerse el orden de los programas. 2. Debe ser respetada la coherencia en la memoria.

La primera restricción significa que si un acceso para lectura o escritura, A aparece antes que otro acceso B, en una de las cadenas de H, A también debe aparecer antes que B en S. Si es cierta esta restricción para todos los pares de operaciones, la S resultante no mostrará operaciones en un orden que viole cualquiera de los programas. La segunda restricción corresponde a la coherencia de la memoria, significa que una lectura a alguna localidad x regresa siempre el valor más reciente escrito en x; es decir, el valor v escrito por el W(x)v más reciente antes que R(x). Para el ejemplo anterior, la única S válida es: S= R(x)0W(x)1R(x)1 Se dice que el comportamiento de un programa es correcto si su secuencia de operaciones corresponde a algún valor válido de S. Consistencia causal. El modelo de consistencia causal ( Hutto y Ahamad, 1990 ) representa un debilitamiento de la consistencia secuencial que hace una distinción entre los eventos potencialmente relacionados por causalidad y aquellos que no lo están. Para ver a que se refiere la causalidad considere el ejemplo siguiente. Suponga que el proceso P1 escribe una variable x. Después P2 lee x y escribe y. Aquí la lectura de x y la escritura de y están potencialmente relacionadas de forma causal, pues el cálculo de y podría depender del valor de x leído por P2 ( es decir, el valor escrito por P1 ). Por otro lado, si dos procesos escriben de forma espontánea y simultánea en dos variables, no están relacionados de forma

Page 15: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 15

Ing. Fausto M. Orozco Carvajal

causal. Cuando ocurre una lectura seguida por una escritura, los dos eventos están en potencia relacionados de forma causal. De manera análoga, una lectura está relacionada de forma causal con la escritura que proporciona el dato obtenido por la lectura. Las operaciones que no están relacionadas de forma causal son concurrentes. Para que una memoria sea consistente de forma causal, debe obedecer las siguientes condiciones:

Las escrituras potencialmente relacionadas de forma causal son vistas por todos los procesos en el mismo orden. Las escrituras concurrentes pueden ser vistas en un orden diferente en máquinas diferentes.

En la Fig. 6.11 se da un ejemplo de consistencia causal. Aquí tenemos una sucesión de eventos permitida con memoria consistente de forma causal, pero prohibida para una memoria con consistencia secuencial o con consistencia estricta. Lo que hay que observar es que las escrituras W(x)2 y W(x)3 son concurrentes, por lo que no se requiere que todos los procesos los vean en el mismo orden ( P3 y P4 ). Si el software falla cuando procesos diferentes ven eventos concurrentes en orden distinto, se ha violado el contrato de memoria ofrecido por la memoria causal.

W(x)1P1:

P2:

R(x)2

R(x)1

P3:

P4:

R(x)3

R(x)1

W(x)3

R(x)1

W(x)2

R(x)2

R(x)3

Fig.6.11. Esta sucesión está permitida para una memoria con consistencia causal, pero no para una memoria con consistencia secuencial o una memoria con consistencia estricta. En la Fig. 6.12(a) se muestra una falla en la consistencia causal, dado que W(x)2 del proceso 2 depende potencialmente de W(x)1 del mismo proceso 1, ya que el valor 2 puede ser resultado de un cálculo a partir del valor 1 leído por el proceso. Esto obliga a que todos los procesos vean las operaciones de escritura en el mismo orden ( que no sucede en los procesos 3 y 4 ). Por el contrario, en la Fig. 6.12(b) se mantiene la consistencia causal. Se ha suprimido la lectura R(x)1 del proceso 2. Esto hace que W(x)1 del proceso 1 y W(x)2 del proceso 2 sean operaciones concurrentes no obligando al resto de los procesos a observarlas en el mismo orden.

W(x)1P1:

P2:

R(x)1

R(x)1

P3:

P4:

R(x)2

W(x)2

R(x)1

R(x)2

( a )

W(x)1P1:

P2:

R(x)1

P3:

P4:

R(x)2

W(x)2

R(x)1

R(x)2

( b )

Page 16: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 16

Ing. Fausto M. Orozco Carvajal

Fig. 6.12. (a) una violación a la memoria causal. (b) una sucesión correcta de eventos En la memoria causal. La implantación de la consistencia causal mantiene un registro de cuáles procesos han visto cuáles escrituras. Esto significa que debe construirse y mantenerse una gráfica de dependencia con las operaciones que dependen de otras. Hacer esto implica cierto costo. Consistencia PRAM y consistencia del procesador. En la consistencia causal se permite que las escrituras concurrentes sean vistas en diferente orden en varias máquinas, aunque las relacionadas de forma causal deben verse en el mismo orden por todas las máquinas. En siguiente paso en el relajamiento de memoria es eliminar este último requisito. Al hacer esto se tiene la consistencia PRAM ( Pipeline RAM), sujeta a la condición:

Las escrituras realizadas por un proceso son recibidas por los otros procesos en el orden en que son realizadas, pero las escrituras de procesos diferentes pueden verse en un orden diferente por procesos diferentes.

La consistencia PRAM se debe a Lipton y Sandberg ( 1988 ). El entubamiento de la RAM significa que las escrituras realizadas por un proceso pueden entubarse; es decir, el proceso no tiene que quedarse esperando que termine cada una antes de comenzar la siguiente. En la Fig. 6.13 se muestran eventos permitidos en una memoria con consistencia PRAM pero no con los demás modelos más fuertes anteriores.

W(x)1P1:

P2:

R(x)2

R(x)1

P3:

P4:

R(x)1

W(x)2

R(x)2

R(x)1

Fig. 6.13. Una sucesión de eventos válida para la consistencia PRAM Esta consistencia es fácil de implantar. De hecho dice que no existen garantías acerca del orden en que los diferentes procesos ven las escrituras, excepto que dos o más escrituras de una fuente llegan en orden, como si estuvieran en un entubamiento. Dicho en otras palabras, en este modelo, todas las escrituras generadas por procesos diferentes son concurrentes. La consistencia del procesador ( Goodman 1989 ) es tan cercana a la consistencia PRAM que algunos autores la consideran iguales. Sin embargo, Goodman dio un ejemplo que sugiere el establecimiento de una condición adicional sobre una memoria con consistencia del procesador, a saber, la coherencia de la memoria. En otras palabras, para cada posición de memoria x existe un acuerdo local acerca del orden de las escrituras en x. Las escrituras en diferentes posiciones no tienen que ser vistas en el mismo orden por los diferentes procesos.

Page 17: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 17

Ing. Fausto M. Orozco Carvajal

Consistencia débil. Aunque la consistencia PRAM y la del procesador proporcionan mejor desempeño que los modelos más fuertes, siguen siendo innecesariamente restrictivos para muchas aplicaciones, pues requieren que las escrituras generadas en un proceso sean vistas en todas partes en orden. No todas las aplicaciones requieren todas las escrituras y mucho menos en orden. Considere el caso de un proceso dentro de una sección crítica, donde se leen y escriben algunas variables en un ciclo. Aunque se supone que los demás procesos no tocan las variables hasta que el primer proceso salga de su sección crítica, la memoria no tiene forma de saber cuándo un proceso está en una sección crítica y cuándo no, de modo que debe propagar todas las escrituras a todas las memorias de la manera usual. La mejor solución consiste en dejar que el proceso termine su sección crítica y garantizar entonces que los resultados finales se envíen a todas partes, sin preocuparse demasiado porque todos los resultados intermedios han sido propagados a todas las memorias en orden, o incluso si no fueron propagados. Esto puede lograrse con el uso de una variable de sincronización utilizada para mantener la memoria sincronizada. Cuando termina una sincronización, todas las escrituras realizadas en esa máquina se propagan hacia fuera y todas las escrituras realizadas en otras máquinas son traídas hacia la máquina en cuestión. En otras palabras, toda la memoria ( compartida ) esta sincronizada. Dubois ( 1986 ) define este modelo, llamado consistencia débil diciendo que tiene tres propiedades:

1. Los accesos a las variables de sincronización son secuencialmente consistentes. 2. No se permite realizar un acceso a una variable de sincronización hasta que las

escrituras anteriores hayan terminado en todas partes. 3. No se permite realizar un acceso a los datos ( lectura o escritura ) hasta realizar

todos los accesos anteriores a las variables de sincronización. El punto 1 asegura que todos los procesos ven los accesos a las variables de sincronización en el mismo orden. El punto 2 obliga a terminar en todas partes las escrituras que están en progreso, terminadas o de forma parcial en algunas memorias pero no en otras. Cuando termina una variable de sincronización, también se garantiza que han terminado todas las escrituras anteriores. Al realizar una sincronización después de actualizar los datos compartidos, un proceso envía los nuevos valores a las demás memorias. El punto 3 dice que cuando se tiene acceso a las variables ordinarias ( es decir, que no son de sincronización ), ya sea para lectura o escritura, se han realizado todas las sincronizaciones anteriores. Al realizar una sincronización antes de leer los datos compartidos, un proceso puede estar seguro de obtener los valores más recientes. Existe algo de confusión en relación a lo que debe entenderse por “realizados” en el contexto de DSM. Se dice que una lectura ha sido realizada cuando ninguna escritura posterior afecta el valor regresado. Se dice que una escritura ha sido realizada en el instante en que todas las lecturas posteriores regresan el valor escrito por la escritura. Se dice que una sincronización ha sido realizada cuando todas las variables compartidas han sido actualizadas. También debe distinguirse entre las operaciones que se realizan de manera local o global.

Page 18: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 18

Ing. Fausto M. Orozco Carvajal

A diferencia de los modelos anteriores de memoria, éste apoya la consistencia en un grupo de operaciones, no en lecturas y escrituras individuales. Este modelo es más útil cuando no son comunes los accesos aislados a las variables compartidas, la mayoría de los cuales aparece por grupos ( muchos accesos en un período breve y después ninguno durante un período largo ). En la Fig. 6.14(a) siguiente vemos que el proceso P1 realiza dos escrituras en una variable ordinaria y después realiza una sincronización ( indicada por la letra S). Si P2 y P3 no han sido sincronizados todavía, nada garantiza lo que verán, por lo que este serie de eventos es válida. La Fig. 6.14(b) es diferente. En este caso, se ha sincronizado P2, lo que significa que su memoria se ha actualizado. Al leer x, debe obtener el valor 2. Con la consistencia débil no puede obtener el valor 1, como lo muestra la figura.

W(x)1P1:

P2:

R(x)2

R(x)1

P3: R(x)1

W(x)2

R(x)2

S

S

S

W(x)1P1:

P2: R(x)1

W(x)2 S

S

(b)( a )

Fig. 6.14. (a) una secuencia válida de eventos para la consistencia débil. (b) Una secuencia no válida para la consistencia débil. Consistencia de liberación. La consistencia débil tiene el problema de que, cuando se tiene acceso a una variable de sincronización, la memoria no sabe si esto se realiza debido a que el proceso ha terminado de escribir en las variables compartidas o está a punto de iniciar una lectura. En consecuencia, debe realizar las acciones necesarias en ambos casos, a saber, garantizar que todas las escrituras iniciadas localmente han sido terminadas ( es decir, propagadas a las demás máquinas ), así como recoger todas las escrituras de las demás máquinas. Si la memoria establece la diferencia entre la entrada a una región crítica y salir de ella, sería posible una implantación más eficiente. Para proporcionar esta información, se necesitan dos tipos de variables u operaciones de sincronización. La consistencia de liberación ( Gharachorloo, 1990 ), proporciona estos dos tipos . Los accesos de adquisición indican a la memoria del sistema que está a punto de entrar a una región crítica. Los accesos de liberación dicen que acaba de salir de una región crítica. Estos accesos se implantan como operaciones ordinarias sobre variables o como operaciones especiales. Es responsabilidad del programador colocar el código explícito en el programa para indicar el momento de realizarlos. Con la consistencia de liberación es también posible utilizar barreras en vez de las regiones críticas. Una barrera es un mecanismo de sincronización que evita que cualquier proceso inicie la fase n + 1 de un programa hasta que todos los procesos terminan la fase n. Cuando un proceso llega a una barrera, debe esperar que todos los demás procesos lleguen ahí también.

Page 19: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 19

Ing. Fausto M. Orozco Carvajal

Cuando llegue el último, todas las variables compartidas se sincronizan y continúan entonces todos los procesos. La salida de la barrera es la adquisición y la llegada es la liberación. La adquisición y la liberación no tiene que aplicarse a toda la memoria, sino para proteger sólo algunas variables compartidas específicas, en cuyo caso sólo éstas se mantienen consistentes. Las variables compartidas que se mantienen consistentes son protegidas. El contrato entre la memoria y el software en la consistencia de liberación dice que cuando el software realiza una adquisición, la memoria se asegurará de que todas las copias locales de las variables protegidas sean actualizadas de manera consistente con las remotas, en caso de ser necesario. Al realizar una liberación, las variables protegidas que hayan sido modificadas se propagan hacia las demás máquinas. La realización de una adquisición no garantiza que los cambios realizados de manera local sean enviados a las demás máquinas de inmediato. De manera análoga, la realización de una liberación no necesariamente importa las modificaciones de las demás máquinas. En la figura 6.15 se muestra una secuencia de eventos válida para la consistencia de liberación. El proceso P1 realiza una adquisición, modifica una variable compartida dos veces, y después realiza una liberación. El proceso P2 realiza una adquisición y lee x. Se garantiza que obtiene el valor de x al momento de la liberación, es decir, 2 ( a menos que la adquisición de P2 se realice antes de la adquisición de P1). Si la adquisición fue realizada antes de la liberación de P1, la adquisición tendría que retrasarse hasta que ocurra la liberación. Puesto que P3 no puede realizar una adquisición antes de leer una variable compartida, la memoria no tiene la obligación de darle el valor actual de x, de modo que se permite que regrese 1.

W(x)1P1:

P2:

P3: R(x)1

W(x)2

R(x)2

Acq(L) Rel(L)

Acq(L) Rel(L)

Fig. 6.15. Una secuencia de eventos válida para la consistencia de liberación.

En general, una memoria compartida distribuida que tiene consistencia de liberación debe cumplir las reglas siguientes:

1. Antes de realizar un acceso ordinario a una variable compartida, deben terminar con éxito todas las adquisiciones anteriores del proceso en cuestión.

2. Antes de permitir la realización de una liberación, deben terminar las lecturas y escrituras anteriores del proceso.

3. Los accesos de adquisición y liberación deben ser consistentes con el procesador ( no se pide la consistencia secuencial ).

Si se cumplen estas condiciones y los procesos utilizan la adquisición y liberación de manera adecuada ( en pares adquisición-liberación ), los resultados de cualquier ejecución serán iguales a lo que ocurriría en una memoria con consistencia secuencial. De hecho, los bloques de acceso a las variables compartidas son atómicos debido a las primitivas de adquisición y liberación, con el fin de evitar el intercalado.

Page 20: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 20

Ing. Fausto M. Orozco Carvajal

Una implantación diferente de la consistencia de liberación es la consistencia de liberación con laxitud ( Kheleher 1992 ). La consistencia de liberación, tal como se explicó, se denomina consistencia de liberación fuerte. La diferencia entre las dos estriba en el hecho de que en la consistencia de liberación fuerte, cuando ocurre una liberación, el procesador que la realiza expulsa todos los datos modificados hacia los demás procesadores que tienen una copia en caché y que podrían necesitarlos. No existe forma de determinar si en realidad los utilizarán, de modo que para estar seguros, todos obtienen lo que se modifica. En la consistencia de liberación con laxitud, al momento de la liberación nada se envía, sino que cuando se realiza una adquisición, el procesador que intenta realizar ésta debe obtener los valores más recientes de las variables de la máquina o máquinas que los contienen. Se puede utilizar un protocolo con marcas de tiempo para determinar cuál de las variables debe transmitirse. El resultado neto, es que con la consistencia de liberación con laxitud, no se genera tráfico alguno en la red hasta que otro procesador realiza una adquisición. Las parejas adquisición-liberación repetidas por un mismo procesador en ausencia de competencia del exterior son gratuitas. Consistencia de entrada. Este modelo de consistencia, diseñado para su uso con las secciones críticas, fue diseñado por Bershad ( 1993 ). Al igual que en la consistencia de liberación, se requiere que el programador ( o el compilador ) utilice la adquisición y la liberación al principio y al final de cada sección crítica, respectivamente. Sin embargo, a diferencia de la consistencia de liberación, la consistencia de entrada requiere que cada variable compartida ordinaria se asocie con alguna variable de sincronización, como una cerradura o una barrera. Cuando se realiza una adquisición sobre una variable de sincronización, sólo se pide la consistencia de las variables compartidas ordinarias protegidas por esa variable de sincronización. La diferencia entre la consistencia de entrada y la de liberación con laxitud es que esta última no asocia las variables compartidas con cerraduras o barreras y en el momento de la adquisición debe determinar de manera empírica las variables que necesita. Desde el punto de vista forma, una memoria exhibe la consistencia de entrada si satisface las siguientes condiciones ( Bershad y Sekauskas, 1991 ):

1. No se permite realizar un acceso de adquisición a una variable de sincronización con respecto de un proceso hasta que se realicen todas las actualizaciones de los datos compartidos protegidos con respecto de ese proceso.

2. Antes de permitir la realización de un acceso en modo exclusivo a una variable de sincronización por un proceso, ningún otro proceso debe poseer la variable de sincronización, ni siquiera en modo no exclusivo.

3. Después de realizar un acceso en modo exclusivo a una variable de sincronización, no se puede realizar el siguiente acceso en modo no exclusivo de otro proceso a esa variable de sincronización hasta haber sido realizado con respecto del propietario de esta variable.

La primera condición dice que cuando un proceso realiza una adquisición, ésta podría no concluir ( es decir, regresar el control al siguiente enunciado ) hasta actualizar todas las

Page 21: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 21

Ing. Fausto M. Orozco Carvajal

variables compartidas protegidas. En otras palabras, en una adquisición, deben ser visibles todas las modificaciones remotas a los datos protegidos. La segunda condición dice que antes de actualizar una variable compartida, un proceso debe entrar a una región crítica en modo exclusivo para garantizar que ningún otro proceso intente actualizarla la mismo tiempo. La tercer condición dice que si un proceso desea entrar a una región crítica en modo no exclusivo, primero debe verificar con el propietario de la variable de sincronización que protege la región crítica para buscar las copias más recientes de las variables compartidas protegidas. Resumen de los modelos de consistencia. Aunque se han propuesto otros modelos de consistencia, hemos analizado los principales. Difieren en sus restricciones, lo complejo de sus implantaciones, la facilidad para programarlos, y su desempeño. La consistencia estricta es la más restrictiva, pero debido a que su implantación en un sistema DSM es en esencia imposible, nunca se utiliza. La consistencia secuencial es factible, popular entre los programadores y de uso amplio. Sin embargo, tiene el problema del desempeño pobre. La forma de darle la vuelta a este resultado es relajar el modelo de consistencia. Algunas de las posibilidades aparecen en la Fig. 6.16(a), con un orden aproximado de restricciones decrecientes. Consistencia Descripción

Estricta Ordenamiento absoluto con respecto del tiempo de todo lo relacionado con el acceso a la memoria.

Secuencial Todos los procesos ven todos los accesos compartidos en el mismo orden.

Causal Todos los procesos ven los accesos compartidos relacionados causalmente en el mismo orden.

De procesador Consistencia PRAM + coherencia de memoria

PRAM Todos los procesos ven las escrituras de cada procesador en el orden en que fueron ejecutadas. Las escrituras de procesadores diferentes podrían no ser vistas en el mismo orden.

( a )

Débil Los datos compartidos sólo pueden considerarse como consistentes después de realizar una sincronización.

De liberación Los datos compartidos son consistentes al salir de una región crítica.

De entrada Los datos compartidos pertenecientes a una región crítica son consistentes después de salir de una región crítica.

( b ) Fig. 6.16.(a) modelos de consistencia que no utilizan las operaciones de sincronización, (b) modelos con

Page 22: Memoria Compartida Distribuida.pdf

Sistemas Operativos Distribuidos 6 - 22

Ing. Fausto M. Orozco Carvajal

operaciones de sincronización. La consistencia causal, de procesador y la PRAM representan condiciones menos estrictas donde no existe un acuerdo global del orden de las operaciones. Los diversos procesos pueden ver diferentes secuencias de operaciones, que pueden diferir en términos de las secuencias permitidas y las prohibidas, pero en todos los casos, el programador debe evitar ciertas cosas que funcionan sólo si la memoria tiene una consistencia secuencial. Un método diferente consiste en introducir variables explícitas de sincronización, como la consistencia débil, la de liberación y de entrada. Estos tres tipos se resumen en la Fig. 6.16(b). Cuando un proceso realiza una operación sobre una variable compartida ordinaria, no existen garantías del momento en que los resultados serán vistos por otros procesos. Las modificaciones sólo se propagan cuando se tiene acceso a una variable de sincronización. Los tres modelos difieren en el funcionamiento de la sincronización, pero en todos los casos, un proceso puede realizar varias lecturas y escrituras en una sección crítica sin llamar al transporte de datos. Al concluir la sección crítica, el resultado final se propaga a los demás procesos o está listo para la propagación en caso de que alguien más exprese su interés por ello. En resumen, la consistencia débil, la de liberación y la de entrada requieren construcciones de programación adicional que, cuando se utilizan de la manera indicada, permiten a los programadores suponer que la memoria tiene una consistencia secuencial, cuando de hecho no la tiene. En principio, estos tres modelos que utilizan la sincronización explícita deben poder ofrecer el mejor desempeño, pero es probable que diferentes aplicaciones produzcan resultados un tanto distintos. Se necesita mayor investigación antes de poder establecer concusiones firmes en estos aspectos.