В процессе подготовки материалов для постов про языки программирования понял что снова поторопился и хорошо бы сначала рассказать про модели памяти, как на уровне железа, так и на уровне языков программирования. И уже на этом фундаменте рассказать про внутренности ЯП.
Модель памяти - это набор правил и гарантий позволяющих нам писать детерминированные программы. Модель памяти может быть
- аппаратной, то есть это соглашение о том как работает процессор.
- программной, условно говоря это модель памяти <language name>.
И именно модель памяти говорит нам о том - возможны ли Data Race, Race Condition и прочие "неприятные артефакты" конкурентного программирования.
Начнем с базы - а именно модели под названием Sequential Consistency. Эту модель описал в 1979м Leslie Lamport в статье “How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs”.
Последовательная согласованность — модель согласованности, в которой результат любого выполнения такой же, как в случае если бы операции всех процессоров были выполнены в некотором последовательном порядке, и операции каждого отдельного процессора появлялись в этой последовательности в порядке определённом его программой.
Если очень простыми словами она гарантирует что:
- операции с общей памятью в рамках потока исполняются в порядке определенном программой.
- порядок между процессорами отсутствует, следовательно не гарантирован.
- только одна операция над памятью возможна в единицу времени (по сути ядро ЦП захватывает владение памятью и остальные ждут)
В теории модель хорошая и понятная, но на практике ни один процессор ее не реализует так как обращаться в общую память без промежуточного кеширования да еще и в эксклюзивном варианте чрезвычайно неэффективно. Но рассмотреть ее нужно было обязательно так как это некий идеал к которому нужно стремиться.
Визуальное представление
Спасибо, что читали, в следующих постах разберем модели памяти X86 и ARM и то какие допущения были сделаны в них, чтобы ускорить взаимодействия памяти и процессора.