|
|
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Уже касались этой темы, но я до сих пор так и не понял многих моментов. Вот что по этому поводу в 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.) Непонятно почему языки без автоматического управления памятью более узявимы. Судя по всему такая проблема есть и в джаве по причине того в книге даже упомянуты специальные классы, чтобы не словить эту проблему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 16:23 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerНепонятно почему языки без автоматического управления памятью более узявимы.- https://ru.wikipedia.org/wiki/Проблема_ABA - http://stackoverflow.com/a/19663933 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 20:46 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
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. Я не силён в С и мне не ясна эта фраза. одна ссылка в С может указывать на два объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 16:41 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
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 - лично для меня требует доказательств ))) Я привык доверять профессионализму своих коллег. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 16:58 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerмне не ясна эта фраза.Речь о подсчете ссылок .questionerодна ссылка в С может указывать на два объекта?Нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:00 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Все мои высказывая прошу считать относящимися только к ссылки из русской Wiki ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:04 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Проблема на самом деле в следующем. Алгоритмы на атомиках выглядят примерно так: авторwhile(true) --remember state --do some stuff --if(change state if state is same atomic){ ----break; --} } Так вот считается, что есть класс алгоритмов при которых мы хотим проверить то, что состояние не изменилось, а не то, что оно было таким же как в начале итерации. Пока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:21 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Usman, а Вы можете целиком мысль выразить ? непонятно, какой вывод нужно сделать прочитав ссылку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:23 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questioner, в вики пример со стеком: изначально в нём авторA B C делаем pop. Чтобы это сделать надо поменять ссылку на головы на next. Что делаем. Запоминаем текущую голову(A) запоминаем новую голову(B) Атомарное действие, что если старая голова всё ещё указывает на A, то мы делаем B головой. Теперь представляем ситуацию, что перед CAS стек менялся по следующей схеме авторA B C -> авторB C -> авторC -> авторA C А теперь наш CAS случается и получается полна хрень -> авторB C Причем тут автоматическое управление памятью? Ссылка на B держится, соответственно он не вычистится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:39 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questioner Пока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью Обьясняли, просто некто слушать не хочет. http://stackoverflow.com/questions/19660737/aba-in-lock-free-algorithms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:41 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerПока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью подозреваю, что НЕ при чем. Как я понимаю, автор описывает КОНКРЕТНОЕ решение для КОНКРЕТНОГО языка. При этом, делает некоторое "не очень корректное" ПРЕДПОЛОЖЕНИЕ которое помогает ему в реализации. Дальше, он начинает описывать/доказывать, что в данном случае, его решение корректно. А проблемы негров (пользователей других языков, где это не так) - его не волнуют. Возможно, по ходу описания, он высказал легкое сочувсвтвие неграм, считая, что без данной возможности "хитро вывернутся" они обречены на вечные муки (подозреваю, что негры об этом и не подозревают). Поэтому его алгоритм / код на конкретном языке программирования - будет работать корректно. Если же кто-то, у кого руки растут не из того места, использует его алгоритм не по назначению, то у него "и одна ссылка будет указывать на два объекта" и много другого веселого будет ))) Если я правильно понял контекст и общий смысл вырванного Вами из книги абзаца. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:48 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerUsman, а Вы можете целиком мысль выразить ? непонятно, какой вывод нужно сделать прочитав ссылку.Например, в Си - нет никакого GC, который занимался бы автоматическим управлением памятью - там все вручную: выделение и освобождение, доступ к памяти неконтроллируемый... но при желании вы всегда можете запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (: наводящая статья: https://ru.wikipedia.org/wiki/Управляемый_код (только замените .NET на JVM, а CLR на JRE) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 17:56 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
UsmanquestionerUsman, а Вы можете целиком мысль выразить ? непонятно, какой вывод нужно сделать прочитав ссылку.Например, в Си - нет никакого GC, который занимался бы автоматическим управлением памятью - там все вручную: выделение и освобождение, доступ к памяти неконтроллируемый... но при желании вы всегда можете запилить свою собственную реализацию алгоритма подсчета ссылок или реализовать часть концепции JMM (: наводящая статья: https://ru.wikipedia.org/wiki/Управляемый_код (только замените .NET на JVM, а CLR на JRE) Я привел пример, который будет некорректно работать в джаве. Можете привести пример, который будет работать в джаве, но не будет работать в Си ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 18:02 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevquestionerПока никто не смог доходчиво объяснить причем тут языки с автоматическим управлением памятью подозреваю, что НЕ при чем. Как я понимаю, автор описывает КОНКРЕТНОЕ решение для КОНКРЕТНОГО языка. При этом, делает некоторое "не очень корректное" ПРЕДПОЛОЖЕНИЕ которое помогает ему в реализации. Дальше, он начинает описывать/доказывать, что в данном случае, его решение корректно. А проблемы негров (пользователей других языков, где это не так) - его не волнуют. Возможно, по ходу описания, он высказал легкое сочувсвтвие неграм, считая, что без данной возможности "хитро вывернутся" они обречены на вечные муки (подозреваю, что негры об этом и не подозревают). Поэтому его алгоритм / код на конкретном языке программирования - будет работать корректно. Если же кто-то, у кого руки растут не из того места, использует его алгоритм не по назначению, то у него "и одна ссылка будет указывать на два объекта" и много другого веселого будет ))) Если я правильно понял контекст и общий смысл вырванного Вами из книги абзаца. IMHO Конкретно в приведенном мною алгоритме проблема инкапсулирована в самом алгоритме. Стек считается нетронутым если голова не менялась. Не вот упорно не могу понять причем тут язык программирования если просто условие кривое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 18:08 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerТак вот считается, что есть класс алгоритмов при которых мы хотим проверить то, что состояние не изменилось, а не то, что оно было таким же как в начале итерации. Код: java 1. 2. 3. Проблемы лично я не вижу ))) Вроде примерно так это решает и Hibernate (один из вариантов). questioner Если говорить об оптимизации, конкретных алгоритмах и конкретных решениях, то IMHO: 1. можно запомнить решения, которое написано в книжке и принять как "данной". Только вопрос зачем? Это пригодиться при решении других задач? 2. начать с более простых алгоритмов (например Circle Ring Buffer крайне прост и понятен) IMHO & AFAIK 3. с точки зрения "оптимальности" алгоритмы и код которые включены в Java, в ряде обсуждений в И-нет приходят к "не все так однозначно" ( C ) дочь офицера. AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 18:18 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
questionerНе вот упорно не могу понять причем тут язык программирования Leonid Kudryavtsevподозреваю, что НЕ при чем. IMHO questionerКонкретно в приведенном мною алгоритме проблема инкапсулирована в самом алгоритме. у кого "проблема" ? Подозреваю, у автора алгоритма проблемы нет и его код замечательно работает questionerСтек считается нетронутым если голова не менялась. ....если просто условие кривое? Это НЕ условие (условие это Техническое Задание: "реализовать стек") Это одно из возможных Решений. И оно НЕ кривое, т.к. подозреваю код работает и, наверное, более оптимально чем некоторые другие возможные решения. IMHO & AFAIK В алгоритм не вдумывался. Не интересно. На свете слишком много разных алгоритмов, а жизнь скоротечна. Я еще свою сортировку не дописал ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 18:29 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Как можно оценить решение не вникая в него? Логика там более чем простая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 19:49 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
1. легко ))) книжку явно написал "умный дядька", поэтому можно подозревать, что явных ошибок (настолько простых) у него нет это не говорит о том, что у него нет более хитрых ошибок ))) 2. Дай ссылку на исходный код. Есть очень большое ощущение (даже не вникая и не видя кода), что описанная тобой ситуация в конкретном коде просто не возможна. И я (даже не видя код), подозреваю почему не возможна ))) Например java.util.concurrent.ConcurrentLinkedQueue не хранит пользовательские данные непосредственно. Он их хранит в объекте Node. Если они были извлечен из коллекции, то снова там оказаться банально не могут. По определению. Т.к. вторая строка в коде метода помещения данных Код: sql 1. 2. 3. 4. Ну и я так понимаю, еще один "финт ушами", что вместо вызова 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 держится, соответственно он не вычистится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 20:48 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Фигню наверное написал. Статью из Wiki я вообще не понимаю, приводить не работающий код и на примере не работающего кода что-то объяснять - это за гранью добра и зла. Cкачал первоисточник "concurrency in practice", пошел читать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 01:20 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
IMHO Статья из Wiki /особенно руской/ это вынос мозга. За гранью добра и зла. И так многозадачность вынос мозга, еще и они стараются Складывается четкое убеждение, что кроме Doug Lea и еще одного человека, на этой планете вообще никто серьезно concurrent не занимается ))) Что в Java в коллекциях его код, что книжки под его авторством, что в C то же он. Подозреваю, он ABA проблему придумал, он же и варианты решения предложил. В общем-то, с ABA все понятно (кроме того, зачем это все так громко называть и тем более, зачем изучать ошибочный код): 1) Обращаться по указателю, если мы не гарантируем, что он эксклюзивно наш, выглядит как минимум грязно (его мог кто-то удалить) В Java и .NET это относительно безопасно. 2) Память реюзится. Т.ч. последовательность delete и new следующие друг за другом, могут привести к тому, что разные объекты могут занять одну и ту же область памяти. Что может привести к описанным сценарию. Если кодировать с ошибками. В Java этого нет Но зачем нужно кодировать с ошибками, тема не раскрыта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 04:21 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Судя по всему такая проблема есть и в джаве по причине того в книге даже упомянуты специальные классы, чтобы не словить эту проблему 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. Полный редиска ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 05:40 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Сам не проверял. Сейчас выпью чаю и тест для ConcurrentLinkedQueue запущу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 05:49 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
В обычных коллекциях, например java.util.LinkedList Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. После удаления, элемент специально зачищается, что бы нельзя было мусором убить Minor Garbage Collector. В коллекциях lock free от Dog Lea этого нет. Как страшно жить. Зачем questioner Вы это сделали ((( Ну знал я, что по слухам в ConcurrentLinkedQueue есть проблемы из за которых от нее AKKA отказывается. Но деталей то я не знал. Что мне теперь с этими знаниями делать? Ты думаешь у меня печалей в жизни мало? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 06:14 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
Запустил тест. Да, мусор из 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 работает в режиме "прямотока" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 07:42 |
|
||
|
ABA problem
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 11:39 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39421131&tid=2123048]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 315ms |

| 0 / 0 |
