Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции - Терехин.doc
Скачиваний:
6
Добавлен:
13.11.2019
Размер:
521.73 Кб
Скачать

Организация планирования в unix

Планирование основывается на понятии приоритета. Чем выше числовое значение приоритета, тем меньше приоритет (разрешено и отрицательное значение). Приоритет процесса - это параметр, который размещен в контексте процесса, и по значению этого параметра осуществляется выбор очередного процесса для продолжения работы или выбор процесса для его приостановки. Приоритет системного процесса задается в виде аргумента функции SLEEP, который переводит процесс в состояние ожидания некоторого события. Процесс перейдет в это состояние, но приоритет останется прежним и после выхода из ожидания у процесса будет именно этот приоритет. Существует граница PZERO (системная константа). Ее значение по умолчанию равно некоторому числу (например, 25). Значение системной константы можно изменить при генерации системы. Эти константы подбираются таким образом, чтобы поддерживать определенное равновесие системы. Если приоритет системного процесса больше PZERO, то он считается низким. Если приоритет системного процесса меньше или равно PZERO, то он считается высоким. Процесс, находящийся в состоянии ожидания с высоким приоритетом не может быть выведен из этого состояния каким - либо сигналом. Если процесс имеет низкий приоритет, то он будет обрабатываться. Приоритет пользовательского процесса собирается из нескольких частей. В вычислении приоритета пользовательского процесса используются значения двух полей дескриптора процесса (ДП) - P_NICE и P_CPU. P_NICE - формируется пользователем и называется пользовательской составляющей приоритета. Она наследуется от родителя и может изменяться по воле процесса. Изменяться она может только в сторону увеличения значения (до некоторого предельного значения). Т.е. пользователь может снижать приоритет своих процессов. Начальное значение P_NICE равняется некоторому значению NZERO (константа, например, 20) и в дальнейшем это поля может модифицироваться системной функцией nice(). Аргумент этой функции - это добавка к значению текущего поля. Непривилегированный процесс может задавать только неотрицательной значение этой добавки, а привилегированный - любые значения. Результирующее значение - это сумма добавок и старого значения. P_NICE ограничена снизу 0 и сверху константой NZERO*2. Если процесс непривилегированный, то NZERO < P_NICE < 2*NZERO. Если привилегированный - то

0<PNICE<2*NZERO. Поле P_NICE наследуется при порождении процесса.

P_CPU - это системная составляющая. Она формируется системой (ядром). Для этого используются прерывания по сигналу от таймера. Во время программного обслуживания часов происходит переоценка приоритетов процессов. А, следовательно, может произойти смена выполнения процессов. В отсутствие другого процесса системные часы реализуют функцию квантования времени между большим числом пользователей. В зависимости от кванта, значение поля будет увеличиваться на 1, следовательно приоритет процесса понижается. Приоритет непривилегированного процесса не может стать ниже P_USER (системная константа, например, 50).

Таким образом приоритет складывается из:

P_PRI = P_USER + (P_NICE-NZERO) + P_CPU/16

Он не может быть меньше P_USER, P_NICE P_CPU, причем пользовательская составляющая учитывается в виде разности (P_NICE-NZERO).

При учете P_CPU следует иметь в виду, что это поле увеличивается на 1 через прерывание по таймеру и не понятно проработал ли процесс полные 20 сек. Поэтому берется некое усреднение (делим на 16). Значение всех констант, входящих в эту формулу неотрицательно.

Замечание. Всегда P_NICE³NZERO (для (P_NICE-NZERO) процессов), следовательно значение приоритета ³ P_USER, следовательно приоритет непривилегированного процесса не может быть меньше 50. Для привилегированного процесса P_PRI ³ P_USER-NZERO = 30. P_PRI £ P_USER+NZERO -1=69. Пусть есть 2 процесса, причем ни они, ни их родители не меняли поле P_NICE. Тогда P_NICE=NZERO и процессы имеют начальные значения, равные значению P_USER. Поле P_CPU каждые 20 секунд увеличивается на 1, но в приоритет эта составляющая входит с коэффициентом 1/16. Это означает, что дополнительная единица набежит через 16 таймерных интервалов. Поле P_CPU второго процесса не меняется, т.е. его приоритет постоянный. Через 320 микросекунд разница приоритетов составит 1 в пользу второго процесса. Как толь это произойдет, то автоматически произойдет смена процессов (подразумевалось, что изначально приоритеты процессов были равны).