Спин-блокировки (блокировки CLH и блокировки MCS) в архитектуре UMA и архитектуре NUMA

задняя часть внешний интерфейс
Спин-блокировки (блокировки CLH и блокировки MCS) в архитектуре UMA и архитектуре NUMA

О спин-блокировках

Мы знаем, что спин-блокировка — это решение для достижения синхронизации, это неблокирующая блокировка. Основное различие между ним и обычной блокировкой заключается в том, как он обрабатывает отказ в получении блокировки, что блокирует поток и пробуждает его, когда это необходимо. Основным механизмом спиновой блокировки является слово spin, то есть замена операции блокировки операцией вращения. Когда поток пытается получить блокировку, если блокировка уже занята другим потоком, поток будет продолжать зацикливаться, чтобы проверить, снята ли блокировка, вместо того, чтобы приостанавливать или засыпать поток. Как только другой поток освобождает блокировку, этот поток может получить блокировку. Вращение — это состояние ожидания занятости, которое постоянно потребляет кванты времени процессора.

自旋锁

Архитектура УМА

Поскольку при анализе недостатков блокировок CLH и MCS возникают вопросы архитектуры процессора, нам необходимо понять две архитектуры процессора, прежде чем вводить каждую спин-блокировку: архитектуру UMA и архитектуру NUMA. В многопроцессорной системе по способу разделения памяти ее можно разделить на UMA (Uniform Memory Access) и NUMA (Non-uniform Memory Access), то есть равномерный доступ к памяти и неравномерный доступ к памяти.

Природа архитектуры UMA заключается в том, что каждое ядро ​​ЦП одновременно обращается к основному хранилищу. Давайте посмотрим на архитектуру UMA на базе шины.Всего процессоров ЦП 4, и все они напрямую подключены к шине и взаимодействуют через нее. Как видно из этой структуры, между каждым ЦП нет никакой разницы, они одинаково обращаются к основному хранилищу. Доступ к оперативной памяти занимает столько же времени, т.е. унифицированный доступ к памяти.

UMA架构

Когда ЦП хочет выполнить чтение или запись, он сначала проверяет, свободна ли шина, и только если она свободна, он разрешает ему обмениваться данными с основной памятью, в противном случае он будет ждать, пока шина освободится. Чтобы решить эту проблему, внутри каждого процессора вводится кэш. Таким образом, операция чтения CPU может выполняться в локальном кэше. Но в это время нам нужно учитывать согласованность данных между кешем и основной памятью в ЦП, иначе это может вызвать проблемы с грязными данными.

UMA架构2

NUMA-архитектура

В отличие от архитектуры UMA, в архитектуре NUMA не каждый ЦП имеет одинаковое время доступа к основной памяти, в архитектуре NUMA ЦП может получить доступ ко всей основной памяти. Как видно из рисунка ниже, если ЦП обращается к соответствующему локальному основному хранилищу через локальную шину, время доступа мало, но если осуществляется доступ к нелокальному основному хранилищу (удаленному основному хранилищу), время будет очень коротким. long, то есть ЦП обращается к локальной основной памяти.Оперативная память и доступ к удаленной основной памяти не имеют одинаковой скорости. Преимущество архитектуры NUMA заключается в том, что она обладает отличной масштабируемостью и позволяет объединить более ста ЦП.

NUMA架构

замок CLH

Крейг, Лэндин, Хагерстен изобрели замок CLH. Основная идея состоит в том, чтобы с помощью определенных средств преобразовать соревнование по опросу всех потоков для общей переменной в очередь потоков, а потоки в очереди опрашивают свои собственные локальные переменные.

В этом процессе преобразования есть два основных момента: во-первых, какая очередь должна быть построена и как должна быть построена очередь? Чтобы обеспечить справедливость, мы построим очередь FIFO. При построении очереди в основном реализуется путем перемещения хвостового узла.Каждый поток, который хочет получить блокировку, создает новый узел и присваивает новый узел хвосту через атомарную операцию CAS, а затем позволяет текущему потоку опрашивать определенный узел предыдущего узла Биты состояния. Как показано на рисунке, можно четко увидеть структуру очереди и операцию вращения, так что очередь очереди потока успешно построена. Во-вторых, как освободить очередь? После выполнения потока вам нужно только установить состояние узла, соответствующего текущему потоку, в разблокированное состояние.Поскольку следующий узел всегда опрашивается, блокировку можно получить.

CLH锁

Поэтому основная идея блокировки CLH состоит в том, чтобы заставить множество потоков конкурировать за ресурс в течение длительного времени, и преобразовать его в обнаружение только локальных переменных, упорядочив эти потоки. Единственное место, где есть конкуренция, — это конкуренция за хвост хвостового узла перед входом в очередь, но в это время количество конкурирующих потоков намного меньше. По сравнению с количеством опросов, которые все потоки напрямую конкурируют за ресурс, количество опросов также значительно сокращается, что также значительно экономит потребление синхронизации кэша ЦП, тем самым значительно повышая производительность системы.

Блокировка CLH решила проблему синхронизации, вызванную одновременно большим количеством потоков, но ее объектом вращения является передний приводной узел. В архитектуре NUMA могут возникнуть проблемы с производительностью, потому что если предшествующий узел и текущий узел больше не хранятся в одной и той же локальной доминанте, время доступа будет очень большим, что приведет к снижению производительности.

Блокировка МКС

Замок MCS был изобретен Джоном Меллором-Крамми и Майклом Скоттом, и он, казалось, решил проблему замка CLH. Он также основан на очередях FIFO, подобных блокировкам CLH, за исключением того, что опрашиваемые объекты отличаются. В блокировке MCS поток только вращает локальную переменную, а узел-предшественник отвечает за уведомление о завершении операции вращения. Таким образом сокращаются ненужные операции синхронизации между кэшем ЦП и основной памятью, а также снижается потеря производительности, вызванная синхронизацией.

Как показано на рисунке ниже, каждый поток соответствует узлу в очереди. Внутри узла есть переменная вращения, которая указывает, нужно ли его вращать. Как только узел-предшественник использует блокировку, он изменяет переменную вращения узла-последователя, чтобы уведомить его о том, что ему не нужно продолжать операцию вращения и что блокировка успешно получена.

MCS锁

Сосредоточьтесь на искусственном интеллекте, чтении и мышлении, расскажите о математике, информатике, распределенных технологиях, машинном обучении, глубоком обучении, обработке естественного языка, алгоритмах и структурах данных, глубине Java, ядре Tomcat и т. д.