Хорошее планирование процессов - сложная задача, которая зависит от видов выполняемых программ и целей политики планирования. Программы отличаются по объему вычислений и выполняемого ими ввода/вывода. Политики планирования обычно пытаются сбалансировать использование ресурсов со временем, которое требуется для завершения программы. В планировщике FreeBSD по умолчанию, который мы будем называть планировщиком с разделением времени, приоритеты процессов периодически пересчитываются, основываясь на различных параметрах, таких, как количество использованного процессорного времени, количество удерживаемых или необходимых для выполнения ресурсов памяти и т. д. Некоторые задачи требуют более точного контроля над выполняемым процессом, что называется планированием реального времени; оно должно гарантировать, что процессы завершат вычисление своих результатов к определенному предельному сроку или в определенном порядке. Ядро FreeBSD реализует планирование реального времени с помощью отдельной очереди, отличной от использующейся для обычных процессов с разделением времени. Процесс с приоритетом реального времени не является предметом снижения приоритета и может вытесняться лишь другим процессом с равным или более высоким приоритетом реального времени. Ядро FreeBSD реализует также очередь процессов, работающих с приоритетом простоя (idle priority). Процесс с приоритетом простоя будет запущен лишь тогда, когда в очереди реального времени или с разделением времени нет готовых к выполнению процессов, и лишь если его приоритет простоя равен или больше приоритета других готовых к выполнению процессов с приоритетом простоя.
Планировщик FreeBSD с разделением времени использует политику планирования на основе приоритетов, которая способствует первоочередному выполнению интерактивных программ, таких, как текстовые редакторы, по сравнению с долго работающими заданиями пакетного типа. Интерактивные программы имеют тенденцию проявлять всплески вычислений, перемежающиеся с периодами бездеятельности или ввода/вывода. Политика планирования вначале назначает каждому процессу высокий приоритет выполнения и дает этому процессу возможность выполняться в течение фиксированного кванта времени. Процессы, выполняющиеся в течение своего кванта времени, снижают свой приоритет, тогда как процессам, которые уступают процессор (обычно из-за выполнения ввода/вывода), разрешается сохранить свой приоритет. У бездействующих процессов приоритет повышается. Таким образом, задания, использующие большое количество процессорного времени, быстро снижают свой приоритет, тогда как интерактивные задания, которые большую часть времени бывают бездеятельными, остаются с высоким приоритетом, и, таким образом, когда они готовы к выполнению, они вытесняют долго работающие задания с меньшими приоритетами. Интерактивная задача, такая как текстовый редактор, занятый поиском строки, может на короткое время стать занятой вычислениями и таким образом снизить приоритет, но она вернется к высокому приоритету, когда снова станет пассивной во время обдумывания пользователем результатов.
Некоторые задачи, такие, как компиляция большого приложения, могут осуществляться за несколько небольших шагов, когда каждый компонент компилируется в отдельном процессе. Ни один отдельный шаг не выполняется достаточно долго для снижения его приоритета, поэтому компиляция в целом сильно влияет на интерактивные программы. Чтобы обнаружить и не допустить эту проблему, приоритет разделения времени порожденного процесса передается обратно его родителю. Когда запускается новый порожденный процесс, он начинает работу с текущего приоритета своего родителя. Таким образом, поскольку программа, координирующая компиляцию (обычно make), запускает несколько шагов компиляции, ее приоритет снижается из-за интенсивного использования процессора ее потомками. Позже шаги компиляции, запущенные make, начинают работать и находиться на более низком уровне приоритета, что дает интерактивным программам с более высоким приоритетом получить при желании преимущество перед первыми.
Политика планирования нужна системе также для работы с проблемами, возникающими от недостатка основной памяти для содержания контекста выполнения всех процессов, которые хотят выполняться. Главной целью этой политики планирования является минимизация пробуксовки (thrashing) - феномена, возникающего при таком малом количестве основной памяти, что большая часть времени системы тратится на обработку отказов страниц и планирование процессов, чем на выполнение кода приложения в режиме пользователя.
Система должна находить и устранять пробуксовку. Она обнаруживает пробуксовку, отслеживая количество свободной памяти. Когда у системы мало свободных страниц памяти и высока частота запросов новой памяти, она считает, что находится в состоянии пробуксовки. Система снижает пробуксовку, помечая давно не запускавшиеся процессы как запрещенные для запуска. Эта отметка дает демону подкачки возможность сбросить все страницы, связанные с этим процессом, во вторичное хранилище. На большинстве архитектур ядро может сбросить во вторичное хранилище также и структуру пользователя отмеченного процесса. Результатом этих действий является сброс процесса на диск. Память, освобожденная путем блокирования процесса, может после этого быть распределена между оставшимися процессами, которые обычно могут затем продолжать работать. Если пробуксовка продолжается, выбираются дополнительные процессы для блокирования их выполнения, пока для эффективной работы оставшихся процессов не окажется достаточно памяти. В конечном счете с освобождением памяти завершается достаточное количество процессов, и заблокированные процессы могут возобновить свое выполнение. Однако, даже если памяти недостаточно, заблокированным процессам спустя примерно 20 секунд разрешено возобновить выполнение. Обычно состояние пробуксовки возвратится, что потребует выбрать для блокирования некоторые другие процессы (или предпринять административные действия для снижения загрузки).
- 08/09/2010 09:38 - Переключение контекста на низком уровне
- 01/09/2010 07:22 - Состояние потока
- 01/09/2010 05:13 - Переключение контекста
- 28/08/2010 04:32 - Структура потока
- 27/08/2010 20:18 - Структура процесса
- 17/08/2010 04:44 - Многозадачное программирование
- 14/08/2010 01:10 - Введение в управление процессами
- 13/08/2010 12:27 - Учет использования ресурсов
- 10/08/2010 06:42 - Ограничения ресурсов
- 05/08/2010 21:50 - Приоритеты процессов