Как уже было сказано, планировщик ULE создает набор из трех очередей для каждого процессора в системе. Одна из очередей является очередью простоя, в которой размещаются все простаивающие потоки. Следующие две очереди определены как текущая и следующая. Потоки отбираются на выполнение в порядке приоритетов из текущей очереди, пока она не станет пустой, в этот момент текущая и следующая очереди меняются местами и планирование начинается снова.
Ядро поддерживает также ограничение для каждого процесса некоторых ресурсов. Эти ресурсы включают:
В ходе выполнения процесса он использует системные ресурсы, такие, как время процессора и память. Ядро отслеживает ресурсы, используемые каждым процессом, и составляет статистику, описывающую это использование. Управляемая ядром статистика доступна процессу во время его выполнения. Когда процесс завершается, статистика становится доступной родителю через семейство системных вызовов wait.
У всех систем есть ограничения, налагаемые их аппаратной архитектурой и конфигурацией для обеспечения приемлемой деятельности и удержания пользователей от случайного (или злонамеренного) создания нехватки ресурсов. Как минимум, на работающие в системе процессы должны быть наложены ограничения аппаратного обеспечения. Обычно желательно ограничить процессы и дальше, ниже уровня ограничений оборудования. Система оценивает использование ресурсов и дает возможность ограничить использование ресурсов на уровне или ниже ограничений аппаратного обеспечения
Приоритеты процессов
Каждый процесс в системе связан с группой процессов. Группу процесса иногда называют заданием (job), она управляется как единое целое такими процессами, как оболочка. Некоторые сигналы (например, SIGINT) доставляются всем членам группы процессов, заставляя всю группу в целом приостанавливать или возобновлять выполнение, прерываться или завершаться.
Одной из важных задач операционной системы является реализация механизмов управления доступом. Большинство из этих механизмов управления доступом основывается на представлениях об отдельных пользователях и группах пользователей. Пользователи обозначаются 32-разрядными числами, которые называются идентификаторами пользователей (UID). UID назначаются не ядром, а внешним административным представителем.
Оставшаяся часть относящейся ко времени обработки включает обработку запросов тайм-аутов и периодическое изменение приоритетов готовых к выполнению процессов. Эти функции обрабатываются процедурой softclockQ. Когда hardclockQ завершается, если было бы нужно выполнить какие-нибудь функции softclockQ, hardclockQ назначает для выполнения процесс softclock. Основной задачей процедуры softclockQ является организация выполнения следующих периодических событий.
На старых системах FreeBSD процедура hardclockQ собирала статистику использования ресурсов о том, что происходило при прерывании от часов. Эта статистика использовалась для учета ресурсов, отслеживания деятельности системы и определения будущих приоритетов планирования. Кроме того, hardclockQ форсировала переключения контекстов так, чтобы процессы могли разделять время процессора.
Многие события ядра являются управляемыми аппаратными прерываниями. Для высокоскоростных устройств, таких, как сетевые контроллеры, этим прерываниям назначается высокий приоритет. Сетевой контроллер должен быстро подтвердить получение пакета и отменить запрет на получение дополнительных пакетов, чтобы избежать потерь близко расположенных пакетов. Однако дальнейшая обработка передачи пакета принимающим процессом, хотя и занимает время, не обязательно должна осуществляться сразу же.
Пока системный вызов обрабатывается или ожидает с заблокированными сигналами, процессу может быть отправлен сигнал или другой процесс может получить больший приоритет планирования. После завершения системного вызова код выхода из системного вызова проверяет, имело ли место какое-нибудь событие.