Программное обеспечение часов

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

1. Ведение показаний времени суток.

2. Предотвращение работы процессов дольше позволенного.

3. Ведение учета использования центрального процессора.

4. Обработка системного вызова alarm, выданного процессами пользователей.

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

6. Ведение аналитического, мониторингового и статистического сбора информации.

Осуществление главной функции часов — ведения показаний времени суток (которое также называется фактическим временем) не представляет особых трудностей. Нужно, как упоминалось ранее, всего лишь увеличивать значение счетчика с каждым тактом системных часов. Единственное, за чем нужно следить, — за количеством битов в счетчике времени суток. Если используются часы с частотой 60 Гц, то 32-разрядный счетчик будет переполняться каждые два года. Понятно, что система не сможет хранить фактическое время в виде числа тактов системных часов с 1 января 1970 года в 32 битах.

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

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

При третьем способе подсчет ведется в тактах, но делается он относительно времени начальной загрузки системы, а не какого-то конкретного внешнего момента времени. При считывании значения резервных часов или после ввода пользователем фактического времени время начальной загрузки системы вычисляется из текущего времени суток и сохраняется в памяти в удобной для системы форме. Чуть позже, когда будет запрошено время суток, сохраненное время суток добавляется к счетчику, чтобы получить текущее время. Все три способа показаны на рис. 5.25.

Рис. 5.25. Три способа ведения значения времени суток


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

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

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

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

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

Такое предупреждение может быть использовано при сетевом обмене данными, где пакет, чье получение не было подтверждено через определенный промежуток времени, должен быть передан повторно. Другим применением может стать компьютеризированное обучение, где студенту, не давшему ответ через определенное время, предоставляется правильный ответ.

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

Если ожидается множество сигналов, то лучше будет сымитировать несколько часов, выстроив в единую цепочку все невыполненные запросы на прерывание от таймера и составив связанный список (рис. 5.26). Каждая запись списка сообщает, сколько тактов системных часов следует ожидать за предыдущим тактом перед выдачей сигнала. В данном примере ожидаются сигналы через 4203, 4207, 4213, 4215 и 4216 тактов.

Рис. 5.26. Имитация нескольких таймеров при использовании одних часов


На рис. 5.26 следующее прерывание выдается через 3 такта. С каждым тактом значение переменной Следующий сигнал уменьшается на единицу. Когда оно становится равным нулю, выдается сигнал, соответствующий первому элементу списка, и затем этот элемент из списка удаляется. Затем переменной Следующий сигнал присваивается значение того элемента, который оказывается в начале списка, в данном примере это значение равно четырем.

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

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

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

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

5.5.3.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Программное обеспечение часов:

  1. Программное обеспечение
  2. Богомазова Г.Н.. Установка и обслуживание программного обеспечения персональных компьютеров, серверов, периферийных устройств и оборудования, 2015
  3. Эд САЛЛИВАН. ВРЕМЯ — ДЕНЬГИ Создание команды разработчиков, программного обеспечения, 2001
  4. Том ДеМарко. Вальсируя с Медведями Управление рисками в проектах по разработке программного обеспечения, 2005
  5. Алистэр Коуберн. Люди как нелинейные и наиболее важные компоненты в создании программного обеспечения, 1999
  6. ЧАСОВАЯ АСТРОЛОГИЯ.
  7. Семь часов
  8. "Часовое" и "целевое" время
  9. Сколько часов сна полезны человеку
  10. ..Бой часов Вестминстерского аббатства...
  11. 2.4.1. Программный анализатор
  12. КОНЦЕПЦИЯ ПРОГРАММНО - РОЛЕВАЯ
  13. 2.4.1. Программный анализатор
  14. Перевод программных вопросов в анкетные
  15. Глава 39 О ПРОГРАММНЫХ СВОЙСТВАХ ХУДОЖЕСТВЕННОЙ ЛИТЕРАТУРЫ
  16. На свете почти не существует таких срочных дел, которые было бы нельзя отложить на несколько часов.