|
|
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
Читал про deadlock livelock starvation. Про первые два всё вроде понял, а про starvation как-то не до конца. Я так понял, что так как synchronized секцию захватывает тот, кому больше повезло, то возможно ситуация, что потокам неудачникам придётся вечно ждать своей очереди. Но так чтобы описывалось какое-то решение этой проблемы я как-то не нашёл. Сам полагаю, что ReentrantLock с fair=true поможет. Может эта проблема ещё как-то по другому решается ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2014, 14:59 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
Вроде первые ссылки из гугла подробно разжевывают. http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html Всё зависит от причин starvation. В случае блокировок fairness это решение. В случае борьбы на CPU это, например, yield(). Ну, и, по-моему, операционная система и JVM тоже стараются следить за тем чтобы минимизировать starvation даже без явного fairness. Так как fair lock требует больше ресурсов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2014, 15:04 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, я просто туториалы этого кудесника не читаю после того как очень долго пытался понять, что он про семафоры пишет. http://tutorials.jenkov.com/java-concurrency/semaphores.html#assignal ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2014, 15:25 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
questionerя просто туториалы этого кудесника не читаю после того как очень долго пытался понять, что он про семафоры пишет. http://tutorials.jenkov.com/java-concurrency/semaphores.html#assignal И что не так с семафором? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2014, 15:29 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Код: 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. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. вроде по его канонам код написан, а выводит авторsend send send send send send send send send send receive я так понял, что должно быть send -receive send -receive send -receive ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2014, 15:34 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
questioner , Очень важно понимать, что starvation это не особенность какого-то инструмента (напр. synchronized, или ReentrantLock). Starvation - это логическая проблема, которая заключается в том, что поток не может получить доступ к какому-либо ресурсу. Причин этому может быть масса. Два примера, как можно эмулировать starvation в "домашних условиях": 1) Берете ReentrantReadWriteLock. Стартуете 10 потоков, которые в бесконечном цикле берут readLock через ReadWriteLock.readLock().tryLock(), потом спят 50 миллисекунд, потом отпускают ее. И так бесконечно. И потом стартуете один поток, которые пробует взять writeLock через ReadWriteLock.writeLock().lock(). Вы увидите, что write lock никогда не будет захвачен. Это starvation. Теперь меняете одну единственную строчку: readLock().tryLock() на readLock().tryLock(0, TimeUnit.MILLISECONDS) - все, starvation больше нет. Природа этого starvation - высокая агрессивность tryLock(), который игнорирует даже fair flag. 2) Создаете однопоточный ThreadPoolExecutor. Создайте CountDownLatch(1). Сабмитим в экзекьютор джобу, которая 1) сабмитит в этот же пул вторую джобу, 2) Ждет latch.await(). А вторая джоба, в свою очередь, вызвает latch.countDown(). Все, вторая джоба у вас попала в starvation, из которого никогда не выйдет. Природа - нет места в экзекьюторе. И таких примеров можно придумать массу. Как видите, природа того или иного starvation может быть совершенно разной, и бороться с ними надо по-разному. Универсального рецепта нет. Что касается Thread.yield() - сможете ли вы им решить описанные выше проблемы? Разумеется, нет. Я уже писал выше - этот метод на практике почти не используется. Во-первых, почитайте его JavaDoc - конкретные JVMки могут вообще его игнорировать. Во-вторых, современные планировщики нормально раздают кванты времени потокам. Никто не останется ущимленным. Особенно учитывая тот факт, что в Java запрещено менять приоритеты потоков. Что бы убедиться в этом, запустите следующую программу: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Вы увидите, что все потоки переключаются нормально, никто не впадает в starvation. А потом добавьте внутрь цикла while Thread.yield(). Что-нибудь изменилось? Неа. Поэтому в 99% Thread.yield() никак вам не поможет, ибо планировщики не позволят какому-либо потоку монопольно зянать ядро на длительное время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2014, 16:58 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
Да, и по поводу fairness. Здесь необходимо четко понимать, каковы последствия использования или не использования этого флажка. Во-первых, если Lock у вас занимается/освобождается не слишком часто, и нету чего-то вроде Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ... то у вас итак потоки будут выполняться в приблизительно том порядке, в котором они попросили lock. Это следует из имплементации ReentrantLock. Во-вторых, fair локи под нагрузкой становятся оооочень медленными. Non-fair режим - это главный козырь Lock по сравнению с synchronized. Именно он делает их более предпочтительными под нагрузкой. Если же вы ставите fair режим, то вы становитесь на два порядка медленнее non-fair, и на порядок медленнее synchronized. Стоит ли оно того - решать вам. Наконец, у нас проекте просто невероятное количество ReentrantLock и ReentrantReadWriteLock. Ни разу нам не пришлось использовать fair режимы. Ни разу. Так как у этого режима настолько узкая примемнимость, и настолько мало случаев, когда реально возникает непредумышленный starvation именно на захвате лока, что очень сложно попасть на такую ситуацию, когда fair режим реально что-то даст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2014, 17:06 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
DEVcoachЯ уже писал выше - этот метод на практике почти не используется. Вы принципиально не читаете что другие пишут? 15917980 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2014, 19:22 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, так что по поводу семафоров? я туплю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2014, 14:13 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, DEVcoachБерете ReentrantReadWriteLock. Стартуете 10 потоков, которые в бесконечном цикле берут readLock через ReadWriteLock.readLock().tryLock(), потом спят 50 миллисекунд, потом отпускают ее. И так бесконечно. И потом стартуете один поток, которые пробует взять writeLock через ReadWriteLock.writeLock().lock(). Вы увидите, что write lock никогда не будет захвачен. Это starvation. Теперь меняете одну единственную строчку: readLock().tryLock() на readLock().tryLock(0, TimeUnit.MILLISECONDS) - все, starvation больше нет. Природа этого starvation - высокая агрессивность tryLock(), который игнорирует даже fair flag. Но ведь на одной машине будет starvation, на другой нет я полагаю, ну то есть это не 100%. Как например в таком случае написать код так, чтобы starvation гарантированно не было ? это возможно? DEVcoach Non-fair режим - это главный козырь Lock по сравнению с synchronized. Именно он делает их более предпочтительными под нагрузкой. Если же вы ставите fair режим, то вы становитесь на два порядка медленнее non-fair, и на порядок медленнее synchronized. А можете поподробнее немного? я про производительность никогда и не думал. Blazkowicz, что значит Ваше молчание ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 11:30 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
questionerBlazkowicz, что значит Ваше молчание ? Мне лень разбираться с той статьёй чтобы ответить. Там, действительно, не понятно где он свой семафор использует, а где API. Но из приведенного кода и вашего примера, результат вполне логичный и ожидаемый, поэтому мне не понятно что вызывает затруднение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 11:44 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, да, согласен, что вывод кода вполне ожидаемый. Затруднение в том, что это первое, что я читал про семафоры. И это слегка вынесло мне мозг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 11:55 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
questionerКак например в таком случае написать код так, чтобы starvation гарантированно не было ? это возможно? как-то так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2014, 11:56 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Что-нибудь ответите по поводу http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1091315&msg=15945224 ? все сравнения, что я встречал не касались проиводительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2014, 11:50 |
|
||
|
Как бороться со starvation ?
|
|||
|---|---|---|---|
|
#18+
redwhite90 , Что бы понимать перфоманс ReentrantLock надо знать, как она устроена изнутри. Есть два отличных способа это узнать: 1) Почитать статью Дага Ли, который ее разрабатывал: http://gee.cs.oswego.edu/dl/papers/aqs.pdf 2) Почитать исходники AbstractQueuedSynchronizer. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2014, 16:03 |
|
||
|
|

start [/forum/search_topic.php?author=Igossman&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 679ms |
| total: | 823ms |

| 0 / 0 |
