Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен по ОС_Ответы.doc
Скачиваний:
51
Добавлен:
24.09.2019
Размер:
926.72 Кб
Скачать

7) Функциональные возможности многозадачности в ос Windows. (способы использования многозадачности, решаемые задачи)

Многозадачность в Windows.

MSDN: Platform SDK documentation/base services/dll processes and threads

В Windows имеется 2 способа использования многозадачности: многозадачность на уровне процессов и на уровне потоков.

Если требуется изоляция адресного пространства и ресурсов, используется многозадачность на уровне процессов.

Пример: системные службы Windows – автономные процессы. Крах системной службы не приводит к краху других процессов.

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

  1. управление вводом из нескольких окон (IE, который для каждой папки создаёт отдельный поток);

  2. управление вводом из нескольких коммуникационных устройств (например, сервер, обслуживающий подключенных клиентов отдельными потоками);

  3. различение задач различного приоритета (например, выполнение критичных по времени задач высокоприоритетным потоком);

  4. сохранение интерактивности приложения при выполнении фоновой задачи.

Реализация многозадачности с использованием одного процесса и нескольких потоков предпочтительна по следующим соображениям:

  1. более быстрое переключение контекста между нитями одного процесса;

  2. нити одного процесса разделяют глобальные переменные;

  3. нити одного процесса разделяют описатели системных ресурсов HANDLE (в Windows).

Win32API обеспечивает альтернативные нитям методы многозадачности:

  • асинхронный ввод/вывод;

  • порты завершения ввода/вывода (I/O Completion Port);

  • асинхронный вызовы процедур (APC);

  • возможность ожидать множества коммуникационных событий с использованием WaitForMultipeObjects().

Данные способы более быстрые, чем использование нескольких нитей, каждой ожидающей своего события с WaitForSingleObject().

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

8) Планировщик ос Windows. (класс и уровень приоритета, переключение контекста, «неготовые» потоки, динамический приоритет)

В документации MSDN не описывается конкретный алгоритм планирования, он может изменяться в разных версиях ОС. Основными средствами, влияющими на алгоритм планирования в API, является класс и уровень приоритета (Class и Level).

Класс указывается при создании процесса (используется функция CreateProcess()). Существует 6 классов приоритета:

  • IDLE_PRIORITY_CLASS – самый низкий уровень приоритета, его имеют хранители экрана, средства сбора диагностики.

  • BELOW_NORMAL_ PRIORITY_CLASS

  • NORMAL_ PRIORITY_CLASS – приоритет по умолчанию.

  • ABOVE_NORMAL_ PRIORITY_CLASS – приоритет по умолчанию.

  • HIGH_PRIORITY_CLASS – приоритет, непосредственно работающий с оборудованием.

  • REALTIME_PRIORITY_CLASS – более приоритетен, чем многие системные потоки, работает с диском, клавиатурой и мышью.

Класс приоритета определяется и задается с помощью функций GetPriorityClass() и SetPriorityClass().

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

Внутри процесса устанавливаются относительные приоритеты для нитей (уровни приоритета, levels):

  • THREAD_PRIORITY_IDLE

  • THREAD_PRIORITY_LOWEST

  • THREAD_PRIORITY_BELOW_NORMAL

  • THREAD_PRIORITY_NORMAL

  • THREAD_PRIORITY_ABOVE _NORMAL

  • THREAD_PRIORITY_HIGHEST

  • THREAD_PRIORITY_TIME_CRITICAL

Уровень приоритета нити определяется и задается с помощью функций GetThreadPriority() и SetThreadPriority().

Всем нитям по умолчанию назначается нормальный уровень приоритета.

Если возникает необходимость задать уровень приоритета при создании нити, то последовательность действий:

CreateThread(CREATE_SUSPE NDED)

SetThreadPriority(…)

ResumeThread(…)

Диспетчер системы планирует нити и ничего не знает о процессах, поэтому класс приоритета и уровень комбинируется в базовый приоритет. Windows использует 32 базовых приоритета (от 0 до 31).

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

Windows использует следующую последовательность шагов:

  1. сохранить контекст только что завершившегося потока;

  2. поместить этот поток в очередь соответствующего приоритета;

  3. найти очередь наибольшего приоритета, содержащую готовые потоки;

  4. удалить дескриптор потока из головы этой очереди, загрузить контекст, приступить к исполнению.

Структуры данных планировщика:

Потоки, не являющиеся готовыми:

  1. потоки, созданные флагом SUSPENDED;

  2. остановленные командой SuspendThread();

  3. ожидающие события синхронизации (WaitFor…Object) или ввод/вывод.

Причины вытеснения текущего потока:

  1. истёк квант времени;

  2. появился более приоритетный готовый поток;

  3. ожидание события или ввод/вывод.

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

Windows кратковременно повышает приоритеты простаивающих готовых потоков.(Priority Boost) в случае, когда:

  1. процесс, содержащий поток, переходит на передний план.

  2. окно процесса получает событие от мыши и клавиатуры

  3. наступило событие, которое ожидал поток или завершился ввод/вывод.

Также Windows может увеличить квант времени потока.

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

Priority Boost получают потоки с базовым приоритетом, не превышающим 15.