Está en la página 1de 26

c 


     c   c     

?


?

En el capitulo 7 se clasificaron los computadores con múltiples procesadores, en función de la


organización del sistema de memoria en dos grupos: multiprocesadores o computadores paralelos
en los que todos los procesadores comparten el mismo espacio de direcciones y multicomputadores
o computadores paralelos en los que cada procesador tiene su espacio de direcciones particular.
Estos grupos se han comparado en algunos de sus aspectos de diseño y en los que respecta a la
diferencia en el estilo de programación al que esta mas orientada su implementación. En
multiprocesadores, como todos los procesadores comparten el mismo espacio de direcciones, la
comunicación entre ellos se lleva a cabo a través de la memoria común. Como se comentaba en el
Capitulo 8, el sistema de comunicación en multiprocesadores ofrece una visión global de la
memoria, formando parte, del sistema de memoria. En un sistema uniprocesador, el programador
espera que el sistema de memoria proporcione al leer en una dirección, el último valor escrito en la
misma, según el orden de las instrucciones especificado en el código (orden del programa).
Igualmente, en el multiprocesador, se espera que el sistema de memoria proporcione al leer en una
dirección, el ultimo valor que se ha escrito en dicha dirección (por el mismo procesador que lee o
por otro procesador), según el orden que asegura el sistema de memoria (modelo de consistencia de
memoria) y el forzado explícitamente por el programador con código adicional de sincronización.
El presente capitulo estudia aspectos de diseño particulares de multiprocesadores derivados del
espacio de memoria compartido mantenimiento de coherencia en el sistema de memoria, modelo
de consistencia de memoria, mecanismos de sincronización entre otros del cual solo tomaremos el
primero.



c  
     c   c     

Œ Œ?    ? ?   ? ? ?

 ? ?  ?

En el primer apartado de esta sección se describe el problema de mantenimiento de coherencia.


Ademas se presentan las facetas de diseño de un protocolo de mantenimiento de coherencia y se
clasifican los protocolos en dos grupos: protocolos de espionaje (snooping protocols) y protocolos
basados en directorios. Los siguientes apartados se dedican a estudiar estos dos tipos de protocolos.

Œ ŒŒ? ????????
La utilización de jerarquía de memoria con el fin de acercar la velocidad de acceso a memoria a
la velocidad del procesador, posibilita que pueda haber varias copias en el sistema de memoria
de la misma dirección (bloque de memoria). Esto puede ocurrir tanto en sistemas
multiprocesadores como en sistemas uniprocesador. El sistema de memoria incluye caches,
memoria principal, controladores, buffer (buffer de escritura, buffer para combinar escrituras,
etc.) y también el medio para comunicar estos componentes (red de interconexión).

Si en el sistema de memoria las copias de una dirección no tienen el mismo contenido,


tendremos u?????? La falta de coherencia en el sistema de
memoria puede provocar problemas si los componentes del sistema (dispositivos de E/S,
procesadores) se comunican entre si a traces de posiciones de memoria (escribiendo y leyendo
en posiciones de memoria) . No se podrá conseguir llevar a cabo satisfactoriamente la
comunicación si el componente que recibe no lee a través de la dirección de memoria a la que
accede lo último que se ha escrito. En sistemas con un único componente con caché, se puede
dar una situación de incoherencia entre memoria caché y la memoria principal. En sistemas con
múltiples componentes con caché, además, puede haber incoherencia entre distintas caches

En el ejemplo de la figura 10.1, el procesador Pk lee la posición de memoria D (1L), lo que


provoca que el bloque de memoria donde se encuentra esta dirección se copie a su cache. Tras la
transferencia, el contenido de la posición de memoria D en la cache es 3, coincide con el
contenido de la dirección en memoria principal. Si a continuación Pk escribe un nuevo valor, 4,
en la dirección D (2E), escribirá en la copia de la dirección que tienen en su caché. Tendremos
entonces una incoherencia en el sistema de memoria, ya que la posición D no tiene el mismo
contenido en memoria principal y en la caché.

c 
R R


 
 
o ur

Π

Figura 10.1



c  
     c   c     


En el ejemplo de la figura 10.2, dos procesos que se ejecutan en procesadores distintos, Pk y Pj,
acceden a una dirección D que comparten y que además pueden modificar. Primero leen (1L y
2L) el contenido de la dirección de memoria D, lo que provoca los correspondientes fallos de
caché y la transferencia del bloque de memoria donde se encuentra la dirección a la cache de los
procesadores. A continuación, uno de ellos, Pk, , escribe en D, pasando el contenido de D en su
cache a 4. Como consecuencia se produce una falta de coherencia en el sistema de memoria
entre la cache de Pj y Pk, además de una falta de coherencia con la memoria principal. Si,
además, un dispositivo de E/S se escribe en la posición D, modificara la copia de memoria.
Entonces ninguna de las 3 copias de D en el sistema tendrá el mismo contenido. En el ejemplo
de la Figura 10.3, tres procesadores, Pk, Pj y Pi, escriben en secuencia en una misma dirección,
y como resultado, las cuatro copias en el sistema relativas a la misma dirección tienen distinto
contenido.

c 
? R R R
? 
? 
?   
?  
?    o ur
?
?
  Π
?
?
!u?Π?

A continuación se presentan algunos ejemplos que destapan situaciones de incoherencia en el


sistema de memoria. En la tabla 10.1 se resumen estos ejemplos. La falta de coherencia entre
caché y memoria principal que se muestra en las Figuras 10.1, 10.2 o 10.3 se podrá de
manifiesto si un dispositivo de E/S lee la posición de memoria D, ya que accedería al valor no
actualizado de la memoria. En estos ejemplos, la falta de coherencia entre cache y memoria
principal, también se hace visible si alguna caché del sistema falla al acceder a la dirección
compartida D, por ejemplo la cache de Pi en la figura 10.2, ya que leería el contenido no
actualizado de la memoria.



c  
     c   c     

 " ?Œ Œ? ??uu??#?$????%?
? u? &u? ? ? ? ? u? $? ?
#???'?? ???
m  
     
     
  

      
   
 
?$? C-MP E/S
? $? ? ? C-MP Fallo de caché
?
? $? (? ? u? C-MP Emigra
? procesoMfallo de
caché
? $? ? ? C-C Lectura de caché no
? actualizada

También pueden dar problemas las situaciones de incoherencia entre caché y memoria principal
para datos modificables privados de un proceso si el sistema operativo permite que los procesos
migren de un procesador a otro. Supongamos que en el ejemplo de la figura 10.1, el proceso en
Pk que acaba de modificar D en su caché, emigra al procesador Pj. Si e Pj el proceso accede a
D, leería de memoria un contenido no actualizado.

La falta de coherencia entre cachés de la figura 10.2 o de la figura 10.3, provocada al modificar
un dato compartido, se hace patente si, por ejemplo, el proceso Pj vuelve a leer el contenido de
D, ya que el valor que obtiene, es el contenido no actualizado de su caché.

Hay dos Y 

       Y
     utilizados en cachés: escritura
inmediata (write-through) y posescritura (write-back). Con u?, siempre que se
modifica una dirección en caché de un procesador, se modifica en memoria principal. Cada
escritura supone entonces la utilización de la red, y, además, para transferir datos aislados, con el
consiguiente desaprovechamiento del ancho de banda de la red.

La situación del tráfico empeora en sistemas con múltiples procesadores, ya que puede haber
varios procesadores escribiendo simultáneamente. Dado que es probable que en una aplicación
se escriba varias veces en un bloque (a las variables contiguas en el código del programa se les
asigna posiciones consecutivas de memoria), en la misma dirección i en distintas direcciones
(principios de localidad temporal y espacial), se incrementarían entonces las prestaciones si el
bloque se transfiere por la red una vez realizadas todas las modificaciones (se disminuye el
número de accesos, y cuando se accede, se aprovecha en mayor medida el ancho de banda de la
red). Con escritura inmediata se opta por no provocar incoherencia entre cache y memoria
principal cuando se escribe en caché; pero no obstante, no se evita la incoherencia entre cachés,
o entre caché y memoria cuando escribe en memoria principal algún componente.

Con u, cuando un procesador modifica una dirección solo se escribe la caché del
procesador; el dato no se transfiere a memoria principal, por lo que se puede escribir varias
veces en un bloque sin acceder a memoria principal. La actualización de memoria se realiza



c  
     c   c     

posteriormente, cuando el bloque que contiene la dirección modificada se elimina de caché a fin
de dejar espacio para otro bloque. Se debe, pues, mantener información en el directorio caché
sobre los bloques de memoria modificados en la caché. Utilizando posescritura, en lugar de
escritura inmediata, se permite que aparezcan incoherencias ente caché y memoria también
cuando se escribe en caché. En definitiva, la situación empeora con posescritura frente a
escritura inmediata. Por ejemplo, supongamos un sistema con cachés de posescritura, aunque la
red garantice orden en las transferencias, el orden en el que se transfieren a memoria una seria de
escrituras en una dirección en caché por parte de distintos procesadores, dependerá del orden en
el que se produzcan los reemplazos en las cachés, pero no del orden en el que se haya escrito en
la dirección (Ejemplo de la figura 10.3)

La falta de coherencia entre cachés, y los problemas debidos a la incoherencia entre memoria
principal y cache, se pueden solventar con hardware específico de coherencia.

Existen alternativas para abordar incoherencias entre caché y memoria principal cuando hay
algún componente en el sistema que no tiene hardware especifico de mantenimiento de
coherencia. Por ejemplo, se puede evitar la falta de coherencia, declarando las zonas de memoria
implicadas en la comunicación con estos componentes como <<no cacheables>> (bloques no
transferibles a caché), o con escritura inmediata (para dispositivos de salida). Otra posibilidad es
eliminar los problemas por falta de coherencia cuando el componente implicado va a acceder a
los datos, utilizando para ellos instrucciones que desalojan líneas de la caché trasladándolas a la
memoria si esta no esta actualizada (flush). Los programadores de bajo nivel (lenguaje maquina
o ensamblador) y de alto nivel, deberían conocer las peculiaridades de la arquitectura abstracta
del procesador relacionada con la memoria (instrucciones flush, instrucciones para cambiar de
tipo zonas de memoria, por ejemplo, para cambiar a no cacheable) para abordar de la forma mas
eficiente posible la comunicación entre componentes a través dl sistema de memoria.

c 
R R R
   

  Œ
  
 
 o u*  o uj  o ur

Figura 10.3

Como ya se ha apuntado, en sistemas con múltiples cachés, como los multiprocesadores, puede
haber falta de coherencia entre cachés, tanto si se utiliza escritura inmediata como si se utiliza
posescritura. Los protocolos de coherencia de caché resuelven este problema haciendo que cada



c  
     c   c     

escritura sea visible a todos los procesadores, propagando de forma fiable un nuevo valor escrito
en una dirección. Los protocolos de coherencia de caché utilizan dos alternativas para propagar
una escritura: escritura con actualización (write-update), y escritura con invalidación (write-
invalidate). Si se utiliza u??u)*, siempre que se modifica una dirección en
la copia de un bloque en la caché de un procesador, se modifica la dirección en todas las copias
del bloque que se encuentren en cachés de otros procesadores.

Si se utiliza u??(*, cuando se va a modificar una dirección en la caché de


un procesador, primero se invalidan las copias del bloque que contiene esa dirección en otras
cachés. De esta forma, el procesador que va a modificar una dirección, primero obtiene acceso
exclusivo al bloque que la contiene. Cuando a continuación otro procesador lea la dirección, su
caché falla, provocando que tenga que acceder a memoria principal, consiguiendo asi el dato
actualizado. El acceso exclusivo pretende asegurar que no hay otras copias del bloque en cachés
de otros procesadores que se puedan leer o escribir cuando se esta realizando la escritura.
Invalidar es más rápido que actualizar, ya que solo se debe transferir la dirección (bloque) en la
que se va a escribir, mientras que al actualizar, se deben transferir además los datos a escribir.
Obsérvese que usando la invalidación solo se permite compartir un bloque de memoria mientras
se lee el bloque.

Si se escribe varias veces sucesivas en un bloque sin que otro procesador lea, usando
invalidación se puede reducir el acceso a la red (transferencias) frente ala política de
actualización, ya que una vez invalidado un bloque, nuevas modificaciones del bloque por parte
del mismo procesador no originan transferencias. Por contra, si se escribe para que a
continuación otros u otros procesadores lean lo escrito, podría se mas eficiente actualizar, ya que
al invalidad las copias en otras cachés cuando se escribe, la lecturas posteriores de esa dirección
por otros procesadores provocan fallos de caché, lo que origina trafico en la red. Obsérvese que
en un bus estos fallos de caché provocan cada uno una transferencia del bloque a través del bus.
Sin embargo, con actualización, al modificar el bloque en la caché, se actualizan el resto de
cachés con un único acceso a través del bus con el que se difunde el bloque. La escritura con
actualización no presenta este beneficio en redes que no implementan difusión. En general, la
política de actualización genera un tráfico innecesario cuando los datos compartidos se leen por
pocos procesadores.

Hay que tener en cuenta que puede ocurrir que la propagación de una escritura a todos los
procesadores a través del sistema de comunicación, requiera un tiempo no predecible distinto por
cada procesador. Entonces, si se solapan varias propagaciones de escrituras de la misma
dirección, distintos procesadores podrían recibir y leer en distinto orden las escrituras en la
dirección. Esto haría al sistema incoherente, aunque propaga las escrituras. Debe tenerse en
cuenta por ejemplo, que hay redes de interconexión que no garantizan que los paquetes lleguen
al destino en el mismo orden en el que se inyectaron en la red; e, incluso, hay redes que no
garantizan ni tan siquiera un orden en las transferencias punto-a-punto (misma fuente y mismo
destino). Por otra parte, el buffer entre la red y una caché también puede reordenar operaciones
de memoria entrantes.



c  
     c   c     

Para que el sistema de memoria de un multiprocesador sea coherente, los resultados de
cualquiera ejecución de un programa deben ser tales que, para cualquier dirección, sea posible
generar un  
  en los accesos a dicha dirección (es decir, generar un orden global entre
todas las lecturas y escrituras emitidas respecto a dicha dirección), que sea 
 


     
(valores devueltos con lecturas) y en el que a) los accesos generados
por cualquier proceso particular ocurran en el orden en el que han sido emitidos al sistema de
memoria por este proceso, y b) el valor obtenido por cualquier acceso de lectura sea el ultimo
valor escrito en esa dirección en el orden serie. Esta definición de coherencia de caché requiere
que se cumplan dos condiciones para garantizarla: 1) la escritura en una dirección se debe hacer
visible en un tiempo finito (no se especifica cuando) a otros procesadores (     )
y 2) las escrituras en una misma dirección deben verse en el mismo orden por todos los
procesadores (un proceso/ procesador <<ve>> un valor escrito emitiendo una operación de
lectura). El segundo punto supone que el sistema de memoria debe    
  (una detrás
de otra) las operaciones de escritura en la misma dirección, para que así todos los procesadores
vean estas escrituras en el mismo orden (     ).

Una forma de obtener un orden en las escrituras en una dirección consiste en asegurar que todas
las actualizaciones o invalidaciones de esa dirección parten del mismo punto del sistema de
comunicación, y si es necesario, no comenzar una nueva escritura (no emitir nuevas
actualizaciones o invalidaciones) hasta no haber recibido reconocimientos de las
actualizaciones o invalidaciones de la escritura anterior de todas las cachés con copa (así se
asegura que la escritura anterior ha terminado con respecto a todos los procesadores).

Las comunicaciones uno-a-muchos para actualizar o invalidar las copias del bloque que se
modifica, se pueden implementar cómodamente en un bus, ya que admite la difusión de forma
natural. En buses se utilizan para mantener la coherencia ??%?+, que
aprovechan que todos los componentes conectados al bus pueden ver (espiar) el contenido del
bus. El controlador de caché espía los paquetes en el bus y actúa en consecuencia (por ejemplo,
invalidando o actualizando la copia que tienen de un bloque). En el bus es sencillo implementar
coherencia, ya que 1) todas las transferencias que aparecen en el son visibles a todos los
controladores de caché (propagación), y 2) las transferencias son visibles a todos los
controladores en el mismo orden, el orden en el que aparecen en el bus (serialización). Pero los
esquemas de espionaje no escalan bien debido a los retardos que supone tener que esperar a que
todas las cachés vean las peticiones en el bus (ocupación del bus por las peticiones) y a que se
debe atender peticiones de todos los componentes del sistema.

En redes en las que la difusión es costosa de implementar o en la que se requiera una mayor
escalabilidad, se utilizan &u???, en los que, para reducir el trafico,
se envían los paquetes únicamente a las cachés implicadas (cachés con copia del bloque al que se
accede). La información sobre las cachés con copia de un bloque se mantiene en un directorio
asociado a la memoria principal. Los protocolos basados en directorios aparecieron antes que los
basados en espionaje. Inicialmente se propuso in directorio centralizado con información de
todos los bloques de la memoria principal. Pero este directorio centralizado monolítico supone
un cuello de botella al igual que el bus (debe atender a todas las peticiones) Se obtienen mejores



c  
     c   c     

prestaciones distribuyendo el directorio entre los módulos de memoria principal; el subdirectorio
de cada modulo mantiene información solo son de los bloques que contiene el modulo. Los
diferentes subdirectorios procesan peticiones en paralelo.

El hecho de que las operaciones de acceso a memoria tengan que llegar al directorio para obtener
información de un bloque (cachés con copia), permite poder utilizar el directorio para establecer
un orden entre accesos a una misma dirección (serializar), de forma que todos los procesadores
vean este mismo orden. No obstante, para establecer un orden en algunos sistemas se pueden
necesitar paquetes de reconocimiento de actualizaciones o invalidaciones que confirmen que ha
finalizado una escritura anterior (como se comento mas arriba), e información de estado para el
bloque en el directorio que informen sobre si esta o no pendiente de terminar un acceso
(esperando reconocimientos). Veamos un ejemplo con protocolo de actualización. Supongamos
que llegan al directorio dos escrituras a una dirección. Las dos originan el envío de paquetes de
actualización desde el directorio a las cachés con copia. El directorio genera los paquetes de
actualización de las dos peticiones en el orden en las que las atiende. Si el sistema de
comunicación garantiza un orden en los paquetes enviados entre dos puntos (enviados entre una
misma fuente y un mismo destino), entonces el orden en el que todos los procesadores van a ver
las escrituras seria el orden en el que se atienden en el directorio. Sin embargo, si la red no
garantiza un orden en los paquetes enviados entre dos nodos de red, las actualizaciones pueden
llegar a alguna cache en distinto orden en las escrituras. Si la red no garantiza un orden en los
paquetes entre 2 puntos, se podrían utilizar paquetes de reconocimiento de actualización para
detectar que ha finalizado una escritura, de forma que el directorio no debería emitir nuevas
actualizaciones de una escritura hasta haber recibido los reconocimientos de la escritura anterior
en la misma dirección.

También se pueden encontrar esquemas de coherencia de cache organizados en jerarquías


compuestos por protocolos de espionaje y directorios, según la red utilizada en cada nivel. En la
siguiente tabla se resumen las facetas de diseño generales de un protocolo para mantenimiento
de coherencia de sistemas con múltiples caches en el que se mantiene coherencia en el sistema
de memoria. La ejecución de una operación de lectura o escritura por el procesador del nodo
deberá generar el envío de paquetes cuando el bloque donde se encuentra la dirección a la que
se accede no esta en su cache en un estado valido o cuando se realiza una escritura en una
dirección que esta en cache y hay copias en otras caches.
Por otra parte, también se generan paquetes como consecuencia de transferencias recibidas desde
otros nodos (por ejemplo, por la llegada de la petición de un bloque del que se tiene la única
copia valida).

Además del estado de un bloque en la caché, se pueden definir diversos estados de un bloque en
memoria que van a reflejar en el estado en caches. El estado de un bloque en memoria informa al
controlador de la memoria sobre las acciones que debe realizar ante paquetes que reciba que
impliquen a dicho bloque. Igualmente el estado de un bloque en cache informa al controlador de
caché sobre las acciones que debe realizar ante peticiones del procesador del nodo sobre dicho
bloque, paquetes recibidos con peticiones sobre dicho bloque u otros eventos que afecten al
bloque.



c  
     c   c     


Como se indican en la tabla, en un protocolo basado en directorios, se deben, además, definir la


consecuencia de transferencias punto-a ±punto que se deben generar para completar un acceso a
memoria (que requiere comunicación entre nodos) y los nodos que intervienen en estas
transferencias

-? ???*!???????
??-? ????
+Œ,? .??u)*??? ?
u??#?u#?/?
+,? .?????
u??(*#?u??u)*#?/?
+0,? ????
+0Œ,? $? ? ? ? ? &u? ? ? ? ? ?
+,?
+0,? $?$? ?!?? ?u1u??
?????u???!??$?
??????&u?(???$?
? ? ? ? +? ? ? %? ? ? &u? ? ?
?&u?(#??&u??$u??&u????,?
+00,? $? ? ? ? ? u? &u? ? ? ? ?
?+,?

Los multiprocesadores UNA y CC-NUMA tienen hardware para mantenimiento de coherencia.


La mayor parte de las cachés utilizan posescritura con memoria principal, e igualmente es más
común utilizar escritura con invalidación, especialmente si se utilizan directorios. Los sistemas
pueden ofrecer la posibilidad de utilizar diferentes políticas con diferentes bloques de memoria;
así, además de bloques con posescritura, se pueden definir con escritura inmediata, o con
bloques no cacheables. En NUMA se pueden declarar los datos compartidos como no
cacheables. También la implementación del protocolo puede permitir cambiar de política
dinámicamente (en Symmetry de Sequent, en la primera escritura en un bloque se utilizaba
actualización, y en las siguientes invalidación), o utilizar distinta política según el estado del
bloque en caché (implementación mixta). Para flexibilizar el cambio de política, la actualización
con el tiempo y la depuración de errores, se ha propuesto la utilización de procesadores para
implementar el protocolo de coherencia, es decir, como asistentes de comunicación (Stanford
FLASH, Wisconsin Typhoon), tanto procesadores de propósito general como propósito
especifico. Pero esta alternativa ofrece significativamente menores prestaciones que una
implementación a nivel hardware del protocolo con una maquina de estado finitos [Michael,
1999].

A continuación se presentan con mas detalles los protocolos de coherencia basados en espionaje
(snoopy) y los protocolos basados en directorios



c  
     c   c     

Œ Œ??????%?+,?

Los protocolos de espionaje se basan en la difusión de los paquetes asociados al mantenimiento


de coherencia a todas las caché. Se implementan eficientemente en multiprocesadores basados
en buses, ya que el bus realiza la difusión de forma natural. El hardware de coherencia asociado
a las cachés puede espiar fácilmente en un bus los accesos a memoria del resto de componentes
del sistema y actuar en consecuencia. Como ejemplo se estudian dos protocolos para
mantenimiento de coherencia basados en invalidación: el protocolo de tres estados MSI y el
protocolo de cuatro estados MESI. En su estudio se tendrán en cuentan las facetas de diseño de
la Tabla 10.2.

Œ ŒŒ???(*????+
,?

El protocolo de tres estados que se va a mostrar en este apartado utiliza pos escritura como
política de actualización de memoria principal, y escritura con invalidación como política
para mantener coherencia entre caché. El acrónimo MSI se forma concatenando las iniciales
del nombre en inglés de los tres estados para los bloques en caché que incluye el protocolo. A
continuación se describe el resto de facetas lógicas de diseño para una posible
implementación de protocolo MSI.

???&u-?

Un bloque en caché puede estar en alguno de los siguientes estados:

o? Modificado (M). Si el bloque en la caché se encuentra en este estado, significa que es el


único componente en el sistema con una copia valida del bloque; el resto de caché y la
memoria tiene una copia do autorizada. La caché debe entonces proporcionar el bloque si
observa al espiar el bus que algún componente lo solicita, y debe invalidarla si algún otro
nodo solicita una copia exclusiva del bloque para su modificación.
o? - Compartida (C, shared). Supone que todas las copias de bloque que pueda haber en el
sistema, en cachés y en la memoria principal, están actualizada. La caché debe invalidar
su copia si observa al espiar el bus que algún otro nodo solicita una copia exclusiva del
bloque para su modificación.
o? Invalido (I). Supone que el bloque no está físicamente en la caché, o si se encuentra, ha
sido invalido por el controlador como consecuencia de la escritura en el bloque en otra
caché.

Se puede ordenar estos estados en función del grado de propiedad o disponibilidad del bloque
por parte del procesador al que pertenece la caché, de la siguiente forma (orden creciente):
Inválido, Compartido y Modificado. El estado modificado supone que el procesador tiene el
uso exclusivo de bloque, de forma que puede disponer él, tanto para leer como para escribir,
sin informar al resto del sistema. Como en este caso la caché del procesador tiene la única
copia válida del bloque en el sistema (único propietario), debe atender a las peticiones del
bloque a través del bus. Mientras que el estado invalido supone que el procesador tiene que
acceder al bloque a través de la red.



c  
     c   c     

Se podría utilizar dos estados en memoria para un bloque: válido, si tiene una copia válida, o
invalida (modificador o dirty), si la copia no es la última actualizando; es decir, hay un caché
que ha modificado el bloque (Estado modificado). Un estado valido para un bloque informa al
controlador de memoria que puede proporcionar el bloque en caso de haber en el bus una
petición que incluya la lectura de dicho bloque. La implementación puede evitar el uso de
estados en la memoria con el fin de ahorrar en almacenamiento. En este caso, la memoria
siempre entregaría el bloque ante una petición de lectura; no obstante, el sistema permitiría
inhibir a la memoria si resulta necesario.

$?&u?u?!?u???'?

Un nodo terminal, a través del controlador de caché, puede generar las siguientes transferencias
como consecuencia de paquetes recibidos de otros nodos:

o? &u? ? *? ? u? ? u? &u? +, Este paquete se genera como
consecuencia de la lectura del procesador (PrLec) de una dirección que no se encuentra en
su caché. El controlador de la caché inicia la transacción de lectura poniendo en el bus la
dirección a la que se desea acceder. El sistema de memoria (memoria principal u otra caché)
proporcionará el bloque donde se encuentra la dirección solicitada.
o? &u??*???/u(??u?&u?+ /,. Como el bloque puede
estar en estado inválido el paquete pedirá también la lectura del bloque; si el paquete
estuviera en estado compartido, se descartará la respuesta con el bloque que esta petición
provoca. Este paquete se genera como consecuencia de una escritura del procesador (PrEsc)
en una dirección cuyo bloque en la caché del procesador se encuentra en estado compartido
o inválido (incluyendo dentro de inválido la no presencia). El controlador del caché genera
un paquete que indicará una dirección en la que se desea escribir. El resto de cachés con
copias válidas del bloque invalidan sus copias. También se invalida el bloque en memoria si
se encuentra en estado válido. El procesador puede solicitar una confirmación de ese
paquete. ?
o? &u??*???u?+ ,?Este paquete lo genera el controlador de
caché cuando se reemplaza un bloque modificado en la caché como consecuencia del
acceso del procesador a un bloque que no se encuentra en la caché. El bloque a reemplazar
generado por la circuitería de reemplazo debe transferirse a memoria principal si está en
estado modificado (ya que la memoria no tiene el bloque actualizado). El controlador de la
caché genera la transferencia poniendo en el bus la dirección del bloque a escribir en
memoria y el contenido del propio bloque. El procesador no conoce este hecho y no espera
ninguna respuesta.?
o? &u? ? ? ? ? &u? ? +"&u,? ? u? '? La
genera un nodo que observa en el bus una petición del bloque que incluye su lectura (PtLec,
PtLecEx) si el nodo comprueba que tiene la única copia válida del bloque en el sistema (es
decir, el bloque está en estado modificado en su caché).



c  
     c   c     

????u?&u?

?Π0?? ?? ?


? ?? $? 2?u? ?u?
&u?(????
?? ?
(? *?

!u?
Procesador lee (PrLec) Modificado
Procesador escribe
(PrEsc) Modificado
&u?? 3?&u?u?
+,? "&u?+"&u,? ?
$?+ ,?
&u??? 3?u?&u?
/u(??&u? +"&u,?(??
+ /,? ? (2?
3?&u??
)? u?"&u?+ ,? (2?
Proceso lee (PrLec) Compartido
??
3?&u? /?
+ ,? $?
??????????
Paquete de Lectura
+
?
,?
(PtLec) Compartido
&u???
(???
/u(??&u? (?
??
+,? 3?&u?? ?
??
+ ,? 3?&u? /? $?
(?+,? Paquete de lectura
PtLec Invalido
Paquete de acceso
exclusivo al bloque
(PtLecEx) Invalido



c  
     c   c     

En la tabla 10.3 y la figura 10.4 se resumen las transiciones de estado de un bloque en la caché
de un procesador como consecuencia de acciones de lectura/ escritura del procesador (PtLec,
PtLecEx) y como consecuencia de paquetes que el controlador observa en el bus (PtLec,
PtLecEx).

o? ??u, es decir, el procesador lee (PrLec) y el bloque no está en caché (estado


inválido). El controlador de caché del procesador que lee difunde un paquete de petición de
lectura de un bloque de memoria (PtLec); el estado del bloque en la caché después de la
lectura será compartido. La copia del bloque en otras cachés también tendrá estado
compartido, y en la memoria, válido. El paquete PtLec provoca los siguientes efectos en
otras cachés:
1.? Si el bloque se encuentra en otra caché en estado modificado, deposita el bloque en el
bus (respuesta RpBloque) y pasa a estado compartido. La memoria también recoge el
bloque del bus pasando a estado válido.
2.? Si el bloque está compartido, la memoria proporciona el bloque a la caché que lo
solicita. El bloque sigue en estado compartido.

o? ? ? u? ? ? ? ? &u? ? ? '# es decir, el procesador escribe
(PrEsc) y el bloque no está en caché. El controlador de caché del procesador que escribe
difunde un paquete de petición de acceso exclusivo al bloque (PtLecEx); el estado del
bloque en la caché después de la escritura se promociona. El paquete PtLecEx provoca los
siguientes efectos:

1.? Si la memoria tiene el bloque válido, lo deposita en el bus y pasa a estado inválido.
2.? Si una caché tiene el bloque en estado modificado, deposita el bloque en el bus y pasa a
estado inválido.
3.? Si una caché tiene el bloque en estado compartido, pasa a estado inválido.

o? ???u??&u?, es decir, el procesador escribe (PrEsc) y el


bloque está en caché en estado compartido. Si el bloque está en la caché en estado
compartido, antes de escribir se debe obtener acceso exclusivo al bloque, para lo cual el
controlador de caché difunde un paquete de petición de acceso exclusivo al bloque
(PtLecEx); el estado del bloque en la caché después de la escritura se promociona a
modificado (el acierto de escritura en bloque compartido se trata esencialmente como el
fallo de escritura). El paquete PtLecEx generado provoca los siguientes efectos:

1.? La memoria deposita el bloque en el bus, ya que lo tiene válido (el bloque depositado se
puede ignorar), y pasa a estado inválido. Para evitar que la memoria deposite en este
caso el bloque en el bus y reducir así el tráfico, se debe añadir un nuevo paquete al
sistema para esta situación en la que el procesador escribe y el bloque está en estado
compartido. Sería un paquete de petición de acceso exclusivo, pero sin lectura (PtEx).
2.? El bloque no puede estar en estado modificado en otra caché.
3.? Si una caché tiene el bloque en estado compartido, pasa a estado inválido.



c  
     c   c     

o? Acierto de escritura en bloque modificado, es decir, el procesador escribe (PrEsc) y el
bloque está en caché en estado modificado. Como el nodo ya tiene la propiedad exclusiva
del bloque, no se genera ningún paquete. El bloque sigue en estado modificado.

o? Acierto de lectura, es decir, el procesador lee (PrLec) y el bloque se encuentra actualizado


en la caché. En este caso el bloque se mantiene en el mismo estado. No genera ningún
paquete.

Reemplazo, fallo en el acceso del procesador a otro bloque, y la política de reemplazo


selecciona este bloque para hacer sitio al nuevo (no mostrado en la figura 10.4). Si el
bloque reemplazado se encuentra en estado modificado, el controlador de caché del
procesador que escribe difunde un paquete de pos escritura en memoria (PtPEsc), el estado
del bloque en la caché pasa a ser inválido (no está presente físicamente). Hay que tener en
cuenta que se utiliza pos escritura como política de actualización de memoria principal.
Este paquete PtPEsc provoca que el bloque se transfiera a memoria pasando el estado del
bloque en memoria a válido.

Œ Œ???(*??u??+
,?

El ´protocolo de cuatro estados que se va a mostrar utiliza pos escritura como política de
actualización de memoria principal, y escritura con invalidación como política para mantener
coherencia entre cachés.

Según hemos visto en la sección anterior, en el protocolo MSI, si un procesador escribe en un


bloque en su caché, debe generar una transferencia que invalide copias en otras cachés, aunque no
haya otras copias del bloque en cachés de otros procesadores. Esto degrada las prestaciones de
aplicaciones secuenciales ejecutadas en multiprocesadores, ya que estas no se comparten variables
entre procesos. Por tanto, no habrá bloques de memoria realmente compartidos por cachés de
distintos procesadores: un bloque que se encuentra en una caché en el estado MSI de compartido,
estará solo en esta caché y en la memoria principal (suponiendo que los procesos no emigran a otros
nodos). En el protocolo MESI se ha añadido un nuevo estado, llamado exclusivo, que describe esta
situación. Un bloque en estado exclusivo en una caché estará válido solo en esta caché y en la
memoria. Si un bloque se encuentra en estado exclusivo en la caché de un nodo y del procesador del
nodo escribe en el bloque, no se genera paquete para solicitar uso exclusivo del bloque (invalidando
posibles copias), ya que se sabe que ninguna otra caché tiene copia del bloque. En este nuevo estado
incluido en MESI, el grado de disponibilidad de un bloque por parte del procesador se encuentra en
el grado de disponibilidad del estado compartido y el estado modificado. En el estado exclusivo
son dos los propietarios del bloque: memoria principal y una caché. A continuación se describe el
resto de facetas lógicas de diseño para una posible implementación del protocolo MESI.

???u?&u-?

Un bloque en caché puede estar en alguno de los siguientes estados:

o? $?+ , Si el bloque en la caché se encuentra en este estado, significa que es el único


componente en el sistema con una copia válida del bloque, el resto de cachés y la memoria,



c  
     c   c     

tienen una copia no actualizada. La caché debe proporcionar el bloque si observa al espiar el
bus que algún componente lo solicita, y debe invalidarla si algún otro nodo solicita una copia
exclusiva del bloque para su modificación.
o? /u(?+ , Si el bloque en la caché se encuentra en este estado, significa que es la única
caché en el sistema con una copia válida del bloque; el resto de cachés tienen una copia no
válida. La memoria tiene también una copia actualizada del bloque. La caché debe invalidar su
copia si observa al espiar el bus que algún otro nodo solicita una copia exclusiva del bloque
para su modificación.
o? ?+#?
, Supone que el bloque es válido en esta caché, en memoria y en al
menos alguna otra caché. La caché debe invalidar su copia si observa al espiar el bus que algún
otro nodo solicita una copia exclusiva del bloque para su modificación.
o? (?+, Supone que el bloque no está físicamente en la caché, o si se encuentra, ha sido
invalidado por el controlador como consecuencia de la escritura en la copia del bloque situada
en otra caché.

$?&u?u?!?u???'-?

Usaremos los mismos paquetes que en el protocolo MSI.

????u?&u?



c  
     c   c     

 " -?

?Π?? ???


? ??$?2?u??u?
&u?(????
?? ?
(? *?

!u?
Procesador lee (PrLec) Modificado
Procesador escribe
(PrEsc) Modificado
&u?? 3?&u?u?
+,? "&u?+"&u,? ?
$?+ ,?
&u??? 3?u?&u?
/u(??&u? +"&u,?(??
+ /,? ? (2?
3?&u??
)? u?"&u?+ ,? (2?
Procesador lee (PrLec) Exclusivo
? ?
?
+ ,? $?
&u?u?
/u(?+ ,? ?
+,? ?
&u???
/u(??&u? (???
+ /,? (2?
Proceso lee (PrLec) Compartido
??
3?&u? /?
+ ,? $?
??????????
Paquete de Lectura
+
?
,?
(PtLec) Compartido
&u???
(???
/u(??&u? (?
??
+,? 3?&u?? ?
??
+ ,? 3?&u? /? $?
(?+,? Paquete de lectura
PtLec Invalido
Paquete de acceso
exclusivo al bloque
(PtLecEx) Invalido

En la tabla 10.4 y la figura 10.5 se resumen las transiciones de estado para un bloque en la caché de
un procesador para una implementación del protocolo de cuatro estados MESI. Las transiciones son
consecuencias de acciones de lectura/escritura del procesador y de transferencia que el controlador
observa en el bus. Se genera una transferencia cuando se detecta un fallo en el acceso inmediato a la
caché en una operación de lectura o escritura, bien porque no se encuentra en caché una copia
actualizada del bloque o bien porque antes de poder escribir en caché debe obtener el uso exclusivo
del bloque.



c  
     c   c     

o? ??u, es decir, el procesador lee una dirección del bloque (PtLec) y éste no está
en caché. El controlador de caché del procesador que lee difunde un paquete de petición de
lectura de un bloque de memoria (PtLec). El estado del bloque en la caché después de la
lectura pasará a ser compartido si hay copias del bloque en otras cachés, y pasará a estado
exclusivo si no hay copias del bloque en otras cachés. El controlador de la caché que
solicita el bloque, requiere conocer, pues, si el bloque solicitado se encuentra en otras
cachés. Se puede añadir una línea OR cableada que informe si hay cachés con copias del
bloque solicitado. La actualización de esta OR por parte de los controladores de caché
realizaría en la fase de direccionamiento (en el diagrama de estados de la figura 10.5 y en la
tabla 10.4 se ha notado por S la salida de esta OR). La memoria dispondrá del bloque válido
al terminar el proceso. El paquete PtLec provoca los siguientes efectos en otras caché:
1. Si el bloque se encuentra en otra caché en estado modificado, deposita el bloque en
el bus y pasa a estado compartido. La memoria también coge el bloque del bus.
2. Si el bloque se encuentra en estado exclusivo, pasa a estado compartido. En este
caso, la respuesta con el bloque que llega a la caché del nodo que lo cita procede de
memoria.
3. Si el bloque está compartido, sigue en estado compartido. El bloque que llega a la
caché del nodo que lo solicita procede de memoria.

Hay implementaciones en las que, si el bloque solicitado esta disponible en estado


válido en alguna caché en lugar de obtener el bloque de memoria, se proporciona por
parte de alguna de estas cachés con bloque válido. Hay que añadir entonces hardware,
que decida qué caché con bloque válido va a generar la respuesta con el bloque. Esta
alternativa es interesante en sistemas con memoria físicamente distribuida (protocolos
basados en directorios), ya que se puede proporcionar el bloque desde el nodo cercano
al que lo solicita.

o? ??u?????&u??'#?es decir, el procesador escribe (PrEsc) y


el bloque no está en caché. El controlador de caché del procesador que escribe difunde un
paquete de petición de acceso exclusivo al bloque (PtLecEx). El estado del bloque en la
caché después de la escritura será de modificado. El paquete PtLecEx provoca los
siguientes efectos:?
?
1.? Si una caché tiene el bloque en estado modificado, bloquea la lectura de memoria y
deposita el bloque en el bus. El bloque pasa en esta caché a estado inválido.
2.? Si una caché tiene el bloque en estado exclusivo o compartido, pasa a estado inválido.

o? ??u??&u?, es decir, el procesador escribe (PrEsc) y hay


una copia del bloque en su caché y en la caché de algún otro procesador. El controlador de
caché del procesador que escribe difunde un paquete de petición de acceso exclusivo al
bloque (PtLecEx). El estado del bloque en la caché después de la escritura será de
modificado. El paquete PtLecEx provoca los siguientes efectos:



c  
     c   c     

1.? La memoria puede depositar el bloque en el bus, pero se puede ignorar (la caché que ha
generado la petición PtLecEx tiene el bloque válido). Para evitar que se utilice el bus de
datos innecesariamente se puede añadir el diseño otro paquete distinto que pida acceso
exclusivo pero no la lectura de los datos (PtEx).
2.? El bloque no puede estar en estado exclusivo o modificado en otra caché.
3.? Si una caché tiene el bloque en estado compartido, pasa a estado inválido.

o? ? ? u? ? &u? $? ? /u(#? es decir, el procesador escribe
(PrEsc) y el bloque está en caché en estado modificado o exclusivo. Como no hay otro nodo
con copia válida del bloque en su caché no es necesario generar un paquete. El bloque pasa
a estado modificado si está en estado exclusivo o continúa en estado modificado.

o? ??u, es decir, el procesador lee (PrLec) y el bloque se encuentra en la caché


actualizado. En este caso el bloque se mantiene en el mismo estado. No genera ningún
paquete.

o? ), fallo en el acceso del procesador a otro bloque y la política (No mostrado en
Figura 10.5). El controlador de caché del procesador que escribe difunde un paquete de pos
escritura en memoria (PtPEsc) si el bloque reemplazado se encuentra en estado modificado.
El bloque pasa a estado inválido (no está presente físicamente). Este paquete PtPEsc
provoca que el bloque se trasfiera a la memoria pasando el estado del bloque en memoria a
válido (si se almacena información de estado en memoria).



c  
     c   c     


PARTE DE CARLOS



c  
     c   c     

Œ Œ0? (??!)*????
Comentaremos cuatro alternativas para implementar un directorio (Tabla 10.5): directorio
de vector de bits completo (full vector), directorio de vector de bits asignados a grupos
(coarse bit vector), directorio limitado y directorio encadenado. Estas cuatro
implementaciones difieren en cuanto el almacenamiento que requieren para mantener el
directorio; también influyen en las transferencias entre nodos que genera el protocolo para
mantener coherencia. En todas las alternativas, el directorio está distribuido entre los
nodos, en lugar de estar centralizado en una zona del sistema. El directorio asociado a un
modulo de memoria (a un nodo) tiene una entrada por cada bloque de modulo. El estado de
la copia de un bloque de un caché se encuentra en el directorio de caché, en la entrada
asignada del bloque. En el esquema de directorio encadenado la entrada de un bloque está
distribuido entre los cachés (directorio de caché).

El directorio se puede implementar en memoria principal, o bien en un módulo de memoria


independiente con mayores prestaciones que la memoria principal (por ejemplo, en Origen
[Laudon, 1997]). En caso de utilizar una implementación en memoria principal, se puede
añadir para mejorar prestaciones una caché de directorio para almacenar la información de
los bloques recientemente accedidos (por ejemplo, en el sistema Fireplane de Sun
[Charlesworth, 2001]).

??(????

En esta alternativa, como ilustra la Figura 10.8, la entrada de un bloque en el directorio


tiene un bit asociado a cada nodo de procesamiento del sistema, vector de bits de presencia
esta activo, indica que la caché del nodo asociado tiene una copia válida del bloque .
Además habrá uno o más bits de estado que utilizara el controlador de memoria para
determinar las acciones que ha de realizar .Como refleja la figura, las cachés a su ve en el
directorio caché, tendrán información sobre el estado en el que se encuentra el bloque en la
cache.

En esta implementación, el tamaño del directorio depende del número de nodos, N, en la


red .Esto supone que la expansibilidad del sistemas está limitada por el diseño del
directorio (tamaño del vector de bits), que además tendrá un tamaño excesivo para un
numero de nodos elevados.

El tamaño de un subdirectorio (directorio de un nodo) depende del número de nodos, y del


número de bloques de memoria en un nodo:

Tamaño_subdirectorio =(N+bits_estado) × (Tamaño_memoria_nodo/Tamaño_linea_cache)

El tamaño del directorio en el sistema completo depende entonces del cuadrado del número
de nodos y del número de bloques en un nodo. Obsérvese que si N+ bits_estado coincidiera



c  
     c   c     

    
 c      

 


 Π 
Œ Œ


  
 

  c



     

  
  


 
    

con el tamaño de una línea o bloque de caché, el tamaño del subdirectorio seria igual al
tamaño de la memoria del nodo. Así, por ejemplo, si una línea de cache en el sistema tiene
64 bytes=512 bits, un sistemas con 512 nodos requeriría un tamaño de directorio completo
mayor que el tamaño de la memoria.

Para aumentar la escabilidad se han utilizado varias alternativas, como el directorio con
vector de bits asignados a grupos, directorio limitado y el directorio encadenado,
comentados a continuación.

??(???!??!u?

Con esta alternativa también se utiliza un vector de bits de presencia para cada bloque pero
para incrementar escabilidad se asigna a cada bit de presencia del vector, un grupo de
nodos del sistema (coarse bit vector).Si el sistemas permite incrementar el número de nodos
asignados a un bit de presencia conforme se añaden mas nodos al sistema, la escabilidad
no estaría limitada por el numero de bits de presencia fijados para cada bloque en el
directorio. El problema de este esquema es que se deben enviar invalidaciones a todos los
nodos asignados a un bit de presencia, tengan o no copia del bloque.

El tamaño de un subdirectorio depende del número de nodos, N, del tamaño del grupo al
que se asigna un bit de presencia y del número de bloques de memoria en un nodo:

Tamaño_subdirectorio = (N/Tamaño_grupo+bits_estado) ×
(Tamaño_memoria_nodo/Tamaño_linea_cache)

El Origin 2000 se utiliza un directorio con un vector de 64 bits de presencia. Asignando a


un bit un único nodo el Origin puede llegar hasta 64 nodos. Para incrementar la escabilidad



c  
     c   c     

hasta 512 nodos, Origin permite que un bit de presencia pueda representar 8 nodos
[Laudon, 1997].

??

Para disminuir la necesidad de almacenamiento del directorio con respecto a la


implementación de directorio de bits completo, este esquema tiene en cuenta que en la
práctica habrá, en un momento dado, un número limitado de caches del sistema con una
copia valida de un bloque.

En esta alternativa, como se ilustra la figura 10.9, cada entrada del directorio, tiene
capacidad para k punteros (identificadores de caches o nodos) con copias del bloque con
k<N(N es el numero de nodos).Cada puntero necesita log2 N bits para codificar la

    
c  



  r  
"

«
  c

!  

  
    

!u?Π???

dirección de un nodo. En total, cada entrada del directorio necesita entonces k× log2N bits.
El tamaño de un subdirectorio dependerá de k × log2N, en lugar de N, y del número de
bloques en la memoria de un nodo:

Tamaño_subdirectorio= (k × log2N + bits_estado) ×


(Tamaño_memoria_nodo/Tamaño_linea_cache)

Con 512 nodos, el numero de bits para especificar caches con copia para una entrada de
9k.Con k<57, los bits de una entrada de directorio para especificar cachés con copia seria
menor de 512 bits.



c  
     c   c     

Con este esquema, mientras que el número de copias valida en el sistemas se mantenga
menor o igual a k, el protocolo de coherencia de cache (incluidos los paquetes que genera)
puede ser similar al implementado con directorio de vector d bits completo.

Pero con esta implementación, hay que plantearse que puede ocurrir la siguiente situación:
una petición de lectura de un bloque puede encontrar llena en el nodo origen la entrada del
directorio correspondiente a ese bloque. En ese caso hay invalidar una de las caches con
copia válida para ubicar la nueva cache. Esto supone tener que implementar algún
algoritmo de reemplazo (para seleccionar la copia a invalidar) y generar transferencias
adicionales.

En el chip EV7 de Compaq/HP se ha integrado, además del procesador Alpha 21364,la


interfaz de red (incluido controlador de memoria) y el encaminador (conmutador).El
controlador de memoria implementa un protocolo de coherencia de cache con directorio de
vector de bits o directorio limitado según el numero de nodos con copia de bloque. Si el
numero de caches con copia del bloque es pequeño, se puede almacenar en el directorio el
identificador de todas ellas (directorio limitado).Pero si hay un numero de vector de bits
asociados a grupos, en la que un bit de presencia, para una configuración de 64 nodos, cada
bit puede representar un grupo de cuatro procesadores.

??

En esta implementación, la entrada de un bloque en el directorio se implementa como una


lista enlazada (o doblemente enlazada) distribuido entre los directorios de las caches con
copia del bloque, como se ilustra en figura 10.10 .En memoria principal, la entrada del
directorio para el bloque queda reducida a los bits de estado y a un puntero a la ultima
cache que accedió al bloque. En el directorio de esta cache, en la entrada asociada al marco
donde se encuentra el bloque, habrá un puntero a la penúltima caché que leyó el bloque; en
una implementación doblemente enlazada habrá, además, un puntero al nodo origen. En
definitiva, en el directorio de las caches con copia del bloque. La entrada asociada al marco
donde está el bloque tendrá un puntero a otra cache con copia del bloque o dos punteros en
una implementación doblemente enlazada. Si un nuevo nodo solicita una copia compartida
del bloque, se inserta como nueva cabecera. La inserción en la cabecera supone menos
transferencias que la inserción al final de la lista.

El tamaño del subdirectorio en un nodo, sin contar los bits de estado, para una
implementación con un puntero a la siguiente cache con copia es:

Tamaño_subdirectorio= log2N × ((Tamaño_memoria_nodo


+Tamaño_cache_nodo)/Tamaño_linea_cache)

Teniendo en cuenta que la memoria cache tiene un tamaño menor que la memoria
principal, la capacidad del directorio para información de nodos con copia seria menor que



c  
     c   c     

la que se utilizaría con una implementación de directorio limitado con capacidad para dos
identificadores(k=2).

La implementación distribuida en las cachés del directorio mejora considerablemente las


necesidades de almacenamiento, pero supone un incremento en la latencia debido a los
paquetes de secuencia que se deben generar, Así, por ejemplo, supongamos que se tienen
que invalidar las copias de un bloque en otras caches como consecuencia de una petición de
acceso exclusivo(con o sin lectura). No se pueden generar los paquetes de invalidación para
todos los nodos simultáneamente, ya que la información sobre los nodos con copia del
bloque esta distribuida. Hay que recorrer la lista con paquetes para poder acceder a todos
los nodos e invalidar sus copias.

       

 

#  

   
? c

?   
  
?
  
?
  c   c   c
?

?   

!u?ΠΠ? ??
?
Π 

  ? ? 
Como comentamos en capitulo 7, el modelo de programación de memoria compartida
ofrece varias ventajas al programador respecto al modelo de paso de mensaje. En particular,
evita, o al menos relaja, la necesidad de distribuir la carga de trabajo (código y datos). Por
ello, los multiprocesadores han tenido una amplia aceptación en computación comercial, y
también en computación científica.

No obstante, para programar de forma eficiente y correcta multiprocesadores, los


programadores(a bajo y alto o nivel) deben tener u conocimiento preciso de la semántica
del sistemas de memoria. Si programan a bajo nivel con ensamblador o implementan



c  
     c   c     

herramientas de programación, sistemas operativos o controladores de dispositivos(figura
10.11),deben tener en cuenta la semántica proporcionada por el multiprocesador o modelo
de consistencia de memoria del hardware(arquitectura abstracta del sistemas de
memoria).Si programan a alto nivel con OpenMP,POSIX.Thread o HPF(Seccion 7.4),
deben tener en cuenta entonces la semántica del sistemas de memoria proporcionada por las
herramientas software de programación o modelo de consistencia de memoria del software.

Un modelo de consistencia de memoria especifica el orden en el cual las operaciones de


acceso a memoria deben parecer haberse realizado (operaciones de lectura, escritura).

En un procesador (o en un sistema uniprocesador), el orden en el que deben parecer haberse


ejecutado los accesos a memoria es el orden secuencial especificado por el programador(o
la herramienta de programación en el código que añade), denominado orden del programa.
Esto significa que el hardware o la herramienta de programación no puedan alterar, para
mejorar las prestaciones, el orden de las instrucciones.

Realmente pueden alterar el orden, pero deben parecer que nos e han alterado para
garantizarle al programador el modelo de consistencia .En concreto, se debe garantizar que:

V? Cada lectura de una dirección (o variable, si se programa en alto nivel), proporciona el


ultimo valor escrito en dicha dirección (dependencia de datos lectura después
escritura).
V? Si se escribe varias veces en la misma dirección, se deben retornar el ultimo valor
escrito (escritura después escritura).
V? Si se escribe en una dirección a la que previamente se ha accedido para leer, no se
debe obtener en la lectura previa el valor escrito posteriormente en la secuencia del
programa especificada por el programador (escritura después lectura).
V? No se puede escribir en una dirección si la escritura depende de una condición que no
se cumple (dependencias de control).

?


c  
     c   c     

PREGUNTAS:

1.? Si en el sistema de memoria las copias de una dirección no tienen el mismo contenido,
tendremos una incoherencia en el sistema de memoria«««««««««««««« ( V )
2.? Si usamos posescritura en lugar de escritura inmediata, NO se permite que aparezcan
incoherencias entre cache y memoria, también cuando se escribe en caché««««««.. ( F )
3.? La falta de coherencia en el sistema de memoria puede provocar problemas si los componentes
del sistema se comunican entre si a través de posiciones de memoria««««««««...( V )
4.? Cuanto utilizamos posescritura siempre que se modifica una dirección en cache se modifica
también en memoria principal«««««««««««««««...«««.«««««.( F )
5.? Para invalidar se debe transferir la dirección (bloque) y los datos««««««..««««( F )
6.? Un bloque en caché puede estar en alguno de los siguientes estados: Modificado, Compartida e
invalido««««««««««««««««««««««««««««.«««««.(V)
7.? El Paquete de petición de lectura de un bloque, se genera como consecuencia de la lectura del
procesador (PrLec)«««««««««««««««««««««««« ««««...(V)
8.? Los Protocolos de coherencia basados en espionaje son : Protocolo de invalidación de tres
estados y Protocolo de invalidación de cuatro estados ««««««««..««««««(V)
9.? Los estados MESI son: Modificado, Exclusivo, Compartido y Valido««««««««...(V)
10.? Los protocolos de espionaje se basan en la difusión de los paquetes asociados al mantenimiento
de coherencia a todas las caché«..«««««««...«««««««««««««««(V)




También podría gustarte