Переключение контекста процесса.
Переключение между процессами, необходимое для распределения вычислительного ресурса, выражается в переключении контекста, когда контекст выполнявшегося процесса запоминается, а восстанавливается контекст процесса, выбранного планировщиком процессов. Переключение процесса является достаточно ресурсоемкой операцией, поскольку, кроме сохранения состояния регистров процесса, ядро должно выполнить множество других действий.
Контекст переключается в четырех случаях:
1. текущий процесс переходит в состояние сна, ожидая недоступного ресурса (3);
2. текущий процесс завершает свое выполнение (7);
3. если существует более высокоприоритетный процесс в очереди на выполнение после пересчета приоритетов;
4. происходит пробуждение более высокоприоритетного процесса.
Первые два случая соответствуют добровольному переключению контекста, и действия ядра достаточно просты – ядро вызывает процедуру переключения контекста из функций sleep или exit. Третий и четвертый случаи происходят не по воле процесса, который в это время выполняется в режиме ядра, поэтому не может быть немедленно приостановлен. В этой ситуации ядро устанавливает специальный флаг runrun, который указывает, что в очереди находится более высокоприоритетный процесс, требующий предоставления вычислительных ресурсов. Перед переходом процесса из режима ядра в режим задачи ядро проверяет этот флаг и, если он установлен, вызывает функцию переключения контекста.
|
|
Планирование процессов в UNIX-системах, как правило, основано на приоритетах процессов, т. к. планировщик процессов выбирает процесс с наивысшим приоритетом.
Приоритет процесса не является фиксированным и динамически изменяется системой в зависимости от использования вычислительных ресурсов, времени ожидания запуска и текущего состояния процесса.
Если процесс готов к запуску и имеет наивысший приоритет, планировщик процессов приостанавливает выполнение текущего процесса (с более низким приоритетом), даже если последний не выработал свой временной квант.
Ядро UNIX-систем является непрерываемым (nonpreemptive), что означает – процесс, находящийся в режиме ядра (в результате системного вызова или прерывания) и выполняющий системные инструкции, не может быть прерван системой, а вычислительные ресурсы передаются другому высокоприоритетному процессу. Выполняющийся процесс не может освободить процессор по собственному желанию в результате недоступности какого-либо ресурса, перейдя в состояние сна. В противном случае, система может прервать выполнение процесса только при переходе из режима ядра в пользовательский режим. Такой подход значительно упрощает решение задач синхронизации и поддержки целостности структур данных ядра.
Процессы, выполняющиеся в пользовательском режиме, имеют более низкий приоритет, чем работающие в режиме ядра.