Объединение прерываний
Планирование в условиях реального времени – сложный и любопытный процесс отчасти благодаря взаимодействию двух не вполне совместимых показателей. Это способность к реагированию (как быстро вы можете откликаться на запросы) и производительность (как много вы можете сделать в общей сложности). Любой работавший в офисной среде способен быстро оценить напряженность между этими двумя критериями. Отчасти по этой причине существуют сотрудники, чья работа заключается в том, чтобы отвечать на звонки: они быстро реагируют, чтобы у других была возможность проявить свою производительность. Но все усложняется, когда вам, как компьютеру, приходится постоянно разрываться между быстрым реагированием и высокой производительностью. И лучший способ разобраться с делами, как бы парадоксально это ни звучало, – притормозить.
Диспетчеры операционных систем обычно определяют период, в течение которого каждая программа гарантированно работает, хотя бы немного. При этом система отдает сегмент такого периода каждой из программ. Чем больше программ запущено, тем меньше становятся сегменты и тем чаще в течение каждого периода происходят контекстные переключения. Таким образом, способность быстро реагировать поддерживается за счет продуктивности. Если оставить без присмотра этот порядок, гарантирующий каждому процессу хоть немного внимания в каждом периоде, случится катастрофа. При избыточном количестве запущенных программ сегмент для задачи сократится до такого размера, что системе придется его полностью потратить на контекстное переключение прежде, чем опять немедленно переключиться на новое задание.
Препятствие заключается в том, что гарантировать быстрое реагирование сложно. Современные операционные системы устанавливают минимальный размер для своих сегментов, который не подлежит дальнейшему делению. (В Linux, например, такой минимальный рабочий сегмент составляет около трех четвертых миллисекунды, но у людей он, скорее всего, будет составлять не менее нескольких минут.) Если после этого процессы продолжают добавляться, то период просто будет продлен. Это значит, что процессам придется ждать своей очереди дольше, чем настанет их очередь, но зато, когда она подойдет, у них будет достаточно времени, чтобы сделать что-то полезное. Установка минимального времени, которое можно потратить на одно любое задание, помогает полностью предотвратить стремление к быстрому реагированию за счет продуктивности: если минимальный сегмент больше времени, которое требуется на контекстное переключение, система никогда не сможет впасть в состояние, когда переключение будет ее единственной работой. Этот принцип также можно с легкостью перевести и в плоскость умственной деятельности человека. Метод тайм-боксинга или техника помидора, где вы устанавливаете кухонный таймер и выполняете только одно задание, пока не прозвучит сигнал, – прямое воплощение этой идеи.
Но какой величины должен быть ваш кусочек? Ответ на вопрос, сколько времени можно выделить на интервал между выполнением повторяющегося задания (например, между проверками почты), с точки зрения продуктивности крайне прост: столько, сколько возможно. Но это еще не конец; бóльшая производительность также означает более медленное реагирование.
Для вашего компьютера такая раздражающая помеха, на которую ему приходится постоянно отвлекаться, – вовсе не проверка почты. Это вы. Вы можете не шевелить мышкой несколько минут или часов, но, дотронувшись до нее, вы ожидаете немедленно увидеть движение курсора на экране, и это означает, что машина тратит огромные усилия на то, чтобы следить за вами. Чем чаще она проверяет мышку и клавиатуру, тем быстрее сможет отреагировать на запрос, но тем больше контекстных переключений ей придется совершить. Поэтому правило, которому следуют операционные системы, чтобы определить время, которое они могут выделить на решение какой-либо задачи, элементарно: столько, сколько возможно без паники или отставания от пользователя.
Когда люди ненадолго выбегают из дома по срочному делу, они обычно говорят что-то вроде «ты даже не успеешь заметить, что меня нет». Когда наши машины переключаются на вычислительные операции, им тоже приходится торопиться, чтобы мы этого не заметили. Чтобы найти этот баланс, программисты операционных систем обратились к психологии. Они штудировали работы по психофизике, чтобы найти точное количество миллисекунд простоя, нужное человеческому мозгу, чтобы зафиксировать вспышку на экране или отставание курсора. Обращать внимание на пользователя чаще нет смысла.
Благодаря этому, когда операционная система работает верно, вы даже не замечаете, как ваш компьютер напрягается. Вы по-прежнему можете легко перемещать курсор по экрану, даже если при этом ваш процессор работает на полную катушку. Эта легкость все же стоит вам некоторой степени производительности, но это преднамеренный компромисс, придуманный инженерами системы: ваша система не взаимодействует с вами столько, сколько это возможно, а затем возвращается, чтобы отобразить движение мышки ровно в тот момент, когда вы к ней прикоснулись. И снова этот принцип можно переложить на жизнь человека.
Мораль такова: вы должны постараться сосредоточиться на одной задаче столько, сколько представляется возможным, не снижая уровень вашей продуктивности ниже определенной минимальной отметки. Решите, как быстро вы должны реагировать, и затем, если вы хотите закончить дело, не повышайте скорость реагирования.
Если вы делаете много контекстных переключений, поскольку решаете ряд разнородных коротких задач, вы с тем же успехом можете применить и другую мудрость из компьютерной науки – «объединение прерываний». Если у вас пять счетов по кредитным картам, к примеру, не бегите оплачивать их по одному. Дождитесь получения пятого счета и оплатите все. Поскольку платеж не требуется внести раньше тридцать первого дня с момента получения счета, то вы можете назначить, к примеру, первый день месяца днем оплаты кредитов и именно тогда засесть за работу со счетами. При этом не важно, когда они пришли – три недели или три часа назад. Аналогично, если от вас не требуется отвечать на письма чаще, чем раз в 24 часа, вы можете проверять почтовый ящик один раз в день. Сами же компьютеры поступают примерно так: они ждут начала установленного интервала и проверяют все вместо того, чтобы переключаться для решения отдельных, неорганизованных помех от их многочисленных подкомпонентов.
В отдельных случаях программисты отмечают отсутствие объединения прерываний в их собственной жизни. Директор по исследованиям Google Питер Норвиг говорит: «Мне пришлось трижды за сегодняшний день ехать в город по делам, и я сказал себе: "Это же ошибка в твоем алгоритме. Ты должен был подождать или отправить эти дела в очередь, нежели выполнять их последовательно по мере поступления"».
Отличный пример объединения прерываний – организация работы почтовой службы. Поскольку почту доставляют лишь раз в день, то посылка или письмо, отправленное минутой позже крайнего срока, будет ожидать дополнительные 24 часа, чтобы попасть к вам. Учитывая издержки на контекстное переключение, положительная сторона этого явления тоже должна быть для вас очевидной: счета или письма могут отвлечь вас только раз в день. Более того, 24-часовой почтовый ритм требует от вас минимального реагирования: ведь не важно, пишете вы ваш ответ отправителю в течение пяти минут или пяти часов после получения письма.
В учебных заведениях заседание кафедры – это способ объединения прерываний от студентов. В коммерческих структурах объединение прерываний несколько оправдывает проведение самых критикуемых офисных ритуалов – еженедельных собраний. При всех их недостатках регулярно проводимые собрания – одно из лучших средств защиты от спонтанного прерывания и незапланированного контекстного переключения.
Покровителем образа жизни, основанного на минимизации количества контекстных переключений, можно назвать легендарного программиста Дональда Кнута. «Я делаю только одно дело за раз, – говорит он. – Это то, что компьютерные ученые называют пакетной обработкой данных – альтернативой перекидывания информации». И Кнут не шутит.
1 января 2014 года он приступил к настройке языка TeX, в рамках которой он устранил все ошибки, которые зафиксировали его программы для набора текста за шесть лет. Его отчет заканчивается бодрым «Не пропустите настройку ТеХ в 2021 году!». Кроме того, до сих пор (с 1990 года) у Кнута нет электронной почты. «Электронный ящик незаменим для тех, чья задача в жизни – быть на гребне волны. Но не для меня. Моя задача – быть на глубине. То, чем я занимаюсь, требует долгих часов изучения и непрерывной концентрации». Он просматривает свою почту каждые три месяца, а факсы – каждые шесть.
Но у нас нет необходимости впадать в такие крайности, мечтая, чтобы в основе жизненного уклада лежал принцип объединения прерываний. По счастливой случайности, почтовые отделения разделяют пользу этого принципа. В остальных аспектах жизни нам нужно самим выстроить его или требовать его применения. У наших постоянно трезвонящих устройств есть режим «не беспокоить», который мы можем вручную включать и выключать в течение дня, но это примитивно и неудобно. Вместо этого мы можем обратиться к настройкам, которые создадут нам необходимые условия для объединения прерываний. Обращайся ко мне каждые 10 минут, например. И рассказывай мне сразу все, что произошло за этот период.