Если я использую блокировки, может ли мой алгоритм оставаться без блокировки?

9

Распространенным определением без блокировки является то, что по крайней мере один процесс делает успехи. 1

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

Так соответствует ли оно определению без блокировки?


1 См., Например, М. Херлихи, В. Лучанко и М. Моир. Синхронизация без препятствий: двусторонние очереди в качестве примера. В Distributed Computing, 2003. «Он не блокируется, если он гарантирует только то, что какой-то поток всегда делает успехи».

Джо Пансионат
источник
3
Я всегда понимал «без блокировок», чтобы описать структуру данных и набор алгоритмов, которые не используют блокировки, просто небольшой определенный набор операций с атомарной памятью. Например, drdobbs.com/parallel/writing-lock-free-code-a-corrected-queue/…
Пол Джонсон

Ответы:

16

Это не определение для без блокировки.

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

Я подвергаю сомнению, действительно ли ваш простой пример обеспечивает это так или иначе. Вам нужны иерархии блокировок и т. Д., Чтобы действительно гарантировать прогресс, когда задействованы несколько блокировок.

Бен Фойгт
источник
1
Я использую определение от М. Херлихи. Методология реализации высококонкурентных объектов данных. Транзакции на языках программирования и системах, 1993. «Условие без блокировки гарантирует, что какой-то процесс всегда будет прогрессировать, несмотря на произвольные остановки сбоев или задержки других процессов»
Joe Pension
12
@Joe: это не определение, оно описывает смысл. Остерегайтесь ошибочной логики обратного.
Бен Фойгт
2
Могли бы также процитировать М. Херлихи, В. Лучанко и М. Моир. Синхронизация без препятствий: двусторонние очереди в качестве примера. В Distributed Computing, 2003. «Он не блокируется, если он гарантирует только то, что какой-то поток всегда делает успехи».
Joe Pension
1
также есть голодание, которое более специфично, чем без тупиков (каждый процесс работает независимо от того, что делают другие процессы), обратите внимание, что циклы CaS (основанные на атомарных примитивах) - нет
трещотка урод
5
@Joe: Если остальной мир называет это свойством тупиковым свободным , то я буду использовать этот термин. Нет, ваш простой пример не без тупиков. Чтобы гарантировать, что что-то не заблокировано, вам нужна не только синхронизация, но и гарантия того, что ни один поток не выполнит никаких операций блокировки, удерживая блокировку. «делать то, что он хочет» является чрезвычайно расплывчатым и не дает этой гарантии.
Бен Фойгт
11

Я изучал Искусство многопроцессорного программирования 1, и их тексту не хватает ясности, как и книге, на которую вы ссылаетесь. Вот некоторые цитаты из TAMPP:

Цитата 1 (определение без блокировки)

Метод не блокируется, если он гарантирует, что бесконечно часто вызов какого-либо метода завершается за конечное число шагов.

Цитата 2 (Определение неблокирования)

ожидающий вызов метода total никогда не требуется для ожидания завершения другого ожидающего вызова.

Цитата 3 (утверждают, что блокировка без блокирования)

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

Проблема заключается в том, что утверждение в цитате 3, очевидно, не следует из определения в цитате 1. Как уже упоминалось, синхронизированная очередь, кажется, удовлетворяет цитате 1: бесконечно часто какой-либо метод успешно получает блокировку и завершается.

Обратите особое внимание на довольно расплывчатую фразу в цитате 3: «независимо от того, как система планирует потоки». Этому не предшествует какое-либо формальное описание «системы планирования потоков», поэтому нам остается реконструировать ее свойства на основе наших предварительных представлений о том, что определения должны означать:

  1. система всегда выполняет инструкции некоторого потока;
  2. она никогда не может выполнять инструкции любой данной нити;
  3. все потоки вызывают рассматриваемый метод.

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

Исправлено определение без блокировки

Метод не блокируется, если он неблокирующий, и, кроме того, гарантирует, что бесконечно часто вызов некоторого метода завершается за конечное число шагов.

1 Морис Херлихи, Нир Шавит, Искусство многопроцессорного программирования, Elsevier 2008, стр. 58-60

Марко Топольник
источник
1
Формулировка цитаты 1 действительно странная. Что они подразумевают под «бесконечно часто»? Очевидно, что-то отличное от «всегда», так что это нормально, что метод никогда не возвращает в «некоторых» случаях?
Халк
Да, неточный язык изобилует. Что вообще "часто"? Я думаю, что они имеют в виду «в бесконечной истории выполнения это конкретное событие происходит бесконечно много раз».
Марко Топольник
5

Терминология не всегда последовательна, но я думаю, что важно задать следующие вопросы о предлагаемом алгоритме или системе:

  1. Существует ли какая-либо последовательность событий, когда потоки могут застрять в ожидании друг друга, даже если всем потокам было разрешено все время процессора, которое они могли бы использовать [если это так, это не освобождает тупик]
  2. Если один поток был заблокирован в течение произвольно долгого времени, это может привести к остановке других потоков или нарушить работу системы на произвольно долгое время [если это так, то это не неблокирует].
  3. Существует ли, по крайней мере, теоретически возможная комбинация планирования потоков, которая могла бы заставить все потоки многократно повторять одни и те же операции, в то же время аннулируя работу друг друга, без какого-либо прогресса [если так, это не без блокировки]
  4. Если некоторым потокам дается достаточно времени ЦП относительно другого, могут ли они заставить последний поток продолжать повторять свои операции бесконечно [если так, то он не без ожидания].

Большая часть значимости алгоритмов без блокировок заключается не в том, что они быстрее, чем алгоритмы без блокировок, а в том, что они не склонны к смерти, если поток становится отложенным [обратите внимание, что такая гарантия просто требует что алгоритмы не блокируют, но все алгоритмы без блокировки являются]. Для алгоритма без блокировки возможно использование блокировок, но только если попытки получения блокировки включают в себя тайм-ауты вместе с алгоритмами, чтобы гарантировать, что кто-то всегда сможет прогрессировать (например, алгоритм может использовать CompareExchangeцикл в качестве своего основного метод арбитража, но используйте блокировки для арбитража доступа, когда конфликт кажется высоким: если кажется, что блокировка удерживается слишком долго, другие потоки могут решить отказаться от попыток использовать эту блокировку и вместо этого создать новую.CompareExchangeотказ клиентов от блокировки не поставит под угрозу целостность системы, хотя это может означать, что код, который удерживал старую блокировку, не будет выполнять какую-либо работу до тех пор, пока он слишком не откажется от старой блокировки и не встанет в очередь для новой.

Supercat
источник
Это отличается от стандартной терминологии: ваш 2. относится к стандартному значению неблокирования, тогда как 3. относится к свободе блокировки.
Марко Топольник
Я видел противоречивые терминологии и не знаю «официального» стандарта. Наиболее важно то, что существуют разные гарантии, которые может предложить алгоритм, и важно использовать алгоритм, который предлагает гарантии, достаточные для удовлетворения требований приложения. Многие документы охватывают только некоторые из вышеперечисленных гарантий, но есть случаи, когда каждый из них может быть в состоянии удовлетворить требования заявки легче, чем любые другие гарантии, которые будут соответствовать требованиям.
суперкат
Я думаю, что есть консенсус, что терминология, представленная в «Искусстве многопроцессорного программирования», является «стандартной».
Марко Топольник
@MarkoTopolnik: Я отредактирую сообщение, чтобы соответствовать этому тогда. Вам нравится новая версия?
суперкат
Круто, очень мило.
Марко Топольник
4

Вы должны посмотреть на «определение», которое вы цитируете в контексте :

Традиционный способ реализации общих структур данных состоит в использовании взаимного исключения (блокировки), чтобы гарантировать, что параллельные операции не мешают друг другу. Блокировка имеет ряд недостатков в отношении разработки программного обеспечения, отказоустойчивости и масштабируемости (см. [8]). В ответ исследователи исследовали множество альтернативных методов синхронизации, которые не используют взаимное исключение . Техника синхронизации не требует ожидания, если она гарантирует, что каждый поток будет продолжать прогрессировать перед лицом произвольной задержки (или даже отказа) других потоков. Он не блокируется, если гарантирует, что какой-то поток всегда будет прогрессировать.

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

Vartec
источник
2

Если я использую блокировки, может ли мой алгоритм оставаться без блокировки?

Может быть, но это зависит от алгоритма.

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

Так соответствует ли оно определению без блокировки?

Примечание само по себе .

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

Однако, если эти предварительные условия не выполняются, существует, по крайней мере, вероятность тупиков ...

Стивен С
источник
После некоторого изучения текста в «Искусстве многопроцессорного программирования» я пришел к выводу, что мьютексы определенно лишают законной силы определение без блокировок, когда определение правильно прописано. Я добавил ответ на эту страницу, чтобы прояснить это.
Марко Топольник
1

Приведенный вами пример не блокируется по следующей причине.

Поддержка одного потока получает блокировку, и планировщик ОС приостанавливает поток на бесконечный одиночный период, тогда весь поток не может выполнить процесс, поскольку никто не может получить блокировку, полученную приостановленным потоком.

Вообще говоря, алгоритмы, использующие блокировки, не свободны от блокировки.

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

Chaoran
источник
Посмотрите на более тщательное определение в Википедии: «Алгоритм не блокируется, если он удовлетворяет тому, что, когда потоки программы выполняются достаточно долго, по крайней мере один из потоков продвигается». Это исключает случай остановки потоков. Также прогресс при остановке покрывается свободой препятствий , а не свободой блокировки .
Марко Топольник
@MarkoTopolnik Ваш комментарий не имеет смысла вообще. Лок-свобода охватывает препятствие-свободу. Все, что не имеет блокировки, должно быть без препятствий. И определение, которое вы дали, не исключает остановки потоков.
Чаоран
Пожалуйста, позаботьтесь о том, чтобы отличить «иметь смысл» от «быть правильным». Мой комментарий неверен, как видно из моего последующего ответа. Но определение Википедии также неверно или, по крайней мере, неоднозначно.
Марко Топольник
@MarkoTopolnik Поскольку вы признаете, что ваш комментарий неправильный, вы должны удалить его, чтобы не запутать других читателей. Википедия часто неверна или неоднозначна. Вы должны найти тонкие определения, такие как «свобода блокировки», в научных статьях, таких как cs.rochester.edu/~scott/papers/2006_PPoPP_synch_queues.pdf (определение без блокировки приведено в разделе 2.1)
Чаоран
Да, включение неблокирующего свойства в состав определения блокировки-блокировки является одним из способов сделать это. Это было указано в более раннем пересмотре моего ответа.
Марко Топольник