Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Емельянов.doc
Скачиваний:
12
Добавлен:
03.11.2018
Размер:
3.25 Mб
Скачать

Программные потоки

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

212

можности управления с помощью изменения приоритетов потоков или, на­пример, снять большую нагрузку на приложение, распределив ее между по­токами.

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

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

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

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

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

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

213

как базовый (base priority). Базовый приоритет может изменяться от 0 до 31. Для потоков можно использовать приоритеты от 0 до 15, если процесс не имеет приоритета realtime_priority_class. В табл. 16 приводятся ос­новные сведения по приоритетам процессов.

Таблица 16

Класс приоритета

Наименование

Основной приоритет

IDLE PRIORITY CLASS

Пассивный (фоновый)

4

NORMAL_PRIORITY_CLASS

Нормальный

7 (фоновый), 9 (переднего плана)

HIGH PRIORITY CLASS

Высокий

13

REALTIME PRIORITY CLASS

Реального времени

24

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