Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОС архив / Лекция 5

.doc
Скачиваний:
85
Добавлен:
09.06.2015
Размер:
80.9 Кб
Скачать

Лекция 5.

Планирование и диспетчеризация потоков. Динамическое и статическое планирование. Вытесняющие и невытесняющие алгоритмы планирования. Алгоритмы планирования, основанные на квантовании. Алгоритмы планирования, основанные на приоритетах. Планирование в ОС Windows.

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

Планирование потоков включает в себя решение двух задач:

  • Определение момента времени для смены текущего активного потока;

  • Выбор для выполнения потока из очереди готовых потоков.

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

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

Другой тип планирования – статический – может быть использован в специализированных системах, в которых весь набор одновременно выполняемых задач определен заранее (например, в системах реального времени). Планировщик называется статическим (предварительным планировщиком), если он принимает решения не во время работы системы, а заранее (off-line). Для планирования статическому планировщику нужны как можно более полные предварительные знания о характеристиках набора задач: максимальном времени выполнения каждой задачи, ограничениях предшествования, ограничениях по предельным срокам выполнения и т.п.

Накладные расходы ОС при статическом планировании ниже, чем при динамическом, так как решения принимаются не во время работы операционной системы, а заранее. Фактически ОС в этом случае затрачивает время лишь на диспетчеризацию потоков/процессов.

Диспетчеризация заключается в реализации найденного в результате планирования (динамического или статического) решения, о есть в переключении процессора с одного потока на другой. Диспетчеризация сводится к следующему:

  • сохранение контекста текущего потока, который требуется прервать;

  • загрузка контекста нового потока, выбранного в результате планирования;

  • запуск нового потока на выполнение.

Все множество алгоритмов планирования можно разделить на два класса: вытесняющие и невытесняющие алгоритмы.

Невытесняющие (non-preemptive) алгоритмы планирования основаны на том, что активному потоку позволяется выполняться, пока он сам, по собственной инициативе, не отдаст управление операционной системе для того, чтобы та выбрала из очереди другой готовый к выполнению поток.

Вытесняющие (preemptive) алгоритмы – это способы планирования, в которых решение о переключении процессора с выполнения одного потока на выполнение другого потока принимается операционной системой, а не активной задачей.

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

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

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

При определенных условиях невытесняющие алгоритмы могут оказаться более эффективными, поскольку:

  • исключаются нерациональные прерывания программ в «неудобные» для них моменты времени;

  • легко разрешаются проблемы совместного использования данных, так как задача Вов время выполнения может быть уверена, что в это время никто другой не изменит данные;

  • повышается скорость переключения с потока на поток.

Практически во всех современных ОС (UNIX, Linux, Windows) реализованы вытесняющие алгоритмы планирования потоков (процессов). Примером эффективного использования невытесняющего планирования являются ОС NetWare 3.x и 4.x., ориентированных на высокую скорость выполнения файловых операций.

В основе многих вытесняющих алгоритмов планирования лежит концепция квантования. В соответствии с этой концепцией каждому потоку поочередно для выполнения предоставляется непрерывный период процессорного времени – квант. Смена активного потока происходит, если:

  • поток завершился и покинул систему;

  • произошла ошибка;

  • поток перешел в состояние ожидания;

  • исчерпан квант процессорного времени, отведенный данному потоку.

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

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

Предположим, что всем потокам предоставляются кванты одинаковой длины Q. Если в системе N потоков, то время, которое поток проводит в ожидании следующего кванта, можно грубо оценить как Q(N-1). Чем больше потоков в системе, тем больше время ожидания и тем меньше возможности вести одновременную интерактивную работу нескольким пользователям. Для того, чтобы пользователь не ощущал дискомфорта от присутствия в системе других пользователей, необходимо выбирать величину кванта очень небольшой. Типичное значение кванта в системах разделения времени составляет десятки миллисекунд.

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

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

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

Такая ситуация продемонстрирована на рис. 5.1. Поток A, выбранный для выполнения ранее, полностью исчерпал свой квант времени и переведен в другую очередь. Планировщик выберет для выполнения поток B, затем C.

Рис. 5.1. Квантование с предпочтением потоков, интенсивно обращающихся к вводу-выводу.

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

В различных ОС приоритет выражается по-разному. Он может быть целым и дробным, положительным и отрицательным. В некоторых ОС приоритет потока тем выше, чем больше число, в других – наоборот.

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

Во многих ОС предусматривается возможность изменения приоритетов в течение жизни потока. Изменение приоритета может происходить по инициативе самого потока, когда он обращается с соответствующим системным вызовом к ОС, или по инициативе пользователя, когда он выполняет соответствующую команду. Кроме того, ОС сама может изменить приоритеты потоков в зависимости от ситуации, складывающейся в системе. В последнем случае приоритеты называются динамическими в отличие от неизменных, фиксированных приоритетов.

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

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

Рис. 5.2. Приоритетное планирование

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

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

Во многих операционных системах алгоритмы планирования построены с использованием как концепции квантования, так и приоритетов. Например, в основе планирования лежит квантование, но величина кванта и/или порядок выбора потока из очереди готовых определяется приоритетами потоков. Возможен вариант, когда приоритет при этом будет меняться в зависимости от того, использовал поток квант времени полностью или нет.

Например, операционная система Windows использует квантование в сочетании с динамическими абсолютными приоритетами. Рассмотрим механизм планирования в Windows подробнее.

В Windows предусмотрено 32 уровня приоритетов – от 0 до 31. Эти значения группируются следующим образом:

  • шестнадцать уровней реального времени (16-31);

  • пятнадцать динамических уровней (1-15);

  • один системный уровень (0), зарезервированный для потока обнуления страниц (zero page thread).

Уровни приоритета потока назначаются с учетом двух разных точек зрения: Windows API и ядра Windows. Windows API сначала упорядочивает процессы по классам приоритета, назначенным при их создании, а затем – по относительному приоритету индивидуальных потоков в рамках процессов. Существуют 6 классов процессов: Real-Time (реального времени, базовое значение 24), High (высокий, базовое значение 13), Above Normal (выше нормального, базовое значение 10), Normal (нормальный, базовое значение 8), Below Normal (ниже нормального, базовое значение 6), Idle (простаивающий, базовое значение 4). В Windows определены следующие относительные приоритеты потоков: Time-critical (критичный по времени), Highest (наивысший, +2 к приоритету процесса), Above-normal (выше нормального, +1 к приоритету процесса), Normal (нормальный, как у процесса), Below-normal (ниже нормального, -1 от приоритета процесса), Lowest (наименьший, -2 от приоритета процесса) и Idle (простаивающий). Базовый приоритет каждого потока в Windows API устанавливается, исходя из класса приоритета его процесса и относительного приоритета самого потока. Связь между приоритетами Windows API и внутренними приоритетами ядра Windows показана на рис. 5.3.

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

Начальный базовый приоритет потока наследуется от базового приоритета процесса, а тот наследует его от родительского процесса. Обычно базовый приоритет процесса по умолчанию равен значению из середины диапазонов приоритетов процессов (24,13,10,8,6 или 4). Однако базовый приоритет некоторых системных процессов несколько превышает значение по умолчанию для класса Normal. Это обеспечивает запуск потоков этих процессов с приоритетом выше 8.

Рис. 5.3. Взаимосвязь приоритетов в ядре и Windows API.

Каждый поток в Windows выполняется в течение отведенного ему кванта времени. По его окончании Windows проверяет, ожидает ли выполнения другой поток с таким же уровнем приоритета. Если на момент истечения кванта других потоков с тем же уровнем приоритета нет, Windows выделяет текущему потоку еще один квант.

По умолчанию в Windows 2000 и XP потоки выполняются в течение 2 интервалов таймера, а в системах Windows Server – 12. Это сделано для того, чтобы в серверных системах уменьшить расходы на переключение контекста. Величина кванта для каждого процесса хранится в блоке процесса ядра и используется, когда потоку предоставляется новый квант. Когда поток выполняется, его квант уменьшается по истечении каждого интервала таймера, и в конечном счете срабатывает алгоритм обработки завершения кванта – происходит момент планирования потоков.

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

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

выполняющийся поток может быть вытеснен потоком с более высоким приоритетом. Это может произойти, если:

  • завершилось ожидание потока с более высоким приоритетом (т. е. произошло событие, которого он ждал);

  • приоритет потока увеличился или уменьшился.

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

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

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

  • после завершения операции ввода-вывода;

  • после окончания ожидания на событии или семафоре исполнительной системы;

  • по окончании операции ожидания потоками активного процесса;

  • при пробуждении GUI-потоков из-за операций с окнами;

  • если поток, готовый к выполнению, задерживается из-за нехватки процессорного времени.

По завершении операций ввода-вывода Windows повышает приоритет потока на величину, зависящую от устройства ввода-вывода. Например, после операций ввода-вывода с диском или CD-ROM приоритет увеличивается на 1, после сетевых операций – на 2. Операции с мышью и клавиатурой увеличивают приоритет на 6. Приоритет потоков, владеющих окнами, повышается на 2 уровня после их пробуждения из=за активности подсистемы управления окнами, например, при получении оконных сообщений.

Приоритет всегда повышается относительно базового, а не текущего уровня. Независимо от приращения приоритет потока никогда не будет больше 15. Иными словами, если к потоку с базовым приоритетом 14 применить динамическое повышение на 6 уровней, его приоритет возрастет лишь до 15.

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

Соседние файлы в папке ОС архив