logo search
ZH ос 20 вопр 36 стр

9. Динамическое повышение приоритета потока.

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

  1. После завершения операций ввода/вывода.

  2. По окончанию ожидания какого-либо события.

  3. При пробуждении GUI потоков при выполнении операций с окнами.

  4. Если поток готов к выполнению, но не хватает времени процессора.

Динамическое повышение приоритета потока предназначено для оптимизации общей пропуск-ной способности и повышения производительности системы. ОС Windows никогда динамически не повышает приоритет потоков диапазона RealTime (то есть от 16 до 31).

  1. Динамическое изменение приоритета после завершения операций ввода/вывода. Величина динамического приращения определяется драйверами.

Устройство

Приращение приоритета

HDD, CD-ROM, принтер, видеокарта

1

Сеть, почтовый ящик, именованный канал, устройства на COM

2

Клавиатура, мышь

6

Звуковая плата

8

Приоритет потока всегда повышается относительно базового уровня.

приоритет

квант

Снижение приоритета по

истечению кванта

п овышение

приоритета

по окончании

ожидания

выполнение приоритет снижается

до базового

вытеснение

базовый

уровень выполнение ожидание

выполнение

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

  1. По окончанию ожидания какого-либо события. Действует аналогично пункту 1.

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

  3. Дин. Повыш. Приор. при нехватке процесс-го времени. Рассмотрим следующую ситуацию. Поток с приоритетом 7 постоянно вытесняет поток с приоритетом 4, не давая ему использовать процессор. Поток с приоритетом 11 ожидает какой-либо ресурс, заблок-ый потоком с приоритетом 4. Windows выполняет следующее.

Раз в секунду Windows сканирует очередь готовых потоков и ищет потоки, которые находятся в состоянии готовности более 300 тактов системного таймера, то есть 3-4 секунды. Обнаружив такой поток, Windows повышает его приоритет до 15, а Windows 2000 предоставляет ещё двойной квант времени. По истечению предоставленного кванта приоритет потока уменьшается до исходного уровня. Такая система имеет следующие ограничения.

10. Синхронизация процессов и потоков. Объекты синхронизации.

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

В режиме ядра для синхронизации используются следующие объекты: события, семафоры, мьютексы. В Windows 2000 появился новый объект – ожидающ. таймер.

Cинхронизация может выполняться с помощью таких объектов ядра, как процессы, потоки, задания, файлы. Оповещение об изменениях файловой системы, CON ввод/вывод. Синхронизация используется для единоличного доступа к ресурсам и для оповещения о каких-либо событиях, например, когда необходима синхронизация – это работа с базой данных. В тот момент, когда происходит запись, то другие операции должны быть заблокированы.

Проги Win32 должны быть готовы к тому, что процессор перекл. на другую прогу в самый неподходящий момент. Кроме того, прав-но созданная прога не должна тратить время проца, вращаясь в цикле опроса и ожидая некотор. Соб-е. Win32 им. 4 осн-ых объекта синхр-ии: событие, семафор, взаимоискл. (mutex), крит. секция.

Объект mutex. CreateMutex(…). Объект ядра мьютекс хранит идентификатор потока, занявшего этот объект, поэтому освободить объект мьютекс может только тот поток, который его занял. Объекты мьютекс допускают рекурсивный вход.

Объект семафор. CreateSemaphore(…). Имеют счётчик числа ресурсов – это максимально возможное число этого ресурса, и текущий счётчик. Доступ к ресурсам возможен до тех пор, пока текущий счётчик меньше максимального. Функции WaitForSingleObject(…), WaitForMultipleObject(…) увеличивают на 1 единицу текущий счётчик ресурса. Функция ReleaseSemaphore(…) уменьшает на 1 единицу счётчик.

Объект событие. Используется для оповещения об окончании какой-либо операции. Существуют два типа событий: события со сбросом вручную и с автоматическим сбросом. Сброс – это перевод события в занятое состояние, то есть в состояние non-signaled. CreateEvent(…). В качестве параметров указываются имя события, тип и начальное состояние.

Критические секции используются для синхронизации потоков одного процесса. Создаются критические секции обычно в области глобальных переменных, доступные всем потокам процесса. При создании, критическая секция представляет структуру данных: Critical_Section cs1; Обычно сост. из след-их полей: счётч. Блок-ок, счётч. рекурсий, идент-ра потока, кот. владеет критич. секцией в дан. мом-т t.

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

InitializeCriticalSection(&cs1);

Delete CriticalSection(&cs1) – удаление критической секции.

EnterCriticalSection(&cs1) – вход в критическую секцию.// обработка данных\\

LeaveCriticalSection(&cs1) – выход из критической секции.

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