Приоритеты процессов

Переключение контекста процесса.

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

Контекст переключается в четырех случаях:

1. текущий процесс переходит в состояние сна, ожидая недоступного ресурса (3);

2. текущий процесс завершает свое выполнение (7);

3. если существует более высокоприоритетный процесс в очереди на выполнение после пересчета приоритетов;

4. происходит пробуждение более высокоприоритетного процесса.

Первые два случая соответствуют добровольному переключению контекста, и действия ядра достаточно просты – ядро вызывает процедуру переключения контекста из функций sleep или exit. Третий и четвертый случаи происходят не по воле процесса, который в это время выполняется в режиме ядра, поэтому не может быть немедленно приостановлен. В этой ситуации ядро устанавливает специальный флаг runrun, который указывает, что в очереди находится более высокоприоритетный процесс, требующий предоставления вычислительных ресурсов. Перед переходом процесса из режима ядра в режим задачи ядро проверяет этот флаг и, если он установлен, вызывает функцию переключения контекста.

Планирование процессов в UNIX-системах, как правило, основано на приоритетах процессов, т. к. планировщик процессов выбирает процесс с наивысшим приоритетом.

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

Если процесс готов к запуску и имеет наивысший приоритет, планировщик процессов приостанавливает выполнение текущего процесса (с более низким приоритетом), даже если последний не выработал свой временной квант.

Ядро UNIX-систем является непрерываемым (nonpreemptive), что означает – процесс, находящийся в режиме ядра (в результате системного вызова или прерывания) и выполняющий системные инструкции, не может быть прерван системой, а вычислительные ресурсы передаются другому высокоприоритетному процессу. Выполняющийся процесс не может освободить процессор по собственному желанию в результате недоступности какого-либо ресурса, перейдя в состояние сна. В противном случае, система может прервать выполнение процесса только при переходе из режима ядра в пользовательский режим. Такой подход значительно упрощает решение задач синхронизации и поддержки целостности структур данных ядра.

Процессы, выполняющиеся в пользовательском режиме, имеют более низкий приоритет, чем работающие в режиме ядра.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: