Объяснение условий гонки нетехнической аудитории [закрыто]

StackOverflow https://stackoverflow.com/questions/310282

  •  10-07-2019
  •  | 
  •  

Вопрос

Недавно мне пришлось описать некоторые опасения по поводу условий гонки в приложении, которое находится в разработке (не мной).Вероятно, это будет доведено до сведения заинтересованных сторон, которые не являются техническими специалистами и с которыми у меня нет прямой связи, поэтому мое объяснение должно быть в письменной форме.

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

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

В любом случае, мой вопрос к вам заключается в следующем: Как бы ты объяснить условия гонки нетехнической аудитории? Осмелитесь ли вы объяснить планирование процессора?Не могли бы вы вызвать обедающие философы?

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

Это было полезно?

Решение

Компания X имеет 1000 долларов в банке. X платит арендную плату в размере 2000 долларов США и получает оплату в размере 10 000 долларов США за услуги, оказанные компании Y. Однако из-за состояния гонки у Х дефицит 1000 долларов США, и в настоящее время она претендует на банкротство. = (

Возможно, вы захотите объяснить, как банк обрабатывает счет компании X таким образом: сотрудники банка A принимают текущую стоимость в 1000 долларов и добавляют к ней 10000 долларов. Сотрудники банка B принимают текущую стоимость 1000 долларов и вычитают из нее 2000 долларов. Сотрудники банка А обновляют стоимость до 11 000 долларов США. Сотрудники банка B обновляют значение до - 1000 долларов США.

Другие советы

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

На моем счету 500 долларов. Кто-то переводит мне 200 долларов одновременно с выводом 50 долларов.

Теперь, если банк неправильно обрабатывает условия гонки, он будет делать следующее (конечно, при условии, что транзакции обрабатываются вручную) Клерк А увидит запрос на добавление 200 долларов к моему балансу и заметит, что мой баланс в настоящее время составляет 500 долларов. Клерк B увидит запрос на вычитание 50 долларов из моего баланса и заметит, что мой баланс в настоящее время составляет 500 долларов (клерк A еще не перевел деньги).

Клерк А заканчивает оформление документов и устанавливает баланс моего счета в 700 долларов (500 + 200, которые он должен был добавить). И затем, через минуту (поскольку клерку B просто нужно было взять чашку кофе), клерк B заканчивает другую транзакцию и устанавливает мой баланс в 450 долларов (500, которые я получил, когда проверял, минус 50, которые он должен был вычесть ).

Мой баланс сейчас составляет 450 долларов, тогда как он должен был составить 650 долларов из-за состояния гонки. Результат зависел от порядка выполнения разных частей двух транзакций.

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

Я бы выбрал подход столовой философии, но в зависимости от моей аудитории я попытался бы сопоставить его с контекстом моей аудитории. Вы говорите с руководителями предприятий? Затем сопоставьте это с чем-то вроде выделения комнаты для переговоров или корпоративного автомобиля, бронирования номера в отеле или чего-то еще. Вы говорите со средними людьми? Тогда пример обедающего философа подойдет, или вы можете придумать похожую ситуацию, связанную с уходом за сельскохозяйственными животными, сидя на стульях или чем-то еще.

Используете ли вы пример обедающего философа или придумываете собственный, определенно используйте метафору.

Если вы пишете нетехнической аудитории, вам нужно упростить свои объяснения и связать их с тем, что они могут понять. Одно из объяснений взято из статьи «Аналогии для обучения параллельным вычислениям неопытным программистам» ( http: // portal. .acm.org / citation.cfm? doid = 1189136.1189172 ) объясняет это в терминах игры с ручкой:

  

Мы собираемся сыграть в игру под названием   Pen Game. Правила просты: я & # 8217; м   собираюсь держать ручку в моей руке, и   тогда я скажу: «Раз, два, три, иди». # 8221;   Когда я говорю & go; & # 8221; возьми ручку от моего   рука. Кто бы ни получил ручку, побеждает.   Готовы? Раз, два, три, иди.

Затем вы спрашиваете, можно ли заранее предсказать исход этой игры. Если это не может быть предсказано, можем ли мы гарантировать правильный результат? Это должно привести к осознанию того, что можно получить неверные результаты для одновременной записи в один и тот же фрагмент памяти.

Я собирался порекомендовать столовых философов, но я вижу, вы уже нашли это. Итак, как альтернатива, как насчет использования gridlock в качестве аналогии?

Представьте себе нормальное движение по четырем улицам рядом с единым городским кварталом (Северный проспект, Южный проспект, Восточная улица и Западная улица). Когда на дороге только одна или две машины, все идет гладко. Когда есть устойчивое движение, некоторые автомобили должны будут остановиться и ждать, пока другие машины не пройдут мимо, но это управляемая проблема. Одна машина останавливается в ожидании проезда другой машины, а затем продолжает свой веселый путь.

Теперь представьте себе движение в час пик в том же месте. Допустим, что один автомобиль, едущий на юг по западной улице, не может пройти весь путь через перекресток в северо-западном углу нашего городского квартала. Этот автомобиль теперь блокирует весь перекресток на западном проспекте. Это не займет много времени, прежде чем западный автомобиль попытается проехать через перекресток северо-восточного угла и застрянет, блокируя весь движущийся на север трафик на восточной улице. Когда эта ситуация проходит все четыре перекрестка, машины не могут двигаться! Каждый ждет, пока машины впереди него продвигаются, но нет возможности освободить тупик, не потянув машины назад.

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

Напишите программу:

  1. Ждите зарплату.
  2. Идти в магазин.
  3. Покупать еду.
  4. Включите тарелку.
  5. Положите еду на тарелку.
  6. Держать пластину 20 минут.
  7. Есть.
  8. Ложиться спать.

Теперь попробуйте, чтобы два потока (вы, жена) выполнили его без синхронизации.

  • Ты:Ждите зарплату.
  • Жена:Зайти в магазин без денег, разбиться

  • Ты:Включите тарелку.

  • Ты:Держать пластину 20 минут.
  • Ты:Ложиться спать.

  • Жена:Поешьте в чужом месте.

  • Жена:Ложиться спать.

Питер хочет съехать со своей дороги. Он проверяет, что ничто не мешает его машине, затем садится. Его сын Фрэнк прячется за машиной. Петр не видит его и переезжает.

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

Как насчет очевидного?

Расовое состояние - это буквально гонка между двумя людьми.

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

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

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

Картинка стоит 1000 слов. Это так. Если вы нарисуете временную шкалу и поместите на нее какую-то сущность и покажете, что с течением времени ее состояние меняется, вы можете довольно легко продемонстрировать состояние гонки на одной диаграмме. Может потребоваться несколько переделок, чтобы получить правильную картину, но я всегда обнаруживал, что ее прорисовка помогает понять мою точку зрения быстрее, чем ее описание.

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

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

Есть отличный пример в Структурированное параллельное программирование с приложениями операционных систем (насколько я помню)

В бедной стране Безеркистан две линии сливаются в один путь в туннеле.Произошли столкновения, и правящая хунта нуждается в решении.

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

Вот план.

  1. Поставьте на место соединения большую миску.

  2. Дайте каждому инженеру маленькую медную обезьянку.

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

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

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

Угадай, что?

Они все еще были столкновения!

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


Это состояние гонки.

В письменном документе вы можете объяснить, как состояние гонки приводит к аварии.

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

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

объясните, что компьютер делает что-то вроде: балансировки нагрузки; добавить 1; баланс магазина ;. рассмотрим две темы, которые изменяют баланс вашего банковского счета (вы и ваша жена одновременно вносите один доллар).

если оба потока прерываются после: load balance; и затем возобновить, вы можете потерять один доллар.

см. http://wasp.cs.washington.edu/atomeclipse/handouts .pdf

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

В качестве простого примера, давайте использовать перекресток с 4 путями (установлен в стране, где вы едете справа). Разделите пересечение на 4 квадранта: Северо-Запад, Северо-Восток, Юго-Восток и Юго-Запад. Теперь назовите каждый квадрант ресурсом, а каждую машину - потоком исполнения. Эти автомобили относятся только к системам дорожного движения, и, поскольку на этом перекрестке нет дорожных знаков и светофоров, машины проезжают прямо, не замедляя движение и не принимая во внимание движение.

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

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

Это займет немного больше времени, но дает некоторое представление о терминах и общей картине, прежде чем углубиться в более сложную метафору.

Разговор о деньгах с заинтересованными сторонами может привести их в панику, особенно если они предполагают, что из-за этого теряют реальные деньги, что не совсем идеально, если проблема конкретно не приводит к чистой потере прибыли, поэтому вот менее финансово ориентированный вариант. история о том, как можно объяснить кому угодно состояние гонки.

Эта история не затрагивает концепцию тупика, но более традиционный сценарий и последствия состояния гонки.

ИСТОРИЯ НАЧИНАЕТСЯ ЗДЕСЬ:

Настройка: Есть 3 города, соединенные железнодорожной сетью.На поездах нет никаких знаков, указывающих, из какого города они едут и в какой город они едут, потому что они используются между всеми тремя городами, и железнодорожная сеть не хотела иметь дело с хлопотами по смене знаков все время. время.Поскольку сеть небольшая, конкретного расписания прибытия и отправления поездов нет.Когда поезд отправляется, смотрители станции просто получают звонок от других смотрителей городских станций, смотритель записывает время, когда он ушел, и, поскольку все поезда имеют одну и ту же модель, они движутся с одинаковой скоростью, поэтому, когда смотритель получает звонок из других городов, они объявляют людям на станции, что:«Следующий поезд отправится в город C».Итак, люди, желающие поехать в город C, ждут поезда, садятся в него и весело едут в город C.

Проблема: Но однажды, когда поезд планировал свой маршрут из А в Б в С, он сломался на полпути между А и Б.К счастью, технические специалисты очень опытны и смогут отремонтировать поезд за короткое время.Однако в тот же день другой поезд также планировал другой маршрут от C до B и до A.Надзиратель на станции B получил звонок от A о том, что приближается поезд, а вскоре после этого получил еще один звонок от C о том, что прибывает еще один поезд.Тогда начальник станции объявил ожидающим на станции пассажирам:«Первый поезд, прибытие будет направлен на станцию ​​C, и вскоре после поездки после этого отправятся на станцию ​​A.» Когда пассажиры собрали свой багаж и пошли на свои платформы.Надзиратель увидел приближающийся поезд и перенаправил рельсы на платформу, откуда люди планировали отправиться в город С.Они даже не знали, что вместо этого поезд направлялся в город А.Другой поезд, устранив механические неполадки, также прибыл на станцию, и смотритель с радостью направил его к платформе, где находились пассажиры, желающие отправиться в город А.Надо ли говорить, что никто из пассажиров не прибыл туда, куда планировал, а все потому, что надзиратель предполагал, что они прибудут в обычном порядке.

Проблема с условиями гонки и многими другими конструкциями информатики заключается в том, что люди не являются компьютерами.Каждый раз, когда я объясняю своим ученикам алгоритм, они говорят: «Но делать это таким образом не имеет смысла», на что я отвечаю: «У компьютеров нет здравого смысла, у них есть только инструкции».Помимо этого, вы должны объяснять состояние гонки как гонку, и имеет смысл позволить людям действительно попробовать участие в гонке, если они могут.Таким образом, они смогут увидеть, что происходит не так.Но...им не разрешено руководствоваться здравым смыслом.

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

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

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

Вы можете себе представить, что подобная ситуация происходит в стеке 1:

player 1 grabs a red block
player 1 places red block         - player 2 grabs an orange block
player 1 grabs an orange block    - player 2 places an orange block
player 1 places an orange block

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

Также вы можете показать им это видео: https://www.youtube.com/watch?v=TcGwNdbsAbc

Давайте использовать доску для выполнения тривиальной задачи бухгалтерского учета. У нас есть 100 долларов - напишите это на доске.

У Алисы есть десятки счетов-фактур, которые в сумме составляют 100 долларов, поэтому она собирается отметить эти 100 долларов, иди и сложи свой список, и вернись через 5 минут и напиши 200 долларов на доске.

Боб ходил по магазинам. Он возьмет это число с доски, уйдет и вычтет сумму в 50 долларов, а затем он напишет на доске 50 долларов.

Если Боб вернется первым, мы увидим 200 долларов после того, как Алиса напишет свой результат. Если Алиса вернется первой, мы увидим 50 долларов, тоже неправильно. То, что мы хотим увидеть, - это 150 долларов, и нам нужно добавить некоторые меры предосторожности, чтобы это произошло.

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

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

Отправьте их в Условие гонки в Википедии.

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

" Состояние гонки или опасность гонки - это недостаток в системе или процессе, из-за которого выходные данные и / или результат процесса неожиданно и критически зависят от последовательности или времени других событий. Термин возник из-за идеи, что два сигнала мчатся друг с другом, чтобы сначала повлиять на выход. & Quot;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top