Добрый день.
Разбираюсь с синхронизацией кешей многоядерного процессора. Допустим, что процессор работает по MESI протоколу https://en.wikipedia.org/wiki/MESI_protocol и, грубо говоря, имеет:
1. store buffer
2. invalidate queues
Запускаем код:
int a = 0, b = 0;
void cpu_0()
{
a = 4;
...
}
void cpu_1()
{
b = 3;
...
}
1. a и b находятся умещаются в одну кеш линию. Оба процессора имеют свою копию кеш линии, её статус - shared
2. cpu_0 выполняет a = 4, посылает запрос на инвалидацию кеш линии cpu_1, записывает a в store buffer.
3. cpu_1 помещает запрос на инвалидацию invalidate queues и отвечает подтверждением.
4. cpu_1 выполняет b = 3.
5. cpu_1 решает обработать invalidate queues.
6. ...
Вопрос: как обрабатывать запрос invalidate queues? Если кеш линию заинвалидить, то мы потеряем b. Мы не можем скинуть в память, так как кеш линия cpu_1 содержит невалидную a. Как не потерять b?