Организация многозадачности
Одним из наиболее актуальных вопросов, которые решает любая многозадачная операционная система, в том числе и системы Windows 9x, состоит в организации по возможности простого, но эффективного способа предоставления процессорного времени различным параллельно выполняющимся программам. Другими словами, речь идет о диспетчеризации задач.
Мы уже знаем, что многозадачность, в общем случае, означает способность операционной системы обеспечивать совместное использование процессора несколькими программами. Большинство разработчиков операционных систем называют работающие программы задачами, поэтому задачей можно считать загруженную в память программу, которая что-то делает. В большинстве операционных систем, в том числе и в Windows NT, и в UNIX, выполнение приложения называется процессом. Однако в уже упомянутых операционных системах Windows 3.x почти всегда использовался термин «задача», и лишь изредка — «процесс». Имейте в виду, что в операционных системах Windows 9x используется исключительно термин «процесс», а понятие задачи было официально исключено из терминологии Windows. Вкладывая совершенно такой же смысл в слово «процесс», разработчики Microsoft тем самым попытались поставить операционные системы семейства Windows 9x как бы на один уровень с другими операционными системами, такими, например, как Windows NT. В большей части документации по Windows 3.1 мы можем обнаружить оба упомянутых слова. Основная причина изменения терминологии — реализация мультизадачности при сохранении мультипрограммного режима работы. Другими словами, речь идет о поддержке в этих операционных системах возможности многопоточного выполнения приложений. Поэтому помимо отхода от термина задача и использования термина процесс, мы должны отметить, что во всех этих операционных системах стал использоваться термин поток выполнения, или тред (thread).
Напомним, что поток выполнения — это одна из ветвей вычислительного процесса. Потоку выделяется процессорное время, этим занимается диспетчер задач операционной системы, называемый планировщиком. Поток может быть создан любым работающим под управлением Windows 9x 32-разрядным приложением или виртуальным драйвером устройства. Поток имеет собственный стек и контекст
370 Глава 11. Операционные системы Windows
выполнения (а именно содержимое рабочих регистров процессора). Потоки используют память совместно с процессом-родителем. Когда Windows 95/98 загружает приложение и создает необходимые ему структуры данных, система настраивает процесс в виде отдельного потока. Потоки могут использовать весь код и глобальные данные процесса-родителя. Это означает, что создание нового потока требует минимальных затрат памяти. Один процесс может породить множество параллельно выполняющихся потоков. Многие приложения на протяжении всего времени своей работы используют единственный поток, хотя могут (а многие так и делают) использовать еще несколько потоков для выполнения определенных кратковременных операций в фоновом режиме, что позволяет либо увеличить скорость выполнения приложений, либо дать возможность пользователю выполнять следующую операцию в своей программе, не дожидаясь завершения текущей операции.
Термин «задача» мы все же будем использовать и дальше, поскольку с точки зрения распределения процессорного времени требуется все то же: выполнять вычисления, то есть выполнять некий конкретный код с конкретными данными.
В Windows 95/98 работа с потоками доступна только 32-разрядным приложениям и виртуальным драйверам устройств. Виртуальные машины MS DOS и старые 16-разрядные приложения Windows не могут обращаться к функциям API, которые поддерживают потоки. Каждая виртуальная машина MS DOS работает в отдельном потоке. Аналогично, каждое 16-разрядное приложения Windows при своем исполнении образует процесс, который использует всего один поток, что позволяет обеспечить для старых приложений Windows модель кооперативной многозадачности. Любое 32-разрядное приложение или виртуальный драйвер устройства может создавать дополнительные потоки, a Windows 95/98 может организовать диспетчеризацию всех этих потоков в соответствии с алгоритмами вытеснения, что представляет собой еще один аспект многозадачности в Windows. Несмотря на то что все эти потоки могут представлять принципиально разные типы программ, в системе они представлены в виде одинаковых структур данных. Вследствие этого диспетчер и остальной 32-разрядный системный код, использующий эти внутренние структуры данных, и удалось реализовать так, что разработчикам не понадобилось учитывать особенности преобразований 16-разрядного кода в 32-разрядный.
Как известно, в основе диспетчеризации задач ныне уже почти всеми забытой Windows 3.x лежал принцип невытесняющей, или кооперативной, многозадачности (cooperative multitasking). При работе в среде Windows 95/98 кооперативная многозадачность используется только для диспетчеризации старых 16-разрядных приложений, в то время как работа приложений Win32 планируется в соответствии с иным алгоритмом. Для 32-разрядных приложений система использует вытесняющую многозадачность (preemptive multitasking).
Поддержкой многозадачности занимается планировщик (scheduler). Он имеет дело главным образом с временем и событиями. Процессу в Windows 95/98 выделяется квант времени, который определяет, как долго данный процесс может использовать процессор. По окончании кванта времени планировщик определяет, следует
Операционные системы Windows 9x______________________________________ 371
ли передать процессор в распоряжение другого процесса. В отличие от Windows NT, Windows 95/98 не поддерживает мультипроцессорные системы, в которых планировщик может выделять процессам больше одного процессора.
Решения, принимаемые планировщиком, определяются событиями. Так, щелчок мыши является для планировщика событием. Это событие может привести к передаче процессора в распоряжение процесса, «владеющего» окном, в котором произошел щелчок. Впрочем, планировщик может решить, что завершение передачи данных по сети заслуживает большего внимания, чем щелчок мыши, и тогда процессор будет передан в распоряжение процесса, обслуживающего сеть, а всем остальным процессам придется подождать.
Как мы знаем, при вытесняющем планировании только система может решать, в каком порядке, как долго и какие задачи (в нашем случае — потоки) будут выполняться. Планировщик может в любой момент отнять процессор у одного из потоков выполнения и передать его в распоряжение другого. Обычно такой акт вытеснения происходит в результате реакции на событие, требующее внимания. Планировщик присваивает каждому из работающих процессов приоритет (priority). Потоки его наследуют, хотя при создании нового потока ему можно задать и иной приоритет. В случае если происходит событие, относящееся к потоку, обладающему более высоким приоритетом, планировщик приостанавливает (вытесняет) текущий поток и начинает выполнять тот, у которого приоритет больше.
Для обеспечения гарантированного обслуживания введен механизм динамических приоритетов, при котором приоритеты потоков постоянно пересчитываются. Например, если бы системе надо было выбирать между двумя потоками, у одного из которых приоритет больше, а у другого меньше, то поток, обладающий низким приоритетом, никогда бы не смог выполняться, если бы планировщик динамически не изменял значения приоритетов. При расчете приоритетов также играет роль длительность квантов времени.
Диспетчер задач (потоков выполнения) использует следующие три механизма, с помощью которых он пытается равномерно распределять время процессора между всеми вычислениями в целях обеспечения бесперебойной и одновременно быстрой реакции системы.
- Динамическое изменение приоритета. Диспетчер на время может повысить или понизить приоритет того или иного потока. Так, например, нажатие клавиши или щелчок мыши говорит ему о том, что приоритет потока, к которому относится действие пользователя, должен быть повышен.
- Постсинхронизированное снижение приоритета. Ранее повышенное значение приоритета постепенно возвращается к исходному значению.
- Наследование приоритета. Служит для быстрого повышения приоритета. Обычно это делается для того, чтобы позволить потоку с низким приоритетом быстро закончить работу с выделенным для монопольного использования ресурсом, который необходим потокам с высоким приоритетом. Windows 95/98 восстанавливает исходное значение унаследованного приоритета сразу же после удовлетворения конфликтного условия.
372 Глава 11. Операционные системы Windows
В операционных системах семейства Windows 9x имеется два модуля для диспетчеризации потоков выполнения: основной планировщик (primary scheduler) отвечает за вычисление приоритетов потоков; планировщик квантования (timeslice scheduler) занимается расчетами, необходимыми для выделения квантов времени. По сути дела, модуль квантования решает, какой процент доступного процессорного времени какому потоку выделить. Если некий поток не получает времени на выполнение, значит, он находится в состоянии ожидания выполнения (suspended) и не будет работать, пока ситуация не изменится.
Основной планировщик просматривает все потоки выполнения и рассчитывает для каждого из них приоритет выполнения (execution priority), который представляет собой целое число, находящееся в пределах от 0 до 31. Далее он переводит в состояние ожидания выполнения все потоки, приоритет выполнения которых меньше текущего наибольшего значения, имеющегося у одного из потоков. После того как поток переведен в состояние ожидания выполнения, основной планировщик более не обращает на него никакого внимания при дальнейших вычислениях приоритетов на протяжении данного кванта времени. По умолчанию длительность кванта времени составляет 20 мс. Затем планировщик квантования рассчитывает процентную долю кванта времени, которую необходимо выделить каждому потоку. Для этого он использует значения приоритетов и информацию о текущем состоянии виртуальной машины.
После окончания выделенного потоку кванта времени планировщик перемещает его в конец очереди, состоящей из потоков с равным приоритетом. Этот классический механизм диспетчеризации, называемый карусельным, обеспечивает всем потокам, обладающим равным наивысшим приоритетом, одинаковый доступ к процессору. Если некоторый поток не занимает весь выделенный ему квант процессорного времени, диспетчер передает процессор в распоряжение следующего потока с таким же приоритетом и позволяет тому использовать остаток данного кванта времени.
Если в системе одновременно работают только 32-разрядные приложения, то более быструю реакцию системы и значительно менее конфликтный отклик программ пользователю обеспечивает так называемое упреждающее планирование. Как известно, в диалоговых системах используется событийное программирование, при котором выполнение той или иной процедуры начинается после определенного события. Сама операционная система также функционирует по этому принципу. Управляющая (супервизорная) подсистема Windows 9x просматривает направляемый ей подсистемой ввода-вывода поток сообщений, из которых она и узнает о новых событиях, таких, например, как щелчки мыши в одном из ее окон, запуск новых программ и т. д. В системах Windows 3.x все сообщения находились в одной системной очереди, вследствие чего одна некорректно работающая программа могла заблокировать поток сообщений, предназначенных всем остальным приложениям. Windows 95/98 дает системе возможность помещать сообщения, предназначенные приложениям Win32, в отдельные очереди, что снижает вероятность зависания системы в тех случаях, когда одно из приложений не обслуживает очередь сообщений должным образом.
Операционные системы Windows 9x______________________________________ 373
Дата добавления: 2016-09-20; просмотров: 1083;