Documente Academic
Documente Profesional
Documente Cultură
Home: no existe ninguna copia en ninguna cache (la lista esta vaca)
Fresh: existen copias y todas son iguales y coherentes con la
informacin de la MP.
Gone: la informacin de MP no est actualizada, sea el bloque esta
modificado en las caches.
Lecturas (fallo)
Como en los ejemplos anteriores L (local) es el nodo que ejecuta la
operacin, H (home) es el nodo que tiene la variable (bloque) en memoria, y
R (remote) es el nodo que tiene la primera copia del bloque. Se va a realizar
una lectura en L, pero la variable (el bloque) no est en la cache, por lo que
se debe conseguir el bloque de datos que contiene la variable, y colocarlo
en la primera posicin de la lista de copias, usando la funcin List
Construction:
1.- Se reserva sitio en la cache para el bloque, y se pone en estado busy
(1a).
2.- Se enva una peticin a H (1b). Cuando llega la peticin, el estado del
bloque en el directorio H puede ser uno de los siguientes:
Home: Por lo tanto no existen copias del bloque en las caches. Por lo
tanto esta ser la primera copia. Por ello, se cambia el estado de
Home a Fresh y el puntero a la primera copia apuntara a L (2a). Por
ltimo se enva el bloque de MP (2b). Cuando llega a L, el bloque se
carga en la cache en estado only-fresh. Como no hay mas copias no
es necesario guardar punteros (3).
Fresh: Por lo tanto existen varias copias del bloque en las caches de
los procesadores, estas copias estn unidas en una lista, y tenemos
que situar a la nueva copia como primera copia de la lista. Para ello,
se modifica el puntero para que apunte a la nueva copia (2a), y se
enva el bloque de datos que est en MP ya que al ser su estado fresh
quiere decir que es coherente, tambin se enva la direccin de la
anterior cabeza de la lista (R), para que L se comunique con l para
actualizar los enlaces de la lista (2b). Cuando la respuesta de H llega
a L, se carga el bloque en la cache, y se mantiene el estado busy,
luego L enviara un mensaje al antiguo cabeza de la lista R, para
indicarle quien es ahora la nueva cabeza (3). Cuando llegue el
mensaje a R, se modificara el estado del bloque y los enlaces (4a).
Escrituras
En el protocolo SCI, solo el cabeza de la lista de copias puede modificar el
bloque, adems como es un protocolo de invalidacin, habr que invalidar
todas las copias, y quedar como nica copia. Se distinguen estos casos:
1. (acierto/cabeza), cuando la escritura es en la copia que est en la cabeza
de la lista. Se escribe y se invalida el resto de copias (INV): ->Purge
2. (fallo), cuando el bloque sobre el que se quiere escribir no est en la
cache, por lo tanto se tiene que conseguir el bloque y colocarlo como
cabeza de la lista de copias (List Construction); y luego se invalidad el resto
de copias: ->List construction + Purge
3. (acierto/intermedio), cuando el bloque que se quiere modificar se
encuentra en una posicin intermedia de la lista, ya que solo puede escribir
el cabeza de la lista, se debe hacer lo siguiente, (a) sacar la copia de la lista
de copias (Roll-out) y (b) efectuar las operaciones del caso 2: ->Roll-out +
List construction + Purge
Analizando el primer caso: para mantener la coherencia solo se tiene que
invalidar las copias restantes, para ello se ejecuta la funcin de coherencia
purge, segn el estado del bloque el procedimiento es el siguiente (4
posibilidades):
1.- El estado de la copia de la cabeza es only-fresh, es decir es la nica
copia, de todas maneras se tiene que cambiar el estado del bloque, tanto en
la cache como en el directorio, en la cache se debe poner en estado onlydirty y en el directorio junto a MP en estado Gone. Se enva un mensaje a H,
para que cambie el estado del bloque de fresh a gone, y con la confirmacin
(ACK) que llega desde el directorio, se termina la operacin.
En el segundo caso (fallo), una escritura con fallo en cache, se tiene que
conseguir una copia del bloque y ponerse en la cabeza de la lista (List
construction), se cambia el estado a Gone en el directorio en MP, y purge
para invalidar el resto de copias.
Por ultimo en el tercer caso, cuando hay un acierto en la cache, pero el
bloque no est en la cabeza de la lista, como solo se puede modificar la
copia que est en la cabeza de la lista, para poder escribir hay que sacar la
copia de la lista (Roll-out) luego introducirla de nuevo, ahora en la cabeza de
Actualizacin de la MP
Para terminar con las principales operaciones de coherencia tenemos que
analizar el reemplazo de un bloque en la cache. A pesar de que la copia del
bloque sea coherente con MP, hay que ejecutar la funcin roll-out para
eliminar el bloque de la lista de copias, y actualizar los punteros de la lista.
Si el bloque que se reemplaza est en estado only-dirty tenemos que
guardar los datos en MP y actualizar la informacin del directorio (en el nodo
H).
Un caso particular de la funcin Roll-out, es cuando el bloque que se quiere
eliminar esta en la cabeza de la lista, en este caso se hace lo siguiente:
1.- Se enva un mensaje de control al segundo de la lista para que cambie
de estado: Mid (Tail)-Valid (Fresh) Head (Only)-Dirty (Fresh).Mientras tanto,
el bloque est en estado busy.
Atomicidad y Carreras
Las operaciones de coherencia no son atmicas por lo que pueden ocurrir
interferencias entre ellas, adems en el directorio no se utilizan estados
busy, para evitar el problema de carreras, el procedimiento es el siguiente:
a) si no se puede procesar una peticin porque en ese momento el bloque
est en estado busy se almacena en un bfer para ser tratada
posteriormente; y b) si la peticin que llega no es coherente con los datos
que tenemos, simplemente se rechaza.
Veamos tres ejemplos:
1.- Se est aadiendo una copia ms, en L1, a la lista de copias de un
bloque de datos, y se est ejecutando la funcin list construction, ya se ha
avisado a H, y este ha actualizado el puntero a la nueva cabeza y ha
respondido con la direccin del procesador que era la cabeza anterior, la
copia de L1 todava est en estado busy, porque an no ha terminado la
operacin. Mientras se desarrolla esa operacin, el procesador L2 lee una
variable de ese bloque y falla (no est en la cache), por lo que enva a H una
peticin de bloque, H responde a L2 con la cabeza de la lista que es L1, y
ahora apunta a L2 como cabeza de la lista, cuando L2 recibe la respuesta
enva un mensaje a L1 (new head), pero cuando el mensaje llega a L1 el
estado del bloque todava es busy. L1 en lugar de rechazar el mensaje,
guarda la peticin para tratarla ms tarde, si hubiera otra peticin llegara a
L2 ya que es la nueva cabeza de lista, y as los procesadores irn formando
una lista provisional. Cuando termine la operacin de L1, se procesara el
mensaje pendiente de L2, y as la cabeza de la lista se ira moviendo hasta
completar la lista definitiva.
La misma estrategia se utiliza en otros casos, por ejemplo cuando se est
ejecutando la funcin purge.