Шаг 2.
Организация потоков в Delphi-приложениях.
Приоритеты потоков

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

    На самом деле было бы наивно полагать, что все потоки, создаваемые операционной системой равноправны при распределении процессорного времени. В этом случае даже такое действие, как сохранение большого по объему документа в приложении MS Word, блокировало бы систему так, что мы бы не имели возможности даже перемещать указатель мыши. Чтобы этого не происходило, в операционной системе предусмотрены различные приоритеты для потоков. Приоритет потока - это величина, складывающаяся из двух составных частей:

Когда поток создается, ему назначается приоритет, соответствующий приоритету породившего его процесса. В свою очередь, процессы могут иметь следующие классы приоритетов:

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

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

    Большинство процессов запускается в рамках класса с нормальным приоритетом (Normal). Нормальный приоритет означает, что процесс не требует какого-либо специального внимания со стороны операционной системы.

    И, наконец, класс Idle используется фоновыми процессами. Такие процессы получают процессорное время в последнюю очередь.

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

Таблица 1. Значения приоритетов потоков
idle priority class below normal priority class normal priority class above normal priority class high priority class realtime priority class
thread priority idle 1 1 1 1 1 16
thread priority lowest 2 4 5(B)
7(F)
8 11 22
thread priority below normal 3 5 6(B)
8(F)
9 12 23
thread priority normal 4 6 7(B)
9(F)
10 13 24
thread priority above normal 5 7 8(B)
10(F)
11 14 25
thread priority highest 6 8 9(B)
11(F)
12 15 26
thread priority time critical 15 15 15 15 15 31


    Примечание. Обозначения (B) и (F) в классе Normal означают режим работы процесса породившего поток: Background - фоновый, Foreground - режим переднего плана.

    Необходимо еще сказать о механизме распределения процессорного времени между потоками. Операционная система имеет различные очереди готовых к выполнению потоков - для каждого уровня приоритета свой. В момент распределения нового кванта времени она просматривает очереди - от высшего приоритета к низшему. Готовый к выполнению поток, стоящий первым в очереди, получает этот квант и перемещается в хвост очереди. Поток будет исполняться всю продолжительность кванта, если не произойдет одно из двух событий:

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

    На следующем шаге мы рассмотрим класс TThread, реализующий потоки в среде программирования Delphi.




Предыдущий шаг Содержание Следующий шаг