Эта страница неверна. Кажется, утверждается, что атомарные операции без блокировки являются привилегированными на ISA в целом, но это не так. Я никогда не слышал о том, чтобы для атомарной проверки и установки или любой другой операции без блокировки требовался режим ядра.
Если бы это было так, потребовалось бы C++11 атомарное чтение-модификация без блокировки. операции записи для компиляции в системные вызовы, но они не выполняются на x86, ARM, AArch64, MIPS, PowerPC или любом другом обычном процессоре. (попробуйте на https://godbolt.org/).
Это также сделало бы невозможной «облегченную» блокировку (которая пытается получить блокировку без системного вызова). (http://preshing.com/20111124/always-use-a-lightweight-mutex/)
Обычные ISA позволяют пользовательскому пространству выполнять атомарные операции RMW с памятью, разделяемой между потоками или даже между отдельными процессами. Мне неизвестен механизм отключения атомарного RMW для пользовательского пространства на x86. Даже если на любой ISA такое есть, то это не нормальный режим работы.
Доступ только для чтения или только для записи обычно является атомарным в выровненных местах на всех ISA до определенной ширины (Почему целочисленное присваивание естественно выровненной переменной является атомарным в x86?), но атомарный RMW нуждается в аппаратной поддержке.
В x86 TAS — это lock bts
, что является непривилегированным. (Документация по префиксу lock
). x86 имеет широкий набор других атомарных операций, таких как lock add [mem], reg/immediate
, lock cmpxchg [mem], reg
и даже lock xadd [mem], reg
, которые реализуют fetch_add
, когда требуется возвращаемое значение. (Может ли num++ быть атомарным для 'int num'?)
Большинство RISC имеют LL/SC, включая ARM, MIPS и PowerPC, а также все более старые, более не распространенные RISC ISA.
futex(2)
— это системный вызов. Если вы вызываете его, все, что он делает, находится в режиме ядра.
Это резервный механизм, используемый облегченной блокировкой в случае возникновения конкуренции, который обеспечивает сон/пробуждение с помощью ОС. Таким образом, не futex
сама по себе делает что-либо в пользовательском пространстве, а реализации блокировок, построенные вокруг futex
, могут избежать выполнения системных вызовов в случае неконкуренции или низкой конкуренции.
(например, покрутите несколько раз в пользовательском пространстве, если блокировка станет доступной.)
Это то, что описывает справочная страница futex(7)
. Но мне кажется немного странным называть это «операцией фьютекса», если вы на самом деле не выполняете системный вызов. Я предполагаю, что это работает с памятью, на которую код ядра может смотреть от имени других ожидающих потоков, поэтому необходимая семантика для изменения ячеек памяти в коде пользовательского пространства зависит от futex
.
person
Peter Cordes
schedule
02.09.2018
Test_and_Set (TS)
. У процессоров Intel есть атомарность, им просто не хватает этой конкретной инструкции. Может быть, это поле в машинном регистре/управляющем регистре, и чтение/запись защищены? Пинг @PeterCordes. - person jww   schedule 02.09.2018cmpxchg
. Как я могу пропинговать его? - person flow2k   schedule 02.09.2018[assembly]
:P - person Peter Cordes   schedule 02.09.2018lock bts
с 386 года.bts
= Bit test and set. - person Peter Cordes   schedule 02.09.2018ts
. Вы знаете об арке, которая исходит из? Или они используют гипотетический набор инструкций? - person jww   schedule 02.09.2018ts
ни на одном ISA. Большинство из них являются LL/SC и не имеют атомарных RMW с одной инструкцией.) Ее часто называют TAS, точно так же, как cmpxchg обычно называется CAS. - person Peter Cordes   schedule 02.09.2018