Смена приоритетов и управление очередностью
Стояло лето 1997 года, и у человечества было много поводов для радости. Например, впервые вездеход исследовал поверхность Марса. «Марсопроходец» стоимостью $150 млн развил скорость до 16 000 миль в час, пересек 309 млн миль пустого пространства и приземлился с помощью воздушных амортизаторов на красную скалистую поверхность Марса.
И тут он забуксовал.
Инженеры лаборатории реактивного движения были обеспокоены и поставлены в тупик. «Марсопроходец» удивительным образом начал игнорировать выполнение своей ключевой задачи с самым высоким приоритетом (обмен данными через информационную шину) и стал решать вопросы средней важности. Что же происходило? Неужели робот не понимал, что делает?
Внезапно «Марсопроходец» зафиксировал, что информационная шина не использовалась неприемлемо долго, и, не имея возможности обратиться за помощью, самостоятельно инициировал полную перезагрузку, что стоило миссии почти всего рабочего дня. Спустя день или больше все повторилось снова.
Лихорадочно работая, команда лаборатории в конце концов смогла воспроизвести и затем диагностировать такое поведение. Корнем зла оказалась классическая опасность планирования под названием «смена приоритетов». Происходит следующее: задача с низким приоритетом захватывает для работы системный ресурс (скажем, доступ к базе данных), но затем таймер прерывает работу задачи на середине, ставя ее на паузу, и активирует диспетчер системы. Диспетчер готов запустить задачу с высоким приоритетом, но не может, поскольку база данных занята. Таким образом, диспетчер опускается ниже по списку очередности задач, запуская различные незаблокированные задачи средней важности вместо того, чтобы запустить задачу с наивысшим приоритетом (которая заблокирована) или задачу с низким приоритетом, которая и блокирует работу (и которая оказалась в самом конце списка очередности после задач среднего приоритета). В таком кошмарном сценарии система может игнорировать задачу высшего приоритета очень долго.
Как только инженеры лаборатории выяснили, что проблема заключается в смене приоритетов, они написали код для решения проблемы и отправили его через миллионы миль «Марсопроходцу». Решением стало наследование приоритетов. Это означает, что если низкоприоритетная задача блокирует ресурс высокоприоритетной задачи, то низкоприоритетная задача должна немедленно «унаследовать» высокий приоритет той задачи, которую она блокирует.
Комик Митч Хедберг рассказывает такую историю: «Я был в казино, отдыхал, вдруг ко мне подошел парень и сказал: "Вы должны пересесть. Вы заблокировали пожарный выход". Можно подумать, что я не собирался бежать, если бы начался пожар». Аргумент сотрудника казино: это смена приоритетов. Контраргумент Хедберга: наследование приоритетов. Хедберг, развалившийся на стуле перед пытающейся спастись бегством толпой, мешкая, ставит свою низкоприоритетную задачу над высокоприоритетной задачей людей, намеренных спасти свою жизнь. Но все изменится, если он унаследует их приоритет (перед наступающей в панике толпой ее приоритет наследуется довольно быстро). Как говорит Хедберг, «если вы состоите из горючих материалов и у вас есть ноги, вы никогда не блокируете пожарный выход».
Мораль этой истории в том, что даже любви к решению задач иногда бывает недостаточно, чтобы избежать роковых ошибок в планировании. И даже любви к решению важных задач – тоже. Готовность крайне скрупулезно решать самый важный вопрос с привычной нам близорукостью может привести к тому, что весь мир называет прокрастинацией. Как в случае с застрявшим автомобилем: чем сильнее вы хотите выбраться, тем больше буксуете. По утверждению Гёте, «то, что значит больше, никогда не должно быть во власти того, что значит меньше». И хотя в этом есть определенная мудрость, иногда такое утверждение не совсем справедливо. Зачастую то, что значит для нас больше всего, не может быть сделано, пока не закончено самое незначительное дело. Поэтому единственный выход – это относиться к неважным вещам с той же важностью, как и к тем, выполнение которых они тормозят.
Когда к какому-то заданию невозможно приступить, не завершив перед этим другое, теоретики в области планирования называют это управлением очередностью. Для проведения операционного исследования эксперт Лора Альберт Маклей, полагаясь на этот принцип, существенно изменила некоторые аспекты ведения домашнего хозяйства в своей семье. Если вы понимаете, как работают такие вещи, это может быть очень полезно. Конечно, жизнь с тремя детьми – это ежедневное планирование… Мы не выходим из дома, пока дети не позавтракают, а дети не смогут начать завтрак, если я забуду дать им ложки. Иногда мы можем забывать элементарные вещи, которые потом тормозят все. С точки зрения алгоритмов планирования осознание этого факта и попытка держать его в памяти – уже большое подспорье. Так я и справляюсь с делами день за днем.
В 1978 году исследователь Ян Карель Ленстра смог использовать тот же принцип, помогая другу Джину с переездом в новый дом в Беркли. «Джин постоянно откладывал какое-нибудь дело, не закончив которое мы не могли приступить к срочным вопросам». Как вспоминает Ленстра, они должны были вернуть грузовик, но он был им нужен, чтобы вернуть некоторое оборудование, а оборудование было нужно, чтобы починить кое-что в квартире. Этот ремонт мог подождать (поэтому все и откладывалось), но вернуть грузовик нужно было срочно. По словам Ленстра, он объяснил другу, что задача, предшествующая самой срочной, является еще более срочной. Поскольку Ленстра известен как ключевая фигура в теории планирования и был более чем вправе дать такой совет, он не удержался от деликатной иронии. Эта ситуация стала кейсом, демонстрирующим смену приоритетов из-за управления очередностью. А пожалуй, самым выдающимся экспертом в области управления очередностью, считается как раз друг рассказчика – тот самый Джин, или Юджин Лоулер.