Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

12.1. Диспетчеризация потоков

Основным фактором, учитываемым при диспетчеризации, служит приоритет выполнения каждого потока. В Win32 каждому потоку присваивается свой приоритет - число от 0 до 31; чем больше число, тем выше приоритет. Приоритет 31 резервируется под особенно критичные операции, например, прием данных в реальном режиме времени. Приоритет 0 назначается операционной системой некоторым второстепенным задачам, выполнение которых происходит в то время, когда нет других задач. Большинство потоков работают с приоритетом в диапазоне от 7 до 11. Каждые несколько миллисекунд диспетчер операционной системы просматривает все работающие в системе потоки и передает управление в соответствии со следующими правилами:

1) процессорное время выделяется потоку с наивысшим приоритетом;

2) если потоков с одинаковым приоритетом несколько, то управление передается тому, который простаивает дольше других;

3) потоки с низким приоритетом никогда не вытесняют потоки с более высоким.

Здесь может возникнуть вопрос. Если в системе присутствует поток с приоритетом 10 и с приоритетом 9, то до выполнения потока с приоритетом 9 дело никогда не дойдет? Нет, это не так. Не забывайте, что Windows это событийная операционная система. Когда очередь сообщений потока с приоритетом 10 пуста, он переводится в состояние ожидания, до получения новых сообщений. При этом обрабатываются потоки с более низким приоритетом, а приостановленный поток не получает процессорное время до момента его активизации в ответ на какое-либо событие. Нужно сказать, что большинство потоков проводит длительное время как раз в состоянии ожидания ввода новых сообщений. В результате почти во всех случаях, кроме экстремальных, даже потоки с приоритетом 0 получают достаточно времени.

Отсюда вытекает вывод: не стоит стремиться поднять приоритет потоков собственного приложения с целью их более быстрой работы. Это, наверняка, приведет к обратному эффекту.

Бездарно написанная программа может замедлить выполнение остальных работающих приложений и всей системы в целом.

12.2. Проблемы многопоточной технологии

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

Все остальные потоки являются рабочими и служат для решения некоторых фоновых задач. Они не имеют оконных процедур и, значит, не обрабатывают сообщения операционной системы. Таким образом, рабочие потоки не выполняют задач, связанных с пользовательским интерфейсом.

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

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