Эти два термина четко не определены, и это не черно-белая вещь.
Модели памяти могут быть очень слабыми, чрезвычайно сильными или где-то между ними.
Это в основном относится к гарантиям, предлагаемым для одновременных обращений к памяти.
Наивно, вы ожидаете, что запись, сделанная в одном потоке, будет немедленно видна всем другим потокам. И вы ожидаете, что события будут появляться в одном и том же порядке во всех потоках.
Но в более слабой модели памяти ни один из них не может удержаться.
Последовательная согласованность - это термин для модели памяти, который гарантирует, что события будут отображаться в одном и том же порядке в всех потоках. Таким образом, модель памяти, которая обеспечивает последовательную согласованность, довольно сильна.
Более слабой гарантией является причинно-следственная последовательность: гарантия того, что события наблюдаются после событий, от которых они зависят.
Другими словами, если сначала записать значение x
по какому-либо адресу A
, а затем записать второе значение y
по тому же адресу, то ни один поток никогда не прочитает значение y
после считывания значения x
. Поскольку две записи выполняются по одному и тому же адресу, это нарушит причинно-следственную согласованность, если не все потоки будут соблюдать один и тот же порядок.
Но это ничего не говорит о том, что должно произойти с несвязанными событиями. Результат записи третьего значения в другой адрес памяти может наблюдаться в абсолютно любое время другими потоками (поэтому разные потоки могут наблюдать события в другом порядке, в отличие от последовательной последовательности)
Существует множество других таких уровней "согласованности", некоторые из которых сильнее, другие слабее и предлагают всевозможные тонкие гарантии того, на что вы можете положиться.
По сути, более сильная модель памяти предложит больше гарантий относительно порядка, в котором наблюдаются события, и, как правило, гарантирует поведение, более близкое к тому, что вы ожидаете интуитивно ожидать.
Но более слабая модель предоставляет больше возможностей для оптимизации, и, в особенности, она масштабируется лучше с большим количеством ядер (поскольку требуется меньше синхронизации)
Последовательная согласованность в основном бесплатна на одноядерном процессоре, выполнима на четырехъядерном, но будет чрезмерно дорогой в 32-ядерной системе или в системе с 4 физическими процессорами. Или система с общей памятью между несколькими физическими машинами.
Чем больше у вас ядер, и чем дальше они друг от друга, тем сложнее обеспечить, чтобы все они наблюдали события в одном и том же порядке. Таким образом, компромиссы сделаны, и вы соглашаетесь на более слабую модель памяти, которая дает более слабые гарантии.