Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ТОС_2013 / ТОС_6_1_проц_слайды

.doc
Скачиваний:
8
Добавлен:
03.03.2016
Размер:
628.74 Кб
Скачать

Подсистема управления процессами

Сердцем операционной системы UNIX является подсистема управления процессами.

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

Вся функциональность операционной системы в конечном счете опреде­ляется выполнением тех или иных процессов.

Даже так называемые уровни выполнения системы (run levels) представляют собой ни что иное, как удоб­ную форму определения группы выполняющихся процессов. Возможность терминального или сетевого доступа к системе, различные сервисы, тра­диционные для UNIX, — система печати, удаленные архивы FTP, элек­тронная почта и система телеконференций (news) — все это результат вы­полнения определенных процессов.

В этой главе рассматриваются вопросы: что такое процесс в представлении операционной системы, каковы связанные с ним структуры данных, по­зволяющие UNIX осуществлять управление процессом, а также описыва­ется жизненный цикл процесса — от его создания до прекращения выпол­нения.

Процессы в UNIX неотъемлемо связаны с двумя важнейшими ресурсами системы — процессором (или процессорами) и оперативной памятью. Как правило, этих ресурсов никогда не бывает "много", и в операционной сис­теме происходит активная конкурентная борьба за право обладания процессором и памятью.

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

Основы управления процессом

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

На рис. 3.1 схематически представлены компоненты, необходимые для создания и выполнения процесса.

Процесс во время выполнения использует различные системные ресурсы -память, процессор, услуги файловой подсистемы и подсистемы ввода/вывода.

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

Новорожденная операционная система UNIX обеспечивала выполнение всего двух процессов, по одному на каждый подключенный к PDP-7 тер­минал. Спустя год, на той же PDP-7 число процессов заметно увеличи­лось, появился системный вызов fork(2). В Первой редакции UNIX поя­вился вызов ехес(2), но операционная система по-прежнему позволяла размещать в памяти только один процесс в каждый момент времени. По­сле реализации аппаратной подсистемы управления памятью на PDP-11 операционная система была модифицирована, что позволило загружать в память сразу несколько процессов, уменьшая тем самым время на сохра­нение образа процесса во вторичной памяти (на диске) и считывание его, когда процесс продолжал выполнение. Однако до 1972 года UNIX нельзя было назвать действительно многозадачной системой, т. к. операции вво­да/вывода оставались синхронными, и другие процессы не могли выпол­няться, пока их "коллега" не завершал операцию ввода/вывода (обычно достаточно продолжительную). Истинная многозадачность появилась только после того, как код UNIX был переписан на языке С в 1973 году. С тех пор основы управления процессами практически не изменились.

Рис. 3.1. Инфраструктура процесса операционной системы UNIX

Выполнение процесса может происходить в двух режимах — в режиме ядра (kernel mode) или в режиме задачи (user mode).

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

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

Несмотря на то что выполняются инструкции ядра, это происходит от имени процесса, сделавшего системный вызов. Выполнение процесса при этом переходит в режим ядра.

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

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

Соответственно и образ процесса состоит из двух частей: данных режима ядра и режима задачи.

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

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

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

в режиме ядра процесс имеет доступ к любой области памяти.

Структуры данных процесса

Каждый процесс представлен в системе двумя основными структурами данных рrос и user, описанными, соответственно, в файлах

<sys/proc.h> и <sys/user.h>. Содержимое и формат этих структур различ­ны для разных версий UNIX. В табл. 3.1 приведены некоторые поля структуры ргос в SCO UNIX, позволяющие проиллюстрировать информацию, необходимую ядру, для управления процессом.

Таблица 3.1. Структура ргос

char

p_stat

Состояние процесса (выполнение, приостановлен, сон и т. д.)

char

p_pri

Текущий приоритет процесса

unsigned int

p_flag

Флаги, определяющие дополнительную инфор-мацию о состоянии процесса

unsigned short

p_uid

UID процесса

unsigned short

p_suid

EUID процесса

int

p_sid

Идентификатор сеанса

short

p_pgrp

Идентификатор группы процессов (равен иден-тификатору лидера группы)

short

p_pid

Идентификатор процесса (РID)

short

p_ppid

Идентификатор родительского процесса (PPID)

sigset_t

p_sig

Сигналы, ожидающие доставки

unsigned int

p_size

Размер адресного пространства процесса в страницах

time_t

p_utime

Время выполнения в режиме задачи

time_t

p_stime

Время выполнения в режиме ядра

caddr_t

p_ldt

Указатель на LDT процесса

struct pregion

*p_region

Список областей памяти процесса

short

p_xstat

Код возврата, передаваемый родительскому процессу

unsigned int

p_utbl []

Массив записей таблицы страниц для u-area

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

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

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

Запись этой таблицы для выполняющегося в настоящий момент времени процесса адресуется системной переменной curproc.

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

Вторая упомянутая структура — user, также называемая u-area или u-block, содержит дополнительные данные о процессе, которые требуются ядру только во время выполнения процесса.

В отличие от структуры ргос, адресованной указателем curproc, данные user размещаются (точнее, отображаются) в определенном месте виртуальной памяти ядра и адресуются переменной u.

На рис. 3.2 показаны две основные структуры данных процесса и способы их адресации ядром UNIX.

В u-area хранятся данные, которые используются многими подсистемами ядра и не только для управления процессом.

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

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

u-area защищена от доступа в режиме задачи.

u-area также содержит стек фиксированного размера- системный стек или стек ядра (kernel stack).

.

В UNIX 4.xBSD определены дополнительные состояния процесса, в первую очередь связанные с системой управления заданиями и взаимодействием процесса с терминалом. Процесс может быть переведен в состояние "остановлен" с помощью сигналов останова SIGSTOP, sigttin или sigttou.

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

В этом случае, если процесс выполняется или находится в очереди на запуск, его состояние изменяется на "остановлен". Если же процесс находился в состоянии сна, его состояние изменится на "остановлен в состоянии сна".

Выход из этих состояний осуществляется сигналом продолжения SIGCONT, при этом из со­стояния "остановлен" процесс переходит в состояние "готов к запуску", а для процесса, остановленного в состоянии сна, следующим пунктом назначения является продолжение "сна". (реализованы и в SVR4).

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

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

Вектор прерываний содержит адрес процедуры обработки прерываний.

Схема обработки прерывания нижним уровнем операционной системы

1. Аппаратное обеспечение сохраняет в стеке счетчик команд, слово состояния программы и, возможно, один или несколько регистров записываются в (текущий). Переход по адресу, указанному в векторе прерывания

2. Аппаратное обеспечение загружает новый счетчик команд из вектора прерываний

3. Процедура обработки прерываний на ассемблере сохраняет регистры (обычно в блоке управления текущим процессом в таблице процессов). информация, помещенная в стек прерыванием, удаляется, и указатель стека переставляется на временный стек

4. Процедура на ассемблере устанавливает новый стек

5. Запускается программа обработки прерываний на С. (Она обычно считывает и буферизирует входные данные)

6. Планировщик выбирает следующий процесс

7. Программа на С передает управление процедуре на ассемблере

8. Процедура на ассемблере запускает новый процесс

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

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

Планировщик заданий

В ОС могут существенно различаться по своей сложности и объёму выполняемых ими функций

Функции планировщика

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

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

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

  4. освобождение ресурсов после выполнения задания.

Принципы управления памятью

Одной из основных функций операционной системы является эффектив­ное управление памятью.

Оперативная память, или основная память, или память с произвольным доступом (Random Access Memory, RAM) является достаточно дорогостоящим ресурсом. Время доступа к оперативной памяти составляет всего несколько циклов процессора, поэтому работа с данными, находящимся в памяти, обеспечивает максимальную производительность.

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

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

памятью UNIX отвечает за справедливое и эффективное распределение разделяемого ресурса оперативной памяти между процессами и за обмен данными между оперативной и вторичной памятью. Часть операций про изводится аппаратно устройством управления памятью (Memory Management Unit, MMU) процессора под управлением операционной сиc темы, чем достигается требуемое быстродействие.

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

Этот подход часто используется в специализированных микропроцессор-ных системах, однако практически неприменим в операционных системах общего назначения, какой является UNIX.

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

- Выполнение задач, размер которых превышает размер оперативной памяти.

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

- Размещение нескольких задач в памяти одновременно для повыше­ния эффективности использования процессора.

-Размещение задачи в произвольном месте оперативной памяти.

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

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

Все эти возможности реализованы в современных версиях UNIX с по­мощью т. н. виртуальной памяти.

Виртуальная память не является "бесплатным приложением", повышая накладные расходы операционной системы:

структуры данных управления памятью размещаются в оперативной памяти, уменьшая ее размер;

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

для системы со средней загрузкой около 7% процессорного времени приходится на подсистему управления па­мятью.

Поэтому от эффективности реализации и работы этой подсистемы во многом зависит производительность операционной системы в целом.