ЗНАЕТЕ ЛИ ВЫ?

Список процессов и список потоков данного процесса, затем устанавливается приоритет



Процесса, создается структура, используемая частью Win32, которая работает в режиме ядра,

и т.д.;

Запускается первичный поток, для чего формируются его начальный контекст и стек, и

Выполняется запуск стартовой процедуры потока режима ядра KiThreadStartup. После этого

стартовый код из библиотеки C/C++ передает управление функции main() запускаемой

Программы.

Завершение процесса в Windows

Процесс завершается если:

— Входная функция первичного потока возвратила управление.

— Один из потоков процесса вызвал функцию ExitProcess.

— Поток другого процесса вызвал функцию TerminateProcess.

— Когда процесс завершается, все User- и GDI-объекты, созданные процессом, уничтожаются,

Объекты ядра закрываются (если их не использует другой процесс), адресное пространство

Процесса уничтожается. Рассмотрим, как это реализуется на практике.

Жизненный цикл потока в Windows

Каждый новый процесс содержит, по крайней мере, один поток Потоки составляют основу

планирования

Готовность. У нити есть все для выполнения, но не хватает только процессора.

Первоочередная готовность (standby). Для каждого процессора системы выбирается одна

Нить, которая будет выполняться следующей.

Выполнение. Как только происходит переключение контекстов, нить переходит в состояние

Выполнения и находится в нем до тех пор, пока либо ядро не вытеснит ее.

Ожидание. Нить по своей инициативе ожидает некоторый объект для того, чтобы

синхронизировать свое выполнение; операционная система (например, подсистема ввода-

вывода) может ожидать в интересах нити; подсистема окружения может непосредственно

Заставить нить приостановить себя.

Переходное состояние. Нить готова к выполнению, но ресурсы, которые ей нужны, заняты.

Завершение. Когда выполнение нити закончилось, она входит в состояние завершения.

Находясь в этом состоянии, нить может быть либо удалена, либо не удалена.

Код ядра выполняется в контексте текущего потока. Это означает, что при прерывании,

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

ОС, переключения на другой поток (например, системный) не происходит. Контекст потока при

Этом сохраняется, поскольку операционная система все же может принять решение о смене

характера деятельности и переключении на другой поток. Вследствие этого состояние "Выполнение"

разделяют на "Выполнение в режиме пользователя" и "Выполнение в режиме ядра.

Поэтому у каждого потока два стека, один работает в режиме ядра, другой - в режиме

Пользователя. Один и тот же стек не может использоваться и в режиме пользователя, и в режиме

Ядра. Любой поток может делать все что угодно со своим собственным стеком (стеком режима

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

Сам может определять размер своего стека.

Внутреннее устройство потоков в Windows

Объект-нить имеет следующие атрибуты :

— Идентификатор клиента - уникальное значение, которое идентифицирует нить при ее

Обращении к серверу.

— Контекст нити - содержит текущее состояние регистров, стеков и индивидуальной области

Памяти, которая используется подсистемами и библиотеками.

— Динамический приоритет - значение приоритета нити в данный момент.

— Базовый приоритет - нижний предел динамического приоритета нити.

— Процессорная совместимость нитей - перечень типов процессоров, на которых может

Выполняться нить.

— Время выполнения нити - суммарное время выполнения нити в пользовательском режиме и в

Режиме ядра, накопленное за период существования нити.

— Состояние предупреждения - флаг, который показывает, что нить должна выполнять вызов

Асинхронной процедуры.

— Счетчик приостановок - текущее количество приостановок выполнения нити.

Алгоритмы планирования потоков в Windows

В ОС Windows реализовано вытесняющее приоритетное планирование, когда каждому потоку

Присваивается определенное числовое значение - приоритет, в соответствии с которым ему

выделяется процессор. Потоки с одинаковыми приоритетами планируются согласно алгоритму

Round Robin (карусель).

В системе предусмотрено 32 уровня приоритетов. Шестнадцать значений приоритетов (16-31)

Соответствуют группе приоритетов реального времени, пятнадцать значений (1-15) предназначены

Для обычных потоков, и значение 0 зарезервировано для системного потока обнуления страниц .

Класс приоритета для всех потоков конкретного процесса можно задать с помощью набора

констант-параметров функции SetPriorityClass, которые могут иметь следующие значения:

• реального времени (REALTIME_PRIORITY_CLASS),

• высокий (HIGH_PRIORITY_CLASS),

• выше нормы (ABOVE_NORMAL_PRIORITY_CLASS),

• нормальный (NORMAL_PRIORITY_CLASS),

• ниже нормы (BELOW_NORMAL_PRIORITY_CLASS)

• неработающий (IDLE_PRIORITY_CLASS).

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

— Пользовательские потоки работают с приоритетами от 1 до 15. Устанавливая приоритеты

Процесса и потока, пользователь может отдавать преимущество тому или иному потоку.

Нулевой поток работает в фоновом режиме и съедает все процессорное время, на которое

Больше никто не претендует. Его работа заключается в обнулении страниц для менеджера

Памяти. Если и у этого потока нет работы, работает пустой поток. Однако он не является

Полноценным потоком.

— Со временем для улучшения производительности системы в базовом алгоритме планирования

Было сделано несколько усовершенствований. При определенных условиях текущий

Приоритет пользовательского потока может быть поднят операционной системой выше

Базового приоритета, но никогда не может быть установлен выше приоритета 15. Для потоков

С приоритетами 15 и выше никогда не делается никаких изменений приоритета.

— Приоритет потока увеличивается:

Когда завершается операция ввода-вывода и освобождает ожидающий ее поток, приоритет

Потока увеличивается, чтобы дать шанс этому потоку быстрее запуститься и снова запустить

Операцию ввода-вывода. Суть в том, чтобы поддерживать занятость устройств ввода-вывода.

Величина, на которую увеличивается приоритет, зависит от устройства ввода-вывода. Как

Правило, это 1 для диска, 2 для последовательной линии, 6 для клавиатуры и 8 для звуковой

Карты.

Если поток ждал семафора, мьютекса или другого события, то когда он отпускается, к его

приоритету прибавляется две единицы, если это поток переднего плана (то есть процесс,

Управляющий окном, которому в данный момент направляется ввод с клавиатуры), и одна

Единица в противном случае.

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

два потока работают вместе в задаче типа "производитель-потребитель". Работа

производителя труднее, поэтому он получает более высокий приоритет, например 12, а

Потребитель получает приоритет 4. В определенный момент производитель заполняет до

Отказа общий буфер и блокируется на семафоре

Прежде чем потребитель снова получит шанс поработать, посторонний процесс с

Приоритетом 8 приходит в состояние готовности и получает управление. Этот поток сможет

Работать столько, сколько захочет, так как его приоритет выше приоритета потребителя, а

Производитель, хоть и с большим приоритетом, заблокирован. При таких условиях

Производитель никогда снова не получит управления, пока поток с приоритетом 8 не

Остановится.

В операционной системе Windows 2000 эта проблема решается при помощи большой кувалды.

Система следит, сколько времени прошло с тех пор, когда готовый к работе поток запускался в

Последний раз. Если какой-либо поток превысит определенный интервал времени, он получает на

Два кванта времени приоритет 15. Это может помочь разблокировать производителя. После двух

Квантов прибавка приоритета резко убирается. Вероятно, лучшим решением было бы наказывать

Потоки, которые полностью используют свои кванты снова и снова. В конце концов, проблему

Создает не поток, умирающий от голода, а жадный поток. Эта проблема хорошо известна под





Последнее изменение этой страницы: 2016-08-16; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.236.156.32 (0.008 с.)