Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Двойной сравнитель и обмен (DCAS или CAS2) — это атомарный примитив, предложенный для поддержки определенных методов конкурентного программирования. DCAS принимает два не обязательно смежных участка памяти и записывает в них новые значения только в том случае, если они соответствуют предварительно заданным «ожидаемым» значениям; таким образом, это расширение гораздо более популярной операции сравнения и обмена (CAS). DCAS иногда путают с двойным по ширине сравнителем и обменом (DWCAS), реализованным инструкциями, такими как x86 CMPXCHG16B. DCAS, как обсуждается здесь, обрабатывает два разрозненных участка памяти, как правило, размером с указатель, в то время как DWCAS обрабатывает два соседних участка памяти размером с указатель. В своей докторской диссертации Майкл Гринвальд рекомендовал добавить DCAS в современное аппаратное обеспечение, показав, что его можно использовать для создания простой в применении и эффективной транзакционной памяти программного обеспечения (STM). Гринвальд отмечает, что преимущество DCAS перед CAS заключается в том, что CASn более высокого порядка (для нескольких элементов) может быть реализован за O(n) с помощью DCAS, но требует O(n log p) времени с унитарным CAS, где p — количество конкурирующих процессов. Одним из преимуществ DCAS является возможность относительно легко реализовать атомарные двусторонние очереди (т. е. двусвязные списки). Однако в последнее время было показано, что STM может быть реализован с сопоставимыми свойствами, используя только CAS. В целом, однако, DCAS не является панацеей: реализация алгоритмов без блокировок и без ожидания с его использованием обычно так же сложна и подвержена ошибкам, как и для CAS. Motorola в какой-то момент включила DCAS в набор инструкций для своей серии 68k; однако, медленная работа DCAS по сравнению с другими примитивами (видимо, из-за проблем с обработкой кэша) привела к его избежанию в практических контекстах. DCAS не поддерживается аппаратно в серийно выпускаемых процессорах. Обобщение DCAS на более чем два адреса иногда называют MCAS (multi word CAS); MCAS может быть реализован с помощью вложенного LL/SC, но такой примитив не доступен непосредственно в аппаратном обеспечении. В 2013 году Тревор Браун, Фейт Эллен и Эрик Руперт реализовали в программном обеспечении многоадресное расширение LL/SC (которое они называют LLX/SCX), которое, будучи более ограничительным, чем MCAS, позволило им, с помощью некоторой автоматической генерации кода, реализовать одно из наиболее производительных параллельных двоичных деревьев поиска (фактически, хроматическое дерево), немного превзойдя реализацию skip-list на основе CAS в JDK. В целом, DCAS может быть обеспечен более выразительной аппаратной транзакционной памятью. IBM POWER8 и Intel TSX предоставляют рабочие реализации транзакционной памяти. Отмененный процессор Rock от Sun также должен был поддерживать его.
Double compare and swap (DCAS or CAS2) is an atomic primitive proposed to support certain concurrent programming techniques. DCAS takes two not necessarily contiguous memory locations and writes new values into them only if they match pre supplied "expected" values; as such, it is an extension of the much more popular compare and swap (CAS) operation. DCAS is sometimes confused with the double width compare and swap (DWCAS) implemented by instructions such as x86 CMPXCHG16B. DCAS, as discussed here, handles two discontiguous memory locations, typically of pointer size, whereas DWCAS handles two adjacent pointer sized memory locations. In his doctoral thesis, Michael Greenwald recommended adding DCAS to modern hardware, showing it could be used to create easy to apply yet efficient software transactional memory (STM). Greenwald points out that an advantage of DCAS vs CAS is that higher order (multiple item) CASn can be implemented in O(n) with DCAS, but requires O(n log p) time with unary CAS, where p is the number of contending processes. One of the advantages of DCAS is the ability to implement atomic deques (i. e. doubly linked lists) with relative ease. More recently, however, it has been shown that an STM can be implemented with comparable properties using only CAS. In general however, DCAS is not a silver bullet: implementing lock free and wait free algorithms using it is typically just as complex and error prone as for CAS. Motorola at one point included DCAS in the instruction set for its 68k series; however, the slowness of DCAS relative to other primitives (apparently due to cache handling issues) led to its avoidance in practical contexts. , DCAS is not natively supported by any widespread CPUs in production. The generalization of DCAS to more than two addresses is sometimes called MCAS (multi word CAS); MCAS can be implemented by a nestable LL/SC, but such a primitive is not directly available in hardware. In 2013, Trevor Brown, Faith Ellen, and Eric Ruppert have implemented in software a multi address LL/SC extension (which they call LLX/SCX) that while being more restrictive than MCAS enabled them, via some automated code generation, to implement one of the best performing concurrent binary search tree (actually a chromatic tree), slightly beating the JDK CAS based skip list implementation. In general, DCAS can be provided by a more expressive hardware transactional memory. IBM POWER8 and Intel Intel TSX provide working implementations of transactional memory. Sun's cancelled Rock processor would have supported it as well.