Метод отслеживания рестартов

Как уже сказано, откат системы на сохранённое состояние при рестарте вызывает обратный ход субъективного времени системы.

Поскольку время вне системы (объективное) идёт вперёд, возникают условия для конфликта. Например, сетевое соединение после рестарта может оказаться в странном состоянии - за время перезагрузки "та" сторона уже вышла в тайм-аут и закрыла соединение, а "эта" всё ещё уверена, что всё нормально и пытается его использовать. Могут быть и более неприятные последствия.

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

1. Разделим все объекты Фантома на обычные и интерфейсные. Назовём интерфейсными те объекты, которые дают нашей инкарнации Фантома связь со внешним миром, причём только такие, которые уже ничем для оной связи с внешним миром не пользуются. То есть терминальные интерфейсные объекты. В зависимости от реализации такими объектами могут быть, например, объекты класса "порт ввода-вывода", "окно в физическую память устройства", "прерывание", "обработчик прерывания" и т.п.

Промаркируем все существующие интерфейсные объекты флагом "присутствовал при смерти системы".

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

3. Первым (находящимся в интерфейсном объекте) "пропишем" exception специального класса - "рестарт.произошёл рестарт". То есть промаркируем их так, что при первой же попытке постановки шедулерм на процессор они получат такое исключение. Физически выполним это как насильственное формирование на стеке кадра с вызовом специальной функции, которая только и делает, что генерирует исключение.

4. Все нити получат аналогичное ("рестарт.был рестарт") исключение при любой попытке вызвать метод интерфейсного объекта с ôëàãîì "ïðèñóòñòâîâàë ïðè ñìåðòè ñèñòåìû".


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

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

todo: шаблон класса драйвера

 

Используются технологии uCoz