Documentos de Académico
Documentos de Profesional
Documentos de Cultura
c c
?
?
c
c c
?
? ?
?
? ?
? ? ?
? ????????
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).
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? ?
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 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.
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
-? ???*!???????
??-? ????
+,? .??u)*??? ?
u??#?u#?/?
+,? .?????
u??(*#?u??u)*#?/?
+0,? ????
+0,? $? ? ? ? ? &u? ? ? ? ? ?
+,?
+0,?$?$? ?!?? ?u1u??
?????u???!??$?
??????&u?(???$?
? ? ? ? +? ? ? %? ? ? &u? ? ?
?&u?(#??&u??$u??&u????,?
+00,? $? ? ? ? ? u? &u? ? ? ? ?
?+,?
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
??????%?+,?
???(*????+
,?
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-?
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?
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? ? ? ? ? &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.
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.
???(*??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.
???u?&u-?
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???'-?
????u?&u?
c
c c
"-?
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.
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? ), 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 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)
c
c c
hasta 512 nodos, Origin permite que un bit de presencia pueda representar 8 nodos
[Laudon, 1997].
??
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:
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.
??
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:
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).
#
? 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.
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.
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:
?
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)