El Protocolo Dragon [1] es un protocolo de coherencia de caché basado en actualizaciones que se utiliza en sistemas multiprocesador . La propagación de escritura se realiza actualizando directamente todos los valores almacenados en caché en varios procesadores. Los protocolos basados en actualizaciones, como el protocolo Dragon, funcionan de manera eficiente cuando una escritura en un bloque de caché es seguida por varias lecturas realizadas por otros procesadores, ya que el bloque de caché actualizado está disponible en las cachés asociadas con todos los procesadores.
Cada bloque de caché reside en uno de los cuatro estados: limpieza exclusiva, limpieza compartida, modificación compartida y modificación.
Para cualquier par de cachés, los estados permitidos de un bloque de caché dado junto con los estados de los otros estados de la caché son los siguientes (los estados abreviados en el orden anterior):
mi | Carolina del Sur | Sm | METRO | |
---|---|---|---|---|
mi | ||||
Carolina del Sur | ||||
Sm | ||||
METRO |
Hay 4 transacciones de procesador y 2 transacciones de bus.
Lectura del procesador (PrRd) : esto sucede cuando el procesador completa una lectura exitosa en un determinado bloque de caché ubicado en su caché.
Escritura del procesador (PrWr) : esto sucede cuando el procesador completa una escritura exitosa en un determinado bloque de caché ubicado en su caché. Esto hace que el procesador sea el último en actualizar el bloque de caché.
Error de lectura del procesador (PrRdMiss) : esto ocurre cuando el procesador no puede leer un bloque de caché de su caché y necesita recuperar el bloque de la memoria o de otro caché.
Error de escritura del procesador (PrWrMiss) : esto ocurre cuando el procesador no puede escribir en un bloque de caché desde su caché y necesita recuperar el bloque de la memoria u otra caché y luego escribir en él. Esto nuevamente hace que el procesador sea el último en actualizar el bloque de caché.
Bus Read (BusRd) : esto sucede cuando un procesador solicita al bus que obtenga el último valor del bloque de caché, ya sea de la memoria principal o de la caché de otro procesador.
Flush : esto sucede cuando un procesador coloca un bloque de caché completo en el bus. Esto es para reflejar los cambios realizados por el procesador en el bloque en caché en la memoria principal.
Actualización de bus (BusUpd) : esto ocurre cuando un procesador modifica un bloque de caché y otros procesadores necesitan una actualización en sus respectivos bloques de caché. Esto es exclusivo para escribir solo protocolos de actualización. BusUpd toma menos tiempo en comparación con la operación Flush, ya que las escrituras realizadas en cachés son más rápidas que en la memoria. Otro punto a tener en cuenta es que una caché no puede actualizar su copia local de un bloque de caché y luego solicitar al bus que envíe una actualización de bus. Si esto sucede, es posible que dos cachés actualicen independientemente su copia local y luego soliciten el bus. A continuación, verían las dos escrituras simultáneamente, lo que no seguiría la coherencia secuencial .
También se requiere una línea compartida para indicar si un determinado bloque de caché está disponible en múltiples cachés. Esto es necesario porque una de las cachés podría desalojar el bloque sin necesidad de actualizar los otros bloques. La línea compartida ayuda a reducir las transacciones de memoria y bus en algunos casos en los que el bloque está disponible en un solo caché y, por lo tanto, no se requiere una actualización de bus. Esta línea dedicada para detectar el intercambio se ve a través de protocolos de actualización de escritura, como el protocolo Firefly, y se implementa en base a estándares de bus como Futurebus (estándar IEEE P896.1). [2]
Según el estado actual del bloque y la transacción iniciada por el procesador, el bloque de caché experimenta una de las siguientes transiciones de estado:
Según el estado actual del bloque y la transacción iniciada por el bus, el bloque de caché experimenta una de las siguientes transiciones de estado:
El procesador con el bloque de caché en estado Sm es responsable de actualizar la memoria cuando se reemplaza el bloque de caché. Pero si la memoria principal se actualiza cada vez que se produce una transacción de actualización del bus, no hay necesidad de estados Sm y Sc separados, y el protocolo puede permitirse un solo estado compartido. Sin embargo, esto provoca muchas más transacciones de memoria [3] que pueden ralentizar el sistema, especialmente cuando varios procesadores escriben en el mismo bloque de caché.
El protocolo permite que los bloques de caché en el estado Sc se reemplacen silenciosamente sin ninguna actividad de bus. Si se realizó una transmisión para que otros cachés sepan que se está reemplazando un bloque Sc, podrían probar la línea compartida y pasar al estado E si no hubiera otros compartidores. La ventaja de tener un bloque en el estado E es que si el bloque se escribe más tarde, pasa al estado M y no es necesario generar una transacción de actualización del bus. Entonces, a costa de transmitir los reemplazos de bloques Sc, podemos evitar transacciones de actualización de bus. Y dado que la transmisión de reemplazos no es un factor crítico en el tiempo, si no se requiere un caché para procesar el reemplazo de inmediato, no hay inconvenientes. Por otro lado, si un caché no procesa una actualización de inmediato, puede dar lugar a actualizaciones fuera de servicio. En tales casos, un protocolo de actualización de tres estados, como elEl protocolo Firefly puede tener ventajas de rendimiento.
Write Invalidate es otro conjunto de protocolos de coherencia de caché , donde una vez que se modifica un bloque de caché, los otros valores del mismo bloque en otras cachés no se actualizan, sino que se invalidan. [4]Los protocolos de invalidación de escritura son más eficientes en los casos en los que hay muchas escrituras posteriores en el mismo bloque de caché, ya que la invalidación ocurre una vez y se evitan más transacciones de bus de otros procesadores. Sin embargo, el protocolo de actualización de escritura es más eficiente en los casos en los que una escritura en un bloque va seguida de varias lecturas en el mismo bloque. Dado que estamos actualizando los otros valores almacenados en caché una vez que los escribimos, tienen acceso a los datos de inmediato. En cuyo caso. el protocolo de invalidación de escritura es muy desventajoso porque cada vez que se modifica un bloque de caché en otro caché, el resto de los cachés necesarios encontrarán una falta de coherenciae inicie una transacción de bus para leer el nuevo valor. Por el contrario, el protocolo de actualización de escritura tiende, en ocasiones, a mantener actualizados los valores del bloque durante más tiempo del necesario, lo que conducirá a un aumento de otros tipos de fallos, es decir, conflictos y fallos de capacidad .
En el caso de Firefly , las transferencias de caché a caché de bloques modificados también se vuelven a escribir en la memoria principal al mismo tiempo. Pero dado que los accesos realizados a la memoria principal son más lentos por órdenes de magnitud en comparación con los cachés, requiere una complejidad adicional para realizar una escritura como una operación de bus separada. En cualquier caso, se traduce en un menor rendimiento. [5] Este problema se evita por completo en el caso del protocolo Dragon, ya que los bloques compartidos no se vuelven a escribir en la memoria en absoluto. Sin embargo, esto tiene el costo de un estado adicional (modificado compartido).