Программное обеспечение САПР. Операционные системы. Майстренко Н.В - 27 стр.

UptoLike

Лабораторная работа 5
ПОТОКИ
Цель работы: получение практических навыков по использованию Win32 API для исследования потоков
ОСНОВНЫЕ ПОЛОЖЕНИЯ
Дескрипторы и идентификаторы потоков
Функция CreateProcess возвращает идентификатор и дескриптор первого (и только первого) потока, выполняющегося во
вновь созданном процессе. Функция Create Thread тоже возвращает идентификатор потока, но область действия которого
вся система.
Поток может использовать функцию GetCurrentThreadId, чтобы получить собственный ID. Функция GetWindowThread-
ProcessId возвращает идентификатор того потока, который создал конкретное окно.
Согласно документации Win32, Win32 API не предлагает способа для получения дескриптора потока по его идентифи-
катору. Если бы дескрипторы можно было находить таким образом, то процесс, которому принадлежат потоки, завершался
бы неудачей, так как другой процесс смог бы выполнять несанкционированные операции с его потоками, например, приос-
танавливать поток, возобновлять его действие, изменять приоритет или завершать его работу. Запрашивать дескриптор сле-
дует у процесса, создавшего данный поток, или у самого потока.
Наконец, поток может вызывать функцию GetCurrentThread для получения собственного псевдодескриптора. Как и в
случае псевдодескрипторов процессов, псевдодескриптор потока может использоваться только для вызова процесса и не
может наследоваться. Можно использовать функцию Duplicate Handle для получения настоящего дескриптора потока по его
псевдодескриптору так же, как это делается в процессах.
Приоритет потоков
Термин многозадачность или мультипрограммирование обозначает возможность управлять несколькими процессами
(или несколькими потоками) на базе одного процессора. Многопроцессорной обработкой называется управление некоторым
числом процессов или потоков на нескольких процессорах.
Компьютер может одновременно выполнять команды двух разных процессов только в многопроцессорной среде. Одна-
ко даже на одном процессоре с помощью переключения задач можно создать впечатление, что одновременно выполняются
команды нескольких процессов.
В старой, 16-разрядной, Windows существовал только один поток. Более того, в данной системе был реализован метод
кооперативной многозадачности, который состоит в том, что каждое приложение само отвечает за высвобождение единст-
венного системного потока, после чего могут выполняться другие приложения. Если программа выполняла задачи, требую-
щие значительного времени, такие как форматирование гибкого диска, все другие загруженные приложения должны были
ждать.
Уровни приоритета потоков. Win32 значительно отличается от Win16. Во-первых, она является многопоточной (mul-
tithreaded), что определяет ее многозадачность. Во-вторых, в ней реализована модель вытесняющей многозадачности, в ко-
торой операционная система решает, когда каждый поток получает процессорное время, выделяемое квантами времени, и
сколько именно времени выделяется. Временной интервал в Windows называется квантом.
Продолжительность кванта времени зависит от аппаратуры и может фактически меняться от потока к потоку. Напри-
мер, базовое значение в Windows 95 составляет 20 мс, для Windows NT Workstation (на базе процессора Pentium) – 30 мс, для
Windows NT Server – 180 мс.
Рассмотрим, каким образом Windows выделяет кванты времени потокам в системе. Эти процедуры в Windows 9x и
Windows NT довольно похожи, но не идентичны.
Каждый поток в системе имеет уровень приоритета, который представляет собой число в диапазоне 0...31. Необходимо
отметить следующее:
1. Если существуют какие-либо потоки с приоритетом 31, которые требуют процессорного времени, т.е. не находятся в
состоянии ожидания (not idle), операционная система перебирает эти потоки (независимо от того, каким процессам они при-
надлежат), выделяя по очереди каждому из них кванты времени. Потокам с более низким приоритетом кванты времени со
всем не выделяются, поэтому они не выполняются. Если нет активных потоков с приоритетом 31, операционная система
ищет активные потоки с уровнем приоритета 30 и т.д. Не следует забывать, однако, что потоки довольно часто простаивают.
Тот факт, что приложение загружено, не означает, что все его потоки активны. Поэтому у потоков с более низким приорите-
том все же есть возможность работать. Более того, если пользователь нажимает клавишу, относящуюся к процессу, потоки
которого простаивают, операционная система временно выделяет процессорное время соответствующему потоку, чтобы он мог
обработать нажатие клавиши.
2. Приоритет 0 зарезервирован исключительно за специальным системным потоком, который называется потоком ну-
левой страницы (zero page thread). Он освобождает незадействованные области памяти. Существует также поток idle, кото-
рый работает с уровнем приоритета 0, опрашивая систему в поисках какой-нибудь работы.
3. Если поток с произвольным приоритетом выполняется в тот момент, когда потоку с большим приоритетом потребо-
валось процессорное время (например, он получает сообщение о том, что пользователь щелкнул мышью), операционная сис-
тема немедленно вытесняет поток с меньшим приоритетом и отдает процессорное время потоку с большим. Таким образом,
поток может не успеть завершить выделенный ему квант времени.
4. Для того чтобы перейти с одного потока на другой, система осуществляет переключение контекста (context switch).
Это процедура, сохраняющая состояние процессора (регистров и стека) и загрузки соответствующих значений другого пото-
ка.