Объяснение условий гонки нетехнической аудитории [закрыто]
недавно я обнаружил, что мне нужно написать некоторые проблемы, которые у меня есть о расовых условиях в приложении, которое находится в разработке (не мной). Скорее всего, это будет доведено до сведения заинтересованных сторон, которые не являются техническими, и с которыми у меня нет прямой связи, поэтому мое объяснение должно быть в письменной форме.
Я уже сделал попытку этой записи. Я как можно лучше замалчиваю техническую специфику, даю пример того, как гонка условие возникнет в приложении и опишет его воздействие. Я чувствую, что справился неплохо, но это далеко не идеально.
в любом случае, мой вопрос к вам такой: как бы вы объясните условия гонки нетехнической аудитории? осмелитесь ли вы объяснить планирование CPU? Вы вызываете обедающих философов?
вам не нужно работать в рамках ограничений моей ситуации (но было бы очень полезно, если бы вы это сделали).
18 ответов
компания X имеет $ 1,000 в банке. X платит арендную плату в размере $ 2,000 и получил платеж в размере $10,000 за услуги, оказанные компании Y. однако из-за состояния гонки X испытывает дефицит в размере $1,000 и в настоящее время претендует на банкротство. =(
возможно, вы захотите объяснить, как банк обрабатывает счет компании X таким образом: сотрудники банка A берут текущую стоимость $1,000 и добавляют к ней $10,000. Сотрудники банка B берут текущую стоимость $ 1,000 и вычитают из нее $2,000. Сотрудники банка обновляет значение в $11,000. Сотрудники банка B обновляют стоимость до - $ 1,000.
Я думаю, что банковские транзакции могут быть хорошим примером, потому что легко увидеть, что неправильный результат плохо и потому, что условия гонки легко создать в такой среде.
у меня на счету 500 долларов. Кто-то переводит мне 200 долларов одновременно с тем, как я снимаю 50.
теперь, если банк не обрабатывает условия гонки должным образом, они будут делать следующее (предполагая, что транзакции обрабатываются вручную, конечно) Клерк будет см. запрос на добавление $ 200 к моему балансу и обратите внимание, что мой баланс в настоящее время составляет $500. Клерк Б увидит запрос на вычитание $ 50 из моего баланса и заметит, что мой баланс в настоящее время составляет $500 (клерк а еще не перевел деньги).
Клерк a заканчивает оформление документов и устанавливает баланс моего счета в $700 (500 + 200, которые он должен был добавить). И затем, через минуту (потому что клерк Б просто должен был взять чашку кофе), клерк Б заканчивает другую транзакцию и устанавливает мой баланс до 450 долларов (500, которые у меня были, когда он проверял, минус 50, которые он должен был вычесть).
мой баланс теперь $ 450, когда он должен был быть $ 650, из-за состояния гонки. Результат зависел от того, в каком порядке выполнялись различные части этих двух операций.
Это общее описание того, как условия гонки плохие. Теперь скажите, что вместо клерков у нас есть приложение, обрабатывающее две отдельные задачи одновременно (это ваши " потоки execution'), и, как и выше, они оба читают значение, изменяют значение, которое они читать, а затем записать его обратно. Одна из модификаций может быть потеряна, если это произойдет в указанном выше порядке. Это должно быть связано с конкретными проблемами в вашем приложении.
Я бы пошел на философский подход, но в зависимости от моей аудитории я бы попытался сравнить его с контекстом моей аудитории. Вы разговариваете с бизнесменами? Затем сравните это с чем-то вроде конференц-зала или корпоративного автомобиля или бронирования номера в отеле или что-то еще. Ты говоришь со средними людьми? Тогда пример обедающего философа хорош, или вы можете придумать аналогичную ситуацию, связанную с уходом за сельскохозяйственными животными или сидением на стульях или что угодно.
Если вы захватить пример философа столовой, или сделать свой собственный, определенно использовать метафору.
Если вы пишете для нетехнической аудитории, вы захотите упростить свои объяснения и связать их с чем-то, что они могут понять. Одно из объяснений, взятых из статьи аналогии для обучения параллельных вычислений неопытным программистам (http://portal.acm.org/citation.cfm?doid=1189136.1189172) объясняет это с точки зрения пера игры:
мы будем играть в игру под названием Перо Игры. Правила просты: я буду держать ручку в руке. рука и тогда я скажу: "раз, два, три, вперед." Когда я скажу "иди" , забери ручку у меня. рука. Тот, кто получит ручку, победит. Готовы? Раз, два, три, вперед.
затем вы спросите, можно ли заранее предсказать исход этой игры. Если это невозможно предсказать, можем ли мы гарантировать правильный результат? Это должно привести к пониманию того, что можно получить неправильные результаты для одновременной записи в один и тот же фрагмент памяти.
Я собирался порекомендовать обедающих философов, но вижу, что вы уже нашли этого. Итак, в качестве альтернативы, как насчет использования gridlock в качестве аналогии?
представьте себе нормальное движение по четырем улицам рядом с одним городским кварталом (North ave, South ave, East street и West street). Когда на дороге только одна или две машины, все движется плавно. Когда есть устойчивое движение, некоторые автомобили должны будут остановиться и ждать других автомобилей, чтобы пройти, но это это несложная задача. Одна машина останавливается, дожидаясь, пока проедет другая, и продолжает свой веселый путь.
теперь представьте движение в час пик в том же месте. Допустим, одна машина, едущая на юг по Уэст-стрит, не может проехать через перекресток в Северо-западном углу нашего городского квартала. Теперь эта машина блокирует все движение на Норт-авеню. Это не займет много времени, прежде чем на Запад автомобиль пытается сделать это через пересечение северо-восточного угла и застревает, блокируя все движение в северном направлении по Восточной улице. Когда эта ситуация делает все это вокруг четырех перекрестков, ни один автомобиль не может двигаться! Каждый из них ждет, когда автомобили перед ним двинутся вперед, но нет никакого способа для выхода из тупика, не вытаскивая автомобили назад.
сравнение с вычислениями должно быть простым. Автомобили-это потоки или процессы, улицы и проспекты-процессоры, буферы или ядра. Концепция блокировки может если описать его с помощью светофоров или стоп-сигналов, то все это начинает приобретать интуитивный смысл, даже для не-программистов.
написать программу:
- ждать зарплату.
- пойти в магазин.
- купить продукты.
- включить плиту.
- положите еду на тарелку.
- оставить плиту на 20 минут.
- есть.
- ложиться спать.
теперь попробуйте выполнить два потока (вы, жена) без синхронизации.
- Вы: подождите зарплаты.
жена: идите в магазин без денег, crash
вы: включите плиту.
- вы: держите тарелку в течение 20 минут.
ты: иди спать.
жена: ешьте в чужом месте.
- жена: иди спать.
Питер хочет съехать со своей подъездной дорожки. Он проверяет, нет ли чего на пути его машины, затем садится. Его сын Фрэнк прячется за машиной. Питер не видит его и сбивает.
важно то, что для компьютера "проверить" и "изменить", как правило, два отдельных действия, поэтому пример, когда вы не можете проверить что-то, когда вы изменяете его, является хорошим.
Как насчет очевидного?
состояние гонки-это буквально гонка между двумя людьми.
компания делает ставку на проект. Два сотрудника, работающие самостоятельно на торгах, представляют их заказчику, но один из сотрудников имеет устаревшую информацию. Ни один из сотрудников не знает, что другой находится в процессе подачи заявки, поэтому в зависимости от того, кто быстрее, первая заявка может быть заменена более медленным сотрудником. Это вызовет путаницу в качестве ставки возможно, со временем все изменилось.
должна быть связь между двумя сотрудниками, чтобы либо работать вместе, либо остановить одного из них.
одна трудность в объяснении общей концепции заключается в том, что условия расы проявляются в самых разных ситуациях. Если ваша цель - дать вашей нетехнической аудитории ощущение, что это общий тип проблемы, вы должны попытаться предложить более одного примера.
изображение стоит 1000 слов. Это правда. Если вы нарисуете временную шкалу и поместите на нее какую-то сущность, и покажете изменения ее состояния с течением времени, вы можете довольно легко продемонстрировать состояние расы на одной диаграмме. Возможно, потребуется несколько повторов, чтобы сделать картину правильной, но я всегда обнаруживал, что, рисуя ее, я должен быстрее изложить свою точку зрения, чем описывать ее.
Я думаю, что это трудно объяснить простым способом, потому что думать о параллелизме по своей сути сложно. Основная идея финансовой сделки может быть хорошим местом для начала, поскольку люди будут иметь некоторое знакомство с ними из реальной жизни.
в любой транзакции вам нужно сделать одновременные записи в двух местах-дебеты и кредиты. Если транзакция прерывается в середине кем-то другим, пытающимся выполнить другую транзакцию, они увидят неправильный баланс на том или ином счете.
есть отличный пример в Структурированное Параллельное Программирование С Приложениями Операционных Систем (насколько я помню)
в нищей стране Безеркистан две линии сливаются в одну колею в туннеле. Были столкновения, и правящая хунта нуждается в решении.
проблема в том, что он горный, и инженеры слепы. Существует очень мало заблаговременного предупреждения о двух поездах, которые вот-вот столкнутся в туннель.
вот план.
положите большую чашу на стыке.
дайте каждому инженеру маленькую латунную обезьянку.
когда вы собираетесь войти в туннель, вы останавливаете свой поезд. Вы похлопываете по миске, чтобы увидеть, есть ли в миске медная обезьяна.
Если есть обезьяна, кто-то еще использует туннель, поэтому вам нужно подождать, пока их поезд полностью не окажется в туннеле, в в этот момент кондуктор выходит из вагона и хватает обезьяну из вазы.
Если нет обезьяны, никто больше не использует туннель. Таким образом, вы можете схватить свою обезьяну из моторного отсека, положить ее в чашу и проехать через туннель, зная, что вы приобрели эксклюзивный доступ к трассе. Конечно, вы ненадолго останавливаетесь, чтобы позволить проводнику забрать медную обезьяну.
угадайте, что?
Они еще было наездом!
Почему? Какова ситуация или последовательность действий, которые приводят к сбою?
Это условие гонки.
в письменном документе, вы можете объяснить, как состояние гонки приводит к аварии.
в презентации вы можете тренировать аудиторию, рассуждая о параллелизме и блокировке.
Я бы использовал пример банковского счета общей памяти условия гонки данных.
объясните, что компьютер делает что-то вроде: баланс нагрузки; добавить 1; баланс магазина;. рассмотрим два потока, которые изменяют баланс вашего банковского счета (вы и ваша жена одновременно вносите один доллар).
Если оба потока взаимодействуют после: баланс нагрузки; а затем возобновить, вы можете потерять один доллар.
посмотреть: http://wasp.cs.washington.edu/atomeclipse/handouts.pdf
Как вы упомянули, вам часто нужно вводить другие понятия (взаимное исключение, нити исполнения), чтобы точно описать условия расы, даже в метафоре. Поэтому попробуйте сначала определить эти термины (или, по крайней мере, передать идею), используя метафору.
в качестве простого примера, давайте использовать 4-способ пересечения (в стране, где вы едете справа). Разделите пересечение на 4 квадранта: северо-западный, северо-восточный, юго-восточный и Юго-Западный. Теперь назовите каждый квадрант ресурс, и вызовите каждый автомобиль поток выполнения. Эти автомобили уважают только дорожные системы, и поскольку на этом перекрестке нет стоп-сигналов или светофоров, автомобили проносятся прямо через него, не замедляя или не рассматривая движение.
вы можете легко показать, что одновременное использование одного из этих квадрантов более чем одним автомобилем плохо и приводит к автокатастрофе. Одним из очевидных решений является установка системы трафика. Система обеспечивает что не больше чем один автомобиль проходит одновременно через квадрант. Он может сделать это замысловато, не связывая все ресурсы. Например, позволяя автомобилям, идущим с юга, сделать левый поворот на Запад (используя юго-восточный и северо-западный квадранты), в то время как автомобили, идущие с Запада, делают правый поворот на юг (используя юго-западный квадрант). Система дорожного движения обеспечивает взаимное исключение или предотвращение одновременного использования (несколькими автомобилями) общего ресурса (квадранта дороги в пересечение.)
Это, по крайней мере, дает идеи, лежащие в основе этих определений, идея одновременного доступа к общим ресурсам can быть плохим, и что взаимное исключение может решить эту проблему. После того, как это будет установлено, вам нужно сопоставить их с более подходящей метафорой, чтобы показать, что такое состояние расы и как это одна из тех плохих вещей, которые возникают из-за отсутствия взаимного исключения для общего ресурса.
Это займет немного больше времени, но это дает некоторое знакомство с терминами и общей картиной, прежде чем перейти к более сложной метафоре.
разговор о деньгах с вашими заинтересованными сторонами может отправить их в панический режим, особенно если они предполагают, что теряют фактические деньги из-за этого, что не совсем идеально, если проблема конкретно не приводит к чистой потере прибыли, поэтому вот менее финансово ориентированная история о том, как вы можете объяснить состояние гонки кому-либо.
эта история не обращается к концепции deadlock, но более традиционный сценарий условия гонки и последствия.
ИСТОРИЯ НАЧИНАЕТСЯ ЗДЕСЬ:
Установка: есть 3 города, связанные железнодорожной сетью. На поездах нет никаких знаков, указывающих, из какого города они прибывают и в какой город они собираются, потому что они используются между всеми 3 городами, и железнодорожная сеть не хотела иметь дело с хлопотами изменения знаков все время. Поскольку сеть небольшая, конкретного расписания поездов нет приезжайте и уезжайте. Надзиратели станции просто получают вызов от других городских надзирателей станции, когда поезд отправляется, надзиратель отмечает время, когда он ушел, и поскольку все поезда являются одними и теми же моделями, они ездят с одинаковой скоростью, поэтому, когда надзиратель получает вызов из других городов, они объявляют людям на станции, что: "следующий поезд будет направляться в город C". Поэтому люди, которые хотят поехать в город C, ждут поезда, садятся и весело едут в город C.
Проблема:
проблема с условиями расы и многими многими компьютерными конструкциями заключается в том, что люди не являются компьютерами. Каждый раз, когда я объясняю алгоритм своим студентам, они говорят: "но это не имеет смысла делать так", на что я отвечаю: "у компьютеров нет здравого смысла, все, что у них есть, это инструкции". Помимо этого, вы должны объяснить расовое состояние как расу, и имеет смысл позволить людям действительно попробовать расу, если они могут. Так они смогут увидеть, как все идет не так. Но... они не разрешается использовать здравый смысл.
Итак, предположим, что у нас есть игра, в которой 2 человека заполняют стопки цветных блоков в порядке красного, оранжевого, желтого. У них много красных, оранжевых и желтых блоков. Все стеки должны быть ровно три блока высотой.
в первой игре оба пытаются сделать это как можно быстрее, но они работают только на свои стеки.
во второй игре они пытаются работать вместе, позволяя себе также укладывать блоки друг на друга скирды. Однако им не разрешается менять блок, который у них есть в руке, и они должны разместить запланированный блок.
вы можете представить себе ситуацию, как это происходит в стеке 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, и нам нужно добавить некоторые меры предосторожности, чтобы это произошло.
этого должно быть достаточно для обсуждения технических решений с разумной интуицией.
например, мьютекс означает, что вы запираете дверь в комнату с доской в ней и заставляете их делать свою работу там. - оптимистическое решение означает, что вы заставляете их обоих проверять и начинать все сначала, если номер изменился, пока их не было. Если вы хотите поговорить о тупиках, вы можете посмеяться над тем, как Боб звонит Алисе из запертой комнаты, чтобы попросить ее поторопиться.
отправить их в Гонки на Википедии.
первая часть будет иметь смысл, а остальное (не показано ниже) заставит вас выглядеть умным, так как они будут предполагать, что вы это понимаете.
"состояние гонки или опасность гонки-это недостаток в системе или процессе, в результате которого выход и/или результат процесса неожиданно и критически зависят от последовательности или времени других событий. Термин берет свое начало с идеи двух гоночных сигналов каждый другое, чтобы сначала повлиять на выход."
Я думаю, что ключевой момент, чтобы получить через то, что его наиболее часто вопрос времени, который может быть непредсказуемым, потому что время что-то принимает отличается время от времени.