JackKatch писал(а):
Начал изучать кэширование, может тороплюсь поделится, но похоже что с точки зрения здравого смысла, так должно работать
Кстати, о здравом смысле и всём таком прочем
Поддержание согласованности содержимого кэшей с памятью в многопроцессорной системе -- задача, скажем так, нетривиальная на аппаратном уровне. Что ещё хуже, такое поддержание ограничивает возможности увеличения количества процессоров на одной машине, ведь изменение информации в памяти со стороны одного из них должно доводиться до сведения кэшей всех других процессоров, причём быстро. Понятно, что контроллеры кэшей не могут обрабатывать бесконечно много уведомлений каждый такт, а соответственно, они ставятся в некую очередь -- а это вынуждает приостанавливать работу процессоров, которые пытаются записать в память, если эта очередь переполнена (нельзя выдать новое уведомление).
По этой причине во многих архитектурах аппаратного поддержания согласованности кэшей нет или оно ограничено некими пределами. Скажем, на IBMовских мэйнфреймах (хоть на древней Системе 360, появившейся в середине 1960-х, хоть на её далёких потомках в лице современной z/Architecture) процессор "замечает" запись в кэш только со стороны самого себя: если используется самомодифицирующийся код, никаких телодвижений предпринимать не нужно. Но он "не видит" записи ни со стороны других процессоров, ни со стороны ввода-вывода; соответственно, об этом нужно помнить программисту. (Впрочем, там это, как правило, несложно: любое прерывание вызывает так называемую сериализацию, т.е. завершение выполнения всех уже начатых команд, полную запись изменённых строк кэшей в память и аннулирование кэшей, и лишь после этого начинается выполнение обработчика прерывания -- соответственно, любые изменения в памяти, внесённые на момент прерывания, воспринимаются автоматически.) А, например, ARMы имеют право не видеть самомодификацию кода, т.е. там для гарантии, что модификация будет замечена, надо использовать так называемые барьеры данных и команд.
В общем, имейте в виду, если будете иметь дело с другими архитектурами: интеловская схема используется далеко не везде из-за её высокой стоимости и ограниченной масштабируемости на уровне железа.