[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Классы и приоритеты

Для планирования при создании процессу присваиваются класс и приоритет
в этом  классе. Как  привилегированный пользователь,  вы также  можете
установить процессу  приоритет, определяя  класс  и  приоритет  внутри
класса.  Процесс   изменяет  класс   только   в   результате   запроса
пользователя. Класс  и приоритет  в  классе  отображаются  системой  в
глобальный приоритет,  который используется  системой при планировании
процессов. Глобальный  приоритет определяет, когда запускать процесс -
планировщик всегда  запускает готовый  к исполнению  процесс с  высшим
приоритетом. Численно,  высшие приоритеты  исполняются первыми.  После
того как  планировщик запустит  процесс,  тот  занимает  ЦП,  пока  не
использует свой  квант, или  пока не  уснет, или пока не будет прерван
процессом  с   более  высоким   приоритетом.  Процессы  с  одинаковыми
приоритетами запускаются  случайным образом.  Команда pc  -cl  выводит
глобальные приоритеты.

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

Системный класс  использует стратегию фиксированных приоритетов, чтобы
выполнять процессы ядра, такие как сервера, и служебные (housekeeping)
процессы,  такие   как  демоны   подкачки  страниц.   Системный  класс
зарезервирован для  использования  ядром.  Пользователь  не  может  ни
добавить,  ни   уничтожить  процесс   системного  класса.   Приоритеты
процессов  системного   класса  устанавливаются   ядром   и,   однажды
установленные, уже не изменяются.

Класс  реального   времени   использует   стратегию   планирования   с
фиксированными  приоритетами,   так  что   критичные  процессы   могут
исполняться в  предопределенном порядке.  Приоритеты реального времени
никогда не  изменяются,  за  исключением  случая,  когда  пользователь
требует  их   изменить.   В   этом   заключается   отличие   стратегии
фиксированных приоритетов от стратегии разделения времени, где система
изменяет приоритеты,  пытаясь обеспечить  хорошее время ответа. Только
привилегированный   пользователь    может   устанавливать   приоритеты
реального времени, используя priocntl(2).
Системный  планировщик   процессов  хранит  все  процессы  в  очередях
планирования. Процессы  с одинаковыми  приоритетами хранятся  вместе в
одной очереди.  Процессы в данной очереди располагаются в порядке FIFO
(First-In-First-Out). Процессы  реального времени, которые пробудились
от сна;  процессы, которые  изменили свой  класс реального  времени на
какой-либо другой класс; процессы, которые полностью использовали свою
временной квант;  и,  наконец,  готовые  к  исполнению  процессы,  чей
приоритет переустановлен  с  помощью  priocntl(2),  ставятся  в  конец
соответствующих очередей.  Процесс, который  был прерван  процессом  с
более высоким  приоритетом, остается  в начале  очереди (независимо от
времени, оставшегося  от его  временного кванта)  и запускается раньше
любого  другого  процесса  с  таким  же  приоритетом.  После  создания
подпроцесса с  использованием fork(2), родительский процесс продолжает
исполняться,  тогда   как  порожденный   процесс  (который   наследует
родительский приоритет) ставится в конец очереди.