Сигналы первоначально были спроектированы для моделирования исключительных событий, таких, как попытка пользователя завершить вышедшую из-под контроля программу. Они не предназначались для использования в качестве общего механизма межпроцессного взаимодействия, поэтому не было сделано попытки сделать их надежными. В более ранних системах каждый раз при перехвате сигнала восстанавливалось его действие по умолчанию. Введение управления заданиями привело к гораздо более частому использованию сигналов и сделало более заметной проблему, которую также усугубили более быстрые процессоры: если были быстро отправлены два сигнала, второй мог бы заставить процесс завершиться, даже если был установлен обработчик сигнала для перехвата первого сигнала. Таким образом, стала желательной надежность, поэтому разработчики создали новую инфраструктуру, которая содержала в качестве подмножества старые возможности, предоставляя в то же время новые механизмы.
Возможности сигналов, которые можно найти в FreeBSD, спроектированы вокруг модели виртуальной машины, в которой системные вызовы рассматриваются как сходные с набором аппаратных инструкций машины. Сигналы являются программным эквивалентом исключений и прерываний, а процедуры обработки сигналов выполняют функцию, эквивалентную процедурам обслуживания прерываний или исключений. Так же как машины предоставляют механизм для блокирования прерываний, чтобы обеспечить согласованный доступ к структурам данных, возможности сигналов позволяют маскировать программные сигналы. Наконец, из-за сложного окружения стека времени выполнения, которое может им требоваться, сигналы, подобно прерываниям, могут обрабатываться в альтернативном стеке, предоставленном приложением. Сводка этих машинных моделей приведена в таблице
Сравнение аппаратно-машинных операций и соответствующих операций виртуальной машины
|
Аппаратная машина |
Программная виртуальная машина |
|
Набор инструкций |
Набор системных вызовов |
|
Повторно запускаемые инструкции |
Повторно запускаемые системные вызовы |
|
Прерывания/исключения |
Сигналы |
|
Обработчики прерываний/исключений |
Обработчики сигналов |
|
Блокирование прерываний |
Маскирование сигналов |
|
Стек прерываний |
Стек сигналов |
Вычисления приоритета, использованные в алгоритме кратковременного планирования, разбросаны в различных частях системы. Периодически запускаются две процедуры, schedcpuQ и roundrobinQ. SchedcpuQ пересчитывает приоритеты потоков раз в секунду, используя формулу 4.2, и обновляет значение kg_slptime для потоков, заблокированных вызовом sleepQ. Процедура roundrobinQ запускается 10 раз в секунду и заставляет систему перепланировать потоки в (непустой) очереди с самым высоким приоритетом в режиме карусели, что дает каждому потоку квант времени в 100 миллисекунд.
Система поддерживает простую форму учета использования ресурсов. По завершении каждого процесса учетная запись, описывающая использованные этим процессом ресурсы, записывается в системный файл учета.
FreeBSD реализует возможность setgid путем установки в нулевом элементе массива дополнительных групп процесса, который выполняет программу setgid, значения группы этого файла. После этого можно проверять права доступа, как если бы это был обычный процесс. Из-за дополнительной группы программа setgid может иметь возможность доступа к большему количеству файлов, чем процесс пользователя, запускающий программу без этой особой привилегии.
Часто пользователю нужно предоставить дополнительные ограниченные привилегии. Например, пользователь, который хочет отправить сообщение, должен иметь возможность добавить сообщение в почтовый ящик другого пользователя. Разрешение записи в почтовый ящик назначения для всех пользователей дало бы возможность пользователю, не являющемуся владельцем ящика, изменять в нем сообщения (злонамеренно или неумышленно). Чтобы решить эту проблему, ядро допускает создание программ, которым предоставляются при их выполнении дополнительные привилегии.
Часто желательно на всех машинах сети поддерживать одно и то же время. Можно также поддерживать более точное время, чем возможно от базовых часов процессора. Например, без труда доступно оборудование, прослушивающее ряд радиостанций, рассылающих в Соединенных Штатах синхронизирующие сигналы UTC. Когда процессы на различных машинах приходят к соглашению относительно общего времени, им нужно изменить часы процессора своего хоста, чтобы согласовать их с сетевым значением времени.