Задача о серверном таймере - Академия Selectel

Задача о серверном таймере

Тирекс
Тирекс Самый зубастый автор
20 марта 2026

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

Изображение записи

Дисклеймер
Описанное поведение и применение watchdog является условным. Мы специально упростили его для логической задачи.

Условие

Представим, что у вас два сервера: Server_A и Server_B. На каждом установлен watchdog — механизм, который контролирует зависание системы. Если система не посылает команды сброса таймера, watchdog перезагружает ее.

Для Server_A интервал таймера составляет 7 минут. Для Server_B — 10. При каждой перезагрузке watchdog записывает логи в специальное хранилище — REBOOT Server_A или REBOOT Server_B.

Дополнительно установлен клиент, который посылает таймеру сигнал о сбросе — REVERSE_TIMER Server_A или REVERSE_TIMER Server_B. Этот сигнал также записывается в логи.

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

Задача

В серверной находится один сотрудник. В начальный момент времени серверы выключены. Специалист подает питание (то есть Server_A и Server_B стартуют одновременно) и пытается отсчитать ровно 16 минут, посылая команды REVERSE_TIMER и REBOOT Server. Определите, какая последовательность команд будет в логах?

Решение

Если бы watchdog работал как обычный таймер, то мы бы не смогли получить 16 минут. Но по условию watchdog работает подобно песочным часам. Если на семиминутный таймер придет команда REVERSE через три минуты после старта, то сервер перезагрузится и таймер начнет отсчитывать уже не 7 минут, а только 3.

Сравним с песочными часами. Когда появляется REVERSE, в нижней колбе песка находится на три минуты, а вверху — на четыре. Затем часы переворачиваются, поэтому сверху оказывается колба с тремя минутами.

Чтобы получить 16 минут, можно воспользоваться «клонированием». Для этого нужно запустить оба таймера одновременно (это происходит по условию) и подождать, когда они закончат работу.

В момент, когда завершит работу таймер Server_A — на 7-ой минуте — ему нужно послать команду REBOOT, чтобы запустить его заново.

Далее — на 10-ой минуте — Server_A уже закончит один круг и начнет второй. От этого второго круга Server_A отработает только три минуты, которые мы сможем «клонировать». Для этого нужно послать на таймер А команду REVERSE.

Server_A  отработает три минуты и пошлет команду REBOOT. В этот момент нам нужно «перевернуть» таймер В, послав ему REVERSE. Мы делаем это, так как таймер В тоже отработал три минуты, а команда REVERSE заставит его работать трехминутный цикл еще раз.

Конечное решение выглядит так:

№ шагаВремяКомандаПояснение
10 минутПодаем питание.Таймеры запускаются одновременно.
27 минREBOOT Server_AПрошло 7 минут.
310 минREBOOT Server_BПрошло 10 минут.
410 минREVERSE_TIMER Server_AТот же момент времени, что и на втором шаге. На сервере A прошло 3 минуты с момента REBOOT, поэтому после REVERSE таймер будет работать еще 3 минуты.
513 минREBOOT Server_AТаймер сервера A отсчитал 3 минуты, отправил команду REBOOT и начал новый 7-минутный цикл.
613 минREVERSE_TIMER Server_BС момента последнего REBOOT сервера B прошло 3 минуты, поэтому можно «перевернуть» 
716 минREBOOT Server_BТаймер сервера B завершил отсчет. Прошло 16 минут.

Другие задачи на логику