Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка к лабораторным работам (рус).doc
Скачиваний:
3
Добавлен:
15.11.2018
Размер:
353.79 Кб
Скачать

1.3.7. Приоритеты потоков

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

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

Во время выполнения процесса, его приоритет можно сменить при помощи функции

BOOL SetPriorityClass(

HANDLE hProcess , // handle to process

DWORD dwPriorityClass // priority class

);

Например, для задания текущему процессу низшего приоритета необходимо выполнить:

SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);

Уровень приоритета, устанавливаемый комбинацией относительного приоритета потока и класса приоритета процесса, называют базовым уровнем приоритета потока. Иногда система или ее компоненты может повышать уровень приоритета потока. Например, если пользователь нажимает клавишу клавиатуры, то приоритет потока, которому посылается сообщение, повышается на некоторую величину (например, 2), и понижается после обработки сообщения. Понижение приоритета не может происходить ниже базового уровня. Динамическое изменение приоритета возможно только для приоритетов ниже real-time (15-и). Программист может отключить (включить) динамическое изменение приоритетов путем вызова одной из следующих функций:

BOOL SetProcessPriorityBoost( HANDLE hProcess , BOOL DisablePriorityBoost );

BOOL SetThreadPriorityBoost( HANDLE hThread, BOOL DisablePriorityBoost );

Соответственно для процесса и потока.

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

1.4. Задание на лабораторную работу

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

Вариант 1

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

Вариант 2

Программа запускает на выполнение 3 потока. Первый из них выводит на экран в цикле числа от 1 до 10000, второй от 10000 до 1, третий – разницу между числами в первом и во втором потоках. После каждого вывода поток приостанавливается на 10 мс. Кроме этого, на экран каждые 2 сек. выводится информация о времени выполнения каждого потока.

Вариант 3

Программа может создавать несколько параллельно выполняемых потоков на основе одной процедуры. Для каждого из потоков накладывается ограничение на память, которую может запросить поток. Объем памяти, выделяемый потоку, определяется случайным образом из диапазона 1-10 Мб. Каждый поток, периодически запрашивает дополнительный блок динамической памяти для объемом 0.5 Мб. Если лимит памяти для потока исчерпан, то поток снимается с выполнения основной программой. При этом память, используемая потоком, должна быть освобождена.

Вариант 4

Программа запускает на выполнение 2 потока. Каждый из них выводит на экран в цикле числа от 1 до 100 000. После каждого вывода поток приостанавливается на 10 мс. В программе можно динамически изменять уровни приоритетов каждому потоку в отдельности. На экран каждые 2 сек. выводится информация о времени выполнения каждого потока и его состоянии.

Вариант 5

Программа может запускать три потока: первый – вычисляет сумму целых чисел от 1 до 10 000, второй – сумму четных чисел от 1 000 до 20 000, третий – сумму нечетных чисел от 3 000 до 21 000. Программа автоматически определяет время, затрачиваемое на вычисление каждым из потоков, после чего динамически изменяет приоритеты потоков таким образом, чтобы минимальный по времени поток получил максимальный приоритет. Вывести на экран общее время вычислений до и после изменения приоритетов.

Вариант 6

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

Вариант 7

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

Вариант 8

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

Вариант 9

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