Jump to content

Стек драйверов

Алгоритм стека Трейбера без блокировок, представляет собой масштабируемый стек использующий мелкозернистый примитив параллельного выполнения сравнения и обмена . [1] Считается, что Р. Кент Трайбер был первым, кто опубликовал его в своей статье 1986 года «Системное программирование: борьба с параллелизмом». [2]

Основной принцип

[ редактировать ]

Основной принцип алгоритма заключается в том, чтобы добавлять что-то новое в стек только в том случае, если вы знаете, что элемент, который вы пытаетесь добавить, является единственным, что было добавлено с момента начала операции. Это делается с помощью сравнения и замены. Помещение элемента в стек осуществляется путем взятия верхней части стека (старой головы) и помещения ее после нового элемента, чтобы создать новую голову. Затем вы сравниваете старую голову с нынешней. Если они совпадают, вы можете поменять старую головку на новую, если нет, то это означает, что другой поток добавил элемент в стек, и в этом случае вам придется повторить попытку.

При извлечении элемента из стека перед возвратом элемента вы должны убедиться, что другой поток не добавил новый элемент с момента начала операции.

Корректность

[ редактировать ]

В некоторых языках, особенно в тех, в которых нет сборки мусора, стек Трейбера может подвергаться риску возникновения проблемы ABA . Когда процесс собирается удалить элемент из стек (непосредственно перед сравнением и установкой в ​​процедуре извлечения ниже) другой процесс может изменить стек так, что голова останется той же, но второй элемент будет другой. Сравнение и замена установят начало стека на старый второй элемент стека, что приведет к смешиванию всей структуры данных. Однако версия Java на этой странице не подвержена этой проблеме из-за более строгих гарантий, предлагаемых средой выполнения Java (невозможно, чтобы вновь созданная ссылка на объект без псевдонимов была равна ссылке на любой другой достижимый объект).

Тестирование на такие сбои, как ABA, может быть чрезвычайно трудным, поскольку проблемная последовательность событий встречается очень редко. Проверка модели — отличный способ выявить такие проблемы. См., например, упражнение 7.3.3 в разделе «Моделирование и анализ взаимодействующих систем». [3]

Пример Java

[ редактировать ]

Ниже приведена реализация стека Treiber на Java, основанная на реализации Java Concurrency in Practice. [4]

import java.util.concurrent.atomic.*;

import net.jcip.annotations.*;

/**
 * ConcurrentStack
 *
 * Nonblocking stack using Treiber's algorithm
 *
 * @author Brian Goetz and Tim Peierls
 */
@ThreadSafe
public class ConcurrentStack <E> {
    AtomicReference<Node<E>> top = new AtomicReference<Node<E>>();

    public void push(E item) {
        Node<E> newHead = new Node<E>(item);
        Node<E> oldHead;

        do {
            oldHead = top.get();
            newHead.next = oldHead;
        } while (!top.compareAndSet(oldHead, newHead));
    }

    public E pop() {
        Node<E> oldHead;
        Node<E> newHead;

        do {
            oldHead = top.get();
            if (oldHead == null)
                return null;
            newHead = oldHead.next;
        } while (!top.compareAndSet(oldHead, newHead));

        return oldHead.item;
    }

    private static class Node <E> {
        public final E item;
        public Node<E> next;

        public Node(E item) {
            this.item = item;
        }
    }
}
  1. ^ Хендлер Д., Шавит Н. и Йерушалми Л., июнь 2004 г. Масштабируемый алгоритм стека без блокировок. В материалах шестнадцатого ежегодного симпозиума ACM по параллелизму в алгоритмах и архитектурах (стр. 206–215). АКМ.
  2. ^ Трейбер, Р.К., 1986. Системное программирование: борьба с параллелизмом. International Business Machines Incorporated, Исследовательский центр Томаса Дж. Уотсона.
  3. ^ Дж. Ф. Гроот и г-н Мусави. Моделирование и анализ взаимодействующих систем. Массачусетский технологический институт Пресс 2014.
  4. ^ Jcip.net. (2016). [онлайн] Доступно по адресу: http://jcip.net/listings/ConcurrentStack.java [Проверено 13 мая 2016 г.].
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 4ead18c7909a11e8e052df7d1166a209__1718334780
URL1:https://arc.ask3.ru/arc/aa/4e/09/4ead18c7909a11e8e052df7d1166a209.html
Заголовок, (Title) документа по адресу, URL1:
Treiber stack - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)