Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ABA problem / 25 сообщений из 38, страница 1 из 2
15.03.2017, 16:23
    #39420138
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Уже касались этой темы, но я до сих пор так и не понял многих моментов.

Вот что по этому поводу в concurrency in practice пишут:

автор 15.4.4. The ABA Problem
The ABA problem is an anomaly that can arise from the naive use of compareͲandͲswap in algorithms where nodes can
be recycled (primarily in environments without garbage collection). A CAS effectively asks "Is the value of V still A?", and
proceeds with the update if so. In most situations, including the examples presented in this chapter, this is entirely
sufficient. However, sometimes we really want to ask "Has the value of V changed since I last observed it to be A?" For
some algorithms, changing V from A to B and then back to A still counts as a change that requires us to retry some
algorithmic step.
This ABA problem can arise in algorithms that do their own memory management for link node objects. In this case, that
the head of a list still refers to a previously observed node is not enough to imply that the contents of the list have not
changed. If you cannot avoid the ABA problem by letting the garbage collector manage link nodes for you, there is still a
relatively simple solution: instead of updating the value of a reference, update a pair of values, a reference and a
version number. Even if the value changes from A to B and back to A, the version numbers will be different.
AtomicStampedReference (and its cousin AtomicMarkableReference) provide atomic conditional update on a pair of
variables. AtomicStampedReference updates an object referenceͲinteger pair, allowing "versioned" references that are
immune[8] to the ABA problem. Similarly, AtomicMarkableReference updates an object referenceͲboolean pair that is
used by some algorithms to let a node remain in a list while being marked as deleted.[9]
-------------
[8] In practice, anyway; theoretically the counter could wrap.
[9] Many processors provide a doubleͲwide CAS (CAS2 or CASX) operation that can operate on a pointerͲinteger pair, which would make this
operation reasonably efficient. As of Java 6, Atomic-StampedReference does not use doubleͲwide CAS even on platforms that support it.
(DoubleͲwide CAS differs from DCAS, which operates on two unrelated memory locations; as of this writing, no current processor implements
DCAS.)

Непонятно почему языки без автоматического управления памятью более узявимы.
Судя по всему такая проблема есть и в джаве по причине того в книге даже упомянуты специальные классы, чтобы не словить эту проблему
...
Рейтинг: 0 / 0
15.03.2017, 20:46
    #39420312
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
questionerНепонятно почему языки без автоматического управления памятью более узявимы.- https://ru.wikipedia.org/wiki/Проблема_ABA
- http://stackoverflow.com/a/19663933
...
Рейтинг: 0 / 0
16.03.2017, 16:41
    #39420940
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
UsmanquestionerНепонятно почему языки без автоматического управления памятью более узявимы.- https://ru.wikipedia.org/wiki/Проблема_ABA
- http://stackoverflow.com/a/19663933

авторWhen automatic garbage collection is enabled ,no two objects can be allocated with the same reference and co-exist at the same time,that's because as long as there is a reference count greater then 0 the reference itself will not be released and re-used.

Я не силён в С и мне не ясна эта фраза.

одна ссылка в С может указывать на два объекта?
...
Рейтинг: 0 / 0
16.03.2017, 16:58
    #39420963
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Usman https://ru.wikipedia.org/wiki/Проблема_ABA
После слов

"прочитано одинаковое значение, и признак «значение одинаковое» трактуется как «ничего не менялось». Однако, другой поток может выполниться между этими двумя чтениями, поменять значение, сделать что-нибудь ещё и восстановить старое значение"

читать перестал. Т.к. это называется ОШИБКА ПРОГРАММИСТА. И почему это называется "проблемой", лично мне не понятно.

Например тот же Hibernate, если хочется удостоверится, что "ничего не менялось" банально использует поле version. Прикладные системы (напрмер OeBS) могут использовать поля с автором и временем модификации. Стандартная задача, которая на планете решается по 100500 раз в день и ни для кого проблемой не является.

Называть грубую ошибку программиста "проблемой" и пинать на языки программирования... ну, б....ь, это IMHO уровень девочки-блондинки месяц назад окончивший институт.

questioner
авторWhen automatic garbage collection is enabled ,no two objects can be allocated with the same reference and co-exist at the same time,that's because as long as there is a reference count greater then 0 the reference itself will not be released and re-used.

Я не силён в С и мне не ясна эта фраза.

одна ссылка в С может указывать на два объекта?

So do I. В данном случае соглашусь с questioner

questionerодна ссылка в С может указывать на два объекта?

Если я правильно понял "проблему с" ABA, то разумеется. В случае, когда руки растут из ж.... Нет ничего не возможного.

Выделили один объект. Освободили память. Выделили второй. Объектов два и возможно разных, а ссылка на них одинаковая.

Но вот то, что того же самого при должен уровне "профессионализма" нельзя добиться в Java - лично для меня требует доказательств ))) Я привык доверять профессионализму своих коллег.
...
Рейтинг: 0 / 0
16.03.2017, 17:00
    #39420968
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
questionerмне не ясна эта фраза.Речь о подсчете ссылок .questionerодна ссылка в С может указывать на два объекта?Нет.
...
Рейтинг: 0 / 0
16.03.2017, 17:04
    #39420972
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Все мои высказывая прошу считать относящимися только к ссылки из русской Wiki )))
...
Рейтинг: 0 / 0
16.03.2017, 17:21
    #39420985
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Leonid Kudryavtsev,

Проблема на самом деле в следующем. Алгоритмы на атомиках выглядят примерно так:


авторwhile(true)
--remember state
--do some stuff
--if(change state if state is same atomic){
----break;
--}
}

Так вот считается, что есть класс алгоритмов при которых мы хотим проверить то, что состояние не изменилось, а не то, что оно было таким же как в начале итерации.


Пока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью
...
Рейтинг: 0 / 0
16.03.2017, 17:23
    #39420987
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Usman,

а Вы можете целиком мысль выразить ?

непонятно, какой вывод нужно сделать прочитав ссылку.
...
Рейтинг: 0 / 0
16.03.2017, 17:39
    #39421000
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
questioner,

в вики пример со стеком:
изначально в нём
авторA
B
C

делаем pop.

Чтобы это сделать надо поменять ссылку на головы на next.
Что делаем.

Запоминаем текущую голову(A)
запоминаем новую голову(B)

Атомарное действие, что если старая голова всё ещё указывает на A, то мы делаем B головой.



Теперь представляем ситуацию, что перед CAS стек менялся по следующей схеме

авторA
B
C
->
авторB
C
->
авторC
->
авторA
C

А теперь наш CAS случается и получается полна хрень
->
авторB
C


Причем тут автоматическое управление памятью?

Ссылка на B держится, соответственно он не вычистится.
...
Рейтинг: 0 / 0
16.03.2017, 17:41
    #39421003
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
questioner

Пока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью

Обьясняли, просто некто слушать не хочет.

http://stackoverflow.com/questions/19660737/aba-in-lock-free-algorithms
...
Рейтинг: 0 / 0
16.03.2017, 17:48
    #39421010
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
questionerПока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью
подозреваю, что НЕ при чем.

Как я понимаю, автор описывает КОНКРЕТНОЕ решение для КОНКРЕТНОГО языка. При этом, делает некоторое "не очень корректное" ПРЕДПОЛОЖЕНИЕ которое помогает ему в реализации.

Дальше, он начинает описывать/доказывать, что в данном случае, его решение корректно. А проблемы негров (пользователей других языков, где это не так) - его не волнуют. Возможно, по ходу описания, он высказал легкое сочувсвтвие неграм, считая, что без данной возможности "хитро вывернутся" они обречены на вечные муки (подозреваю, что негры об этом и не подозревают).

Поэтому его алгоритм / код на конкретном языке программирования - будет работать корректно.

Если же кто-то, у кого руки растут не из того места, использует его алгоритм не по назначению, то у него "и одна ссылка будет указывать на два объекта" и много другого веселого будет )))

Если я правильно понял контекст и общий смысл вырванного Вами из книги абзаца.

IMHO
...
Рейтинг: 0 / 0
16.03.2017, 17:56
    #39421014
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
questionerUsman,

а Вы можете целиком мысль выразить ?

непонятно, какой вывод нужно сделать прочитав ссылку.Например, в Си - нет никакого GC, который занимался бы автоматическим управлением памятью - там все вручную:
выделение и освобождение, доступ к памяти неконтроллируемый... но при желании вы всегда можете
запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (:

наводящая статья: https://ru.wikipedia.org/wiki/Управляемый_код (только замените .NET на JVM, а CLR на JRE)
...
Рейтинг: 0 / 0
16.03.2017, 18:02
    #39421017
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
UsmanquestionerUsman,

а Вы можете целиком мысль выразить ?

непонятно, какой вывод нужно сделать прочитав ссылку.Например, в Си - нет никакого GC, который занимался бы автоматическим управлением памятью - там все вручную:
выделение и освобождение, доступ к памяти неконтроллируемый... но при желании вы всегда можете
запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (:

наводящая статья: https://ru.wikipedia.org/wiki/Управляемый_код (только замените .NET на JVM, а CLR на JRE)

Я привел пример, который будет некорректно работать в джаве.

Можете привести пример, который будет работать в джаве, но не будет работать в Си ?
...
Рейтинг: 0 / 0
16.03.2017, 18:08
    #39421022
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Leonid KudryavtsevquestionerПока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью
подозреваю, что НЕ при чем.

Как я понимаю, автор описывает КОНКРЕТНОЕ решение для КОНКРЕТНОГО языка. При этом, делает некоторое "не очень корректное" ПРЕДПОЛОЖЕНИЕ которое помогает ему в реализации.

Дальше, он начинает описывать/доказывать, что в данном случае, его решение корректно. А проблемы негров (пользователей других языков, где это не так) - его не волнуют. Возможно, по ходу описания, он высказал легкое сочувсвтвие неграм, считая, что без данной возможности "хитро вывернутся" они обречены на вечные муки (подозреваю, что негры об этом и не подозревают).

Поэтому его алгоритм / код на конкретном языке программирования - будет работать корректно.

Если же кто-то, у кого руки растут не из того места, использует его алгоритм не по назначению, то у него "и одна ссылка будет указывать на два объекта" и много другого веселого будет )))

Если я правильно понял контекст и общий смысл вырванного Вами из книги абзаца.

IMHO

Конкретно в приведенном мною алгоритме проблема инкапсулирована в самом алгоритме. Стек считается нетронутым если голова не менялась. Не вот упорно не могу понять причем тут язык программирования если просто условие кривое?
...
Рейтинг: 0 / 0
16.03.2017, 18:18
    #39421025
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
questionerТак вот считается, что есть класс алгоритмов при которых мы хотим проверить то, что состояние не изменилось, а не то, что оно было таким же как в начале итерации.


Код: java
1.
2.
3.
synchronized (var) {
  var.version ++;
}



Проблемы лично я не вижу ))) Вроде примерно так это решает и Hibernate (один из вариантов).

questioner
Если говорить об оптимизации, конкретных алгоритмах и конкретных решениях, то IMHO:
1. можно запомнить решения, которое написано в книжке и принять как "данной". Только вопрос зачем? Это пригодиться при решении других задач?
2. начать с более простых алгоритмов (например Circle Ring Buffer крайне прост и понятен)

IMHO & AFAIK

3. с точки зрения "оптимальности" алгоритмы и код которые включены в Java, в ряде обсуждений в И-нет приходят к "не все так однозначно" ( C ) дочь офицера.

AFAIK
...
Рейтинг: 0 / 0
16.03.2017, 18:29
    #39421029
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
questionerНе вот упорно не могу понять причем тут язык программирования

Leonid Kudryavtsevподозреваю, что НЕ при чем.

IMHO
questionerКонкретно в приведенном мною алгоритме проблема инкапсулирована в самом алгоритме.

у кого "проблема" ?
Подозреваю, у автора алгоритма проблемы нет и его код замечательно работает

questionerСтек считается нетронутым если голова не менялась. ....если просто условие кривое?

Это НЕ условие (условие это Техническое Задание: "реализовать стек")
Это одно из возможных Решений.

И оно НЕ кривое, т.к. подозреваю код работает и, наверное, более оптимально чем некоторые другие возможные решения.

IMHO & AFAIK

В алгоритм не вдумывался. Не интересно. На свете слишком много разных алгоритмов, а жизнь скоротечна. Я еще свою сортировку не дописал (((
...
Рейтинг: 0 / 0
16.03.2017, 19:49
    #39421059
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Leonid Kudryavtsev,

Как можно оценить решение не вникая в него?

Логика там более чем простая
...
Рейтинг: 0 / 0
16.03.2017, 20:48
    #39421074
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
1. легко )))
книжку явно написал "умный дядька", поэтому можно подозревать, что явных ошибок (настолько простых) у него нет
это не говорит о том, что у него нет более хитрых ошибок )))
2.
Дай ссылку на исходный код. Есть очень большое ощущение (даже не вникая и не видя кода), что описанная тобой ситуация в конкретном коде просто не возможна. И я (даже не видя код), подозреваю почему не возможна )))

Например java.util.concurrent.ConcurrentLinkedQueue не хранит пользовательские данные непосредственно. Он их хранит в объекте Node. Если они были извлечен из коллекции, то снова там оказаться банально не могут. По определению. Т.к. вторая строка в коде метода помещения данных

Код: sql
1.
2.
3.
4.
public boolean  offer(E e) {
        if (e == null) throw new NullPointerException();
        Node<E> n = new Node<E>(e, null);
...



Ну и я так понимаю, еще один "финт ушами", что вместо вызова old_val.equel( new_value ) достаточно просто сравнить указатели.


questionerquestioner,

в вики пример со стеком:
изначально в нём
авторA
B
C


делаем pop.

Чтобы это сделать надо поменять ссылку на головы на next.
Что делаем.

Запоминаем текущую голову(A)
запоминаем новую голову(B)

Атомарное действие, что если старая голова всё ещё указывает на A, то мы делаем B головой.


Теперь представляем ситуацию, что перед CAS стек менялся по следующей схеме

авторA
B
C
->
авторB
C
->
авторC
->
авторA
C

А теперь наш CAS случается и получается полна хрень
->
авторB
C


Причем тут автоматическое управление памятью?

Ссылка на B держится, соответственно он не вычистится.
...
Рейтинг: 0 / 0
17.03.2017, 01:20
    #39421110
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Фигню наверное написал.

Статью из Wiki я вообще не понимаю, приводить не работающий код и на примере не работающего кода что-то объяснять - это за гранью добра и зла.

Cкачал первоисточник "concurrency in practice", пошел читать
...
Рейтинг: 0 / 0
17.03.2017, 04:21
    #39421121
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
IMHO Статья из Wiki /особенно руской/ это вынос мозга. За гранью добра и зла.

И так многозадачность вынос мозга, еще и они стараются

Складывается четкое убеждение, что кроме Doug Lea и еще одного человека, на этой планете вообще никто серьезно concurrent не занимается ))) Что в Java в коллекциях его код, что книжки под его авторством, что в C то же он. Подозреваю, он ABA проблему придумал, он же и варианты решения предложил.

В общем-то, с ABA все понятно (кроме того, зачем это все так громко называть и тем более, зачем изучать ошибочный код):

1)
Обращаться по указателю, если мы не гарантируем, что он эксклюзивно наш, выглядит как минимум грязно (его мог кто-то удалить)

В Java и .NET это относительно безопасно.

2)
Память реюзится.

Т.ч. последовательность delete и new следующие друг за другом, могут привести к тому, что разные объекты могут занять одну и ту же область памяти. Что может привести к описанным сценарию. Если кодировать с ошибками.

В Java этого нет

Но зачем нужно кодировать с ошибками, тема не раскрыта.
...
Рейтинг: 0 / 0
17.03.2017, 05:40
    #39421129
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Судя по всему такая проблема есть и в джаве по причине того в книге даже упомянуты специальные классы, чтобы не словить эту проблему


IMHO

Нет. В java данной проблемы имени Dog Lea нет. По определению. (т.к. Dog Lea похоже сам же ее и изобрел и сам же решил)

Но.... зато есть другая... О которой Dog Lea скромно говорить не стал. Его lock free алгоритм коллекции Concurrent Linked List, при некоторых патернах использования просто убивает Minor Garbage Collector как класс

В его алгоритме, мы не зачищаем Node.

Как я понимаю, мы этого корректно сделать и не можем, т.к. нагло обращаемся к их полям из других потоков не заботясь о синхронизации. (см. пред. сообщение, проблема N1 )

Т.е., мы можем с легкостью уйти от изобретенного им же ABA проблемы с помощь "letting the garbage collector manage link nodes for you" и бросая Node грязные. Но разумеется, в жизни когда все хорошо, это значит что где-то скрыта подлянка. Но об этой он не пишет. Ограничиваясь словами "If you cannot avoid ... letting..." ))) IMHO. Полный редиска
...
Рейтинг: 0 / 0
17.03.2017, 05:49
    #39421131
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Сам не проверял. Сейчас выпью чаю и тест для ConcurrentLinkedQueue запущу.
...
Рейтинг: 0 / 0
17.03.2017, 06:14
    #39421133
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
В обычных коллекциях, например java.util.LinkedList

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  private E  remove(Entry<E> e) {
        if (e == header)
            throw new NoSuchElementException();
        E result = e.element;
        e.previous.next = e.next;
        e.next.previous = e.previous;
        e.next = e.previous = null;
        e.element = null;
        size--;
        modCount++;
        return result;
    }



После удаления, элемент специально зачищается, что бы нельзя было мусором убить Minor Garbage Collector. В коллекциях lock free от Dog Lea этого нет.

Как страшно жить.

Зачем questioner Вы это сделали ((( Ну знал я, что по слухам в ConcurrentLinkedQueue есть проблемы из за которых от нее AKKA отказывается. Но деталей то я не знал. Что мне теперь с этими знаниями делать? Ты думаешь у меня печалей в жизни мало?
...
Рейтинг: 0 / 0
17.03.2017, 07:42
    #39421152
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Запустил тест. Да, мусор из Eden прорывается, т.е. проблема есть.

Но в JConsole я даже не сразу и заметил. На моем AMD, мусор в old перетекает крайне не быстро. Что, возможно объясняется тем, что класс Node очень маленький.

Но скачкообразно. Минут 5-10 график медленно полз, потом внезапно в Old сразу 2 метра мусора насыпалось. Ну и вообще график в JConsole какой-то странный, первый раз такое вижу.

Eden нормально "пилой", а old gen резкими прыжками, а servivour вообще не знаю как описать, прыжки но наоборот /от полного к пустому, в противофазе к old gen/.

Похоже, первый раз servivour накопил мусора на 2 Mb и выкинул в old gen, после чего вообще отключился ))) типа нафига мне работать, пускай все сразу в old gen уходит ))) что в принципе и правильно ))) нафиг servivour нужен )))

Занимательно одного. Первый раз вижу график в JConsole, когда servivour работает в режиме "прямотока"
...
Рейтинг: 0 / 0
17.03.2017, 11:39
    #39421340
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ABA problem
Leonid Kudryavtsev,

По поводу исходного кода - его нет у меня.я взял из википедии идею и попытался её объяснить.

Но кстати в книге есть пример:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
@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;
        }
    }
}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / ABA problem / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]