На старых системах FreeBSD процедура hardclock() собирала статистику использования ресурсов о том, что происходило при прерывании от часов. Эта статистика использовалась для учета ресурсов, отслеживания деятельности системы и определения будущих приоритетов планирования. Кроме того, hardclock() форсировала переключения контекстов так, чтобы процессы могли разделять время процессора.
У этого подхода есть недостатки из-за регулярных прерываний часов, поддерживающих hardclock(). Процессы могут синхронизироваться с системными часами, что приведет к неточному измерению использования ресурсов (особенно центрального процессора) и неточному профилированию [McCanne & Torek, 1993]. Можно также написать программы, которые сознательно синхронизируются с системными часами, чтобы обмануть планировщик.
На архитектурах с несколькими высокоточными программируемыми часами (таких, как PC) часы для статистики работают с частотой, отличающейся от частоты основных часов. Процедура statclock() FreeBSD работает с частотой 128 тиков в секунду и отвечает за сбор использования ресурсов для процессов. С каждым тиком она добавляет текущему выполняющемуся процессу один тик; если процесс накопил четыре тика, повторно вычисляет его приоритет. Если новый приоритет меньше, чем текущий, организует перепланировку процесса. Таким образом, для процессов, синхронизировавшихся с системными часами, по-прежнему ведется учет процессорного времени.
Процедура statclock() также собирает статистику о том, что система делает в момент тика (находится в бездействии, выполняется в режиме пользователя или выполняется в системном режиме). Наконец, она собирает основную информацию о системном вводе/выводе (наример, какие диски в данный момент активны).
Для поддержки сбора более точной профилирующей информации FreeBSD поддерживает часы профилировки. Когда один или более процессов запрашивают информацию о профилировке, профилирующие часы запускаются с частотой, относительно превосходящей частоту основных системных часов (1024 тика в секунду на PC). При каждом тике они проверяют, работает ли один из процессов, который нужно проверять. Если да, получают текущее значение счетчика команд и увеличивают счетчик, связанный с этим местом в буфере профилирования, связанном с процессом.
- 22/07/2010 16:24 - Внешнее представление
- 15/07/2010 22:02 - Реальное время
- 11/07/2010 09:08 - Службы времени
- 08/07/2010 12:45 - Службы управления памятью
- 04/07/2010 23:01 - Тайм-ауты
- 02/07/2010 05:18 - Прерывания от часов
- 26/06/2010 01:52 - Программные прерывания
- 24/06/2010 12:26 - Прерывания от устройств ввода/вывода
- 16/06/2010 13:31 - Исключения
- 15/06/2010 08:13 - Состояние процесса