Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_OS_chast_2.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.55 Mб
Скачать

Планирование потоков. Приостановка и возобновление процессов и потоков.

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

В версиях системы Windows 2000 и далее примерно каждые 18мс в системе просматриваются все существующие объекты ядра типа «поток», и отмечаются те из них, которые готовы получить процессорное время. Далее, в соответствии с принятым алгоритмом, выбирается один из них, и из его контекста загружаются регистры процессора. Данная операция называется переключением контекста потока. Затем, в течение интервала квантования, программа потока выполняется в адресном пространстве своего процесса. По окончании этого интервала, система сохраняет состояния регистров процессора в структуре CONTEXT данного потока, и приостанавливает его выполнение. Затем снова просматриваются все объекты ядра типа поток, выбирается один из них на основе алгоритма дисциплины распределения процессорного времени, в процессор загружается его контекст, и начинается выполнение программы этого потока, либо продолжение выполнения программы ранее прерванного потока.

Подобный цикл операций, включающий:

  1. выбор потока для запуска;

  2. загрузку его контекста;

  3. исполнение программы потока в процессоре в течение интервала квантования;

  4. сохранение контекста;

начинается с момента запуска системы вплоть до её выключения.

Из приведенного общего описания алгоритма распределения процессорного времени между потоками следует, что в режиме вытесняющей многозадачности в системе в каждый момент времени присутствуют потоки следующих типов:

  1. выполняющиеся в процессоре;

  2. планируемые к выполнению;

  3. приостановленные системой;

  4. ожидающие возникновения каких-либо событий.

В объекте ядра «поток» имеется системная переменная SUSPENDCOUNT, которая называется счетчиком числа простоев данного потока. Если его значение равно нулю, то соответствующий поток приостанавливается, и не получает процессорного времени. При вызове функций CreateProcess () и CreateThread () эта переменная инициализируется единицей, которая запрещает системе немедленно выделять новому потоку процессорное время, поскольку требуется его инициализация. После выполнения инициализации проверяется состояние одного из флагов функции создания потока CreateThread, а именно P5. Если он равен единице, то поток оставляется в приостановленном состоянии. Если этот флаг сброшен, то SUSPENDCOUNT обнуляется, и поток включается в число планируемых к выполнению в процессоре.

Новый поток может быть изначально создан как приостановленный, если упомянутый флаг имеет исходное значение единицы. В этом случае, в системе имеется возможность изменить какие-либо свойства потока, например, его приоритет. После подобной настройки потока, ему может быть разрешено выполнение в процессоре. В этом случае, реализуется процедура возобновления потока. С этой целью в системе используется функция ResumeThread (), в которую в качестве параметра передается дескриптор потока, возвращаемый функцией создания потока. Если поток ожидает наступления какого-либо внешнего события, например, ввода данных с клавиатуры, то он будет находиться в этом состоянии, называемом состоянием блокирования, до момента возникновения этого события. Затем поток снова включается в число планируемых к выполнению.

Поток может быть приостановлен не только в момент его создания, но и в ходе свого выполнения. Для этого используется системная функция SuspendThread (). Параметром функции является описатель приостанавливаемого потока. Эта функция может быть вызвана из любого другого потока, если известен его описатель. Поток может быть приостановлен не более чем устанавливаемое в системе количество раз. С помощью функции Sleep () поток может запросить у системы возможность не выделять ему процессорное время на определенный период времени, то есть запросить возможность приостановки самого себя. Параметр – период приостановки в миллисекундах. После её выполнения поток приостанавливается, и у него отбирается остаток выделенного ему кванта процессорного времени. По окончании периода приостановки, система переводит поток в число планируемых, после чего он продолжает свое выполнение.

В системе имеется также функция SwitchToThread (), с помощью которой система может подключить процессору новый поток, если он имеется. При вызове этой функции, система проверяет, присутствует ли поток, которому хронически не хватает процессорного времени («голодание потока»). Если такого потока нет, то данная функция просто завершается. Если подобный поток обнаруживается, то ему выделяется дополнительный квант времени. При этом, с помощью данной функции может быть выделено время потоку с более низким приоритетом, чем потоки, которые до этого выполнялись в процессоре.

В системах Windows, понятия, о которых здесь шла речь, а именно – приостановка и возобновление, неприменимы к процессам, поскольку процессы в распределении процессорного времени непосредственно не участвуют. Существует лишь одна возможность приостановить одновременно все потоки какого-либо процесса. Это можно сделать из другого процесса, который является отладочным.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]