На этом шаге мы рассмотрим приоритеты потоков, классы приоритетов,
а также механизм распределения процессорного времени между потоками.
На самом деле было бы наивно полагать, что все потоки, создаваемые операционной системой равноправны при распределении процессорного времени. В этом случае даже такое действие, как сохранение большого по объему документа в приложении MS Word, блокировало бы систему так, что мы бы не имели возможности даже перемещать указатель мыши. Чтобы этого не происходило, в операционной системе предусмотрены различные приоритеты для потоков. Приоритет потока - это величина, складывающаяся из двух составных частей:
Класс Real time задает приоритет даже больший, чем у многих процессов операционной системы. Такой приоритет нужен для процессов, обрабатывающих высокоскоростные потоки данных. Если такой процесс не завершится за короткое время, пользователь почувствует, что система перестала откликаться, т.к. даже обработка событий мыши не получит времени процессора.
Использование класса High ограничено процессами, которые должны завершаться за короткое время, чтобы не вызвать сбойной ситуации. Такой процесс также влияет на всю операционную систему.
Большинство процессов запускается в рамках класса с нормальным приоритетом (Normal). Нормальный приоритет означает, что процесс не требует какого-либо специального внимания со стороны операционной системы.
И, наконец, класс Idle используется фоновыми процессами. Такие процессы получают процессорное время в последнюю очередь.
Приоритеты имеют значения от 0 до 31. Процесс, породивший поток, может впоследствии изменить его приоритет; в этой ситуации программист имеет возможность управлять скоростью отклика каждого потока. Базовый приоритет потока складывается из двух составляющих, однако это не означает, что он просто равен их сумме. Значения приоритетов проиллюстрированы в таблице 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 |
Необходимо еще сказать о механизме распределения процессорного времени между потоками. Операционная система имеет различные очереди готовых к выполнению потоков - для каждого уровня приоритета свой. В момент распределения нового кванта времени она просматривает очереди - от высшего приоритета к низшему. Готовый к выполнению поток, стоящий первым в очереди, получает этот квант и перемещается в хвост очереди. Поток будет исполняться всю продолжительность кванта, если не произойдет одно из двух событий:
Исходя из этого, программист должен внимательно следить за тем, чтобы приоритет какого-либо потока не был неоправданно завышен, иначе поток, требующий длительное время для своего выполнения и получивший высокий приоритет, будет блокировать приложение вплоть до того, что оно не будет откликаться на ввод. Поэтому обычно потоку, обрабатывающему ввод, назначают самый высокий приоритет, а всем остальными - более низкий.
На следующем шаге мы рассмотрим класс TThread, реализующий потоки в среде программирования Delphi.