Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS.docx
Скачиваний:
2
Добавлен:
19.11.2019
Размер:
73.2 Кб
Скачать

1) Оказывать предпочтение коротким заданиям;

2) Оказывать предпочтение заданиям лимитируемым вводом-выводом, чтобы обеспечить

хороший коэффициент использования устройств ввода-вывода;

3) Можно быстрее определять характер задания и соответствующим образом планировать

выполнение этого задания.

Многоуровневые очереди с обратными связями представляют структуру, которая

обеспечивает достижение этих целей. Новый процесс входит в сеть очередей с конца верхней

очереди. Он перемещается по этой очереди, реализующей принцип FIFO, пока не получит в

свое распоряжение ЦП. Если задание завершается или освобождает ЦП, чтобы подождать

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

задание, выходит из сети очередей.

Если выделенные квант времени истекает до того, как процесс добровольно освободит ЦП,

этот процесс помещается в конец следующей очереди более низкого уровня.

Этот процесс в следующий раз получит в свое распоряжение ЦП, когда он достигнет начала

данной очереди, если при этом не будет ожидающих в первой очереди.

Если данный процесс будет продолжать использовать полный квант времени,

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

нижележащего уровня.

Обычно в системе предусматривается некоторая очередь самого нижнего уровня, которая

реализует принцип циклического обслуживания и в которой данный процесс циркулирует до

тех пор, пока не завершится.

Во многих структурах многоуровневых очередей с обратными связями квант времени,

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

увеличивается.

Таким образом, чем дольше находится процесс в сети очередей, тем больший квант времени

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

удается получать ЦП слишком часто, поскольку процессы, находящиеся в очередях более

высоких уровней, имеют и более высокий приоритет.

Процесс, находящийся в данной очереди, может начать выполнение только в случаев если нет

ожидающих во всех очередях более высоких уровней. Выполняющийся процесс прерывается,

если поступает новый процесс в очередь более высокого уровня.

Процессы и потоки в ОС Windows

Процесс является динамическим объектом, описывающим выполнение программы. В

Windows NT процесс – это объект, создаваемый и уничтожаемый менеджером объектов.

Процесс содержит потоки, учетную информацию и ссылки на системные ресурсы: закрытое

адресное пространство, семафоры, коммуникационные порты, файлы и т.д. Процесс

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

обобществляются всеми потоками процесса.

Задача ОС состоит в том, чтобы организовать их поддержку, которая подразумевает, что

каждый процесс получит все необходимые ему ресурсы;

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

обмениваться информацией, должны иметь возможность сделать это путем межпроцессного

взаимодействия.

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

блоком управления процессом (PCB, Process control block). Состав PCB:

идентификатор процесса;

токен доступа - исполняемый объект, содержащий информацию о безопасности;

базовый приоритет - основа для исполнительного приоритета нитей процесса;

процессорная совместимость - набор процессоров, на которых могут выполняться нити

процесса;

предельные значения квот - максимальное количество страничной и нестраничной системной

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

времени - которые могут быть использованы процессами пользователя;

время исполнения - общее количество времени, в течение которого выполняются все нити

процесса.

Создание процесса в Windows

Обычно процесс создается другим процессом вызовом Win32-функции CreateProcess. Создание

процесса осуществляется в несколько этапов:

1) на диске отыскивается нужный файл-образ, после чего создается объект "раздел" памяти для

проецирования на адресное пространство нового процесса (kernel32.dll);

2) выполняется обращение к системному сервису NtCreateProcess для создания объекта

"процесс". Формируются блоки EPROCESS, KPROCESS и блок переменных окружения PEB.

Менеджер процессов инициализирует в блоке процесса маркер доступа (копируя

аналогичный маркер родительского процесса), идентификатор и другие поля;

3) создание первичного потока (сервис NtCreateThread, библиотека kernel32.dll);

4) kernel32.dll посылает подсистеме Win32 сообщение, которое содержит информацию,

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

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

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

и т.д.;

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

выполняется запуск стартовой процедуры потока режима ядра 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) Когда завершается операция ввода-вывода и освобождает ожидающий ее поток, приоритет

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

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

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

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

карты.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

названием инверсии приоритетов

Классы приоритетов

процессов

Критичный

ко времени

Самый

высокий

Выше

нормы

Нормальный

Ниже

нормы

Самый

низкий

Неработающий

Неработающий 15 6 5 4 3 2 1

Ниже нормы 15 8 7 6 5 4 1

Нормальный 15 10 9 8 7 6 1

Выше нормы 15 12 11 10 9 8 1

Высокий 15 15 14 13 12 11 1

Реального времени 31 26 25 24 23 22 16

Жизненный путь процесса Unix / Создание процесса

Система предоставляет два различных системных вызова: один для создания процесса, а другой для

запуска новой программы.

Процесс, сделавший вызов fork() называется родительским, а вновь созданный процесс — дочерним.

Новый процесс является точной копией породившего его процесса. Новый процесс имеет те же

инструкции и данные, что и его родитель. Более того, выполнение родительского и дочернего

процесса начнется с одной и той же инструкции, следующей за вызовом fork(). Единственно, чем они

различаются — это идентификатором процесса PID. Каждый процесс имеет одного родителя, но

может иметь несколько дочерних процессов.

#include <sys/types.h>

#include <unistd.h>

pid_t fork (void);

Дочерний и родительский процесс в Unix

Атрибуты родителя:

идентификаторы пользователя и группы

переменные окружения,

диспозицию сигналов и их обработчики,

ограничения, накладываемые на процесс,

текущий и корневой каталог,

маску создания файлов,

все файловые дескрипторы, включая файловые указатели,

управляющий терминал.

Различия между родителем и потомком:

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

идентификаторы родительского процесса PPID у этих процессов различны,

дочерний процесс свободен от сигналов, ожидающих доставки

значение, возвращаемое системным вызовом fork(2) различно для родителя и потомка.

Типичное дерево процессов в Unix:

Краткая диаграмма состояний процесса в Unix:

Команды управления процессами в Unix:

UID - эффективный идентификатор владельца процесса (реальный выводится при

использовании ключа -f).

В колонке S - state (состояние) - указывается состояние процесса. Состояния бывают

следующие: O (ON PROC) - процесс находится в процессоре и выполняется; S (Sleeping) -

процесс ждет завершения события (например, ввода-вывода); R (Runnable) - процесс готов к

выполнению и ждет своего кванта в очереди к процессору; Z (Zombie) - процесс стал

<зомби>, так как завершился, а родительский процесс не подождал его завершения; T

(sTopped) - процесс остановлен по сигналу остановки или в процессе трассировки.

Идентификатор PID - уникальный идентификатор процесса, используется при передаче ему

сигналов.

PPID - идентификатор родительского процесса.

CMD - команда, которой был запущен процесс.

Основным средством управления процессами является команда kill, передающая процессу сигналы:

kill [-ключи] номер_процесса

Например, для завершения процесса sendmail можно выполнить следующие действия:

: ps auxw | grep sendmail

root 2057 0.0 0.2 2664 444 ? S Jul08 3:24 sendmail: accepting connections

kill 2057

kill 2057

kill: (2057) - No such pid

Т4. Управление памятью в ОС

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