Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Реализация процессов в UNIX




(подробно)

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

ОС поддерживает две ключевые структуры данных, относящихся к процессу:

1. таблицу процессов (ТП);

2. структуру пользователя (СП).

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

Информация в ТП подразделяется на следующие категории:

1. Параметры планирования:

- приоритет;

- процессорное время за последний учитываемый период;

- количество времени, проведенное процессом в режиме ожидания;

2. Образ памяти:

- указатели на сегмент программы, данных и стека (или указатели на соответствующие им таблицы страниц);

- если процесса нет в ОП, то информация о том, как найти его части на диске.

3. Сигналы:

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

4. Разное:

- текущее состояние процесса;

- события, ожидаемые процессом (если таковые есть);

- время до истечения интервала будильника;

- PID;

- PID родителя;

- UID;

- GID.

Информация о выгруженных процессах, которая не нужна ОС, тоже структурирована.

СП:

1. Машинные регистры (здесь хранятся значения, когда происходит прерывание с переключением в режим ядра).

2. Состояние текущего системного вызова, включая параметры и результаты.

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

4. Учетная информация:

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

- максимальное время, которое может использовать процесс (не во всех версиях UNIX).

- максимальный размер стека.

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

5. Стек ядра – фиксированный стек для работы системы в системном режиме.

 

Рассмотрим подробнее работу системного вызова fork.

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

 

Копирование памяти «дорого» и все UNIX «жульничают»: новая память не выделяется, а таблицы страниц указывают на страницы родительского процесса, подключенные как доступные только для чтения.

 

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

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

Затем в стек копируются аргументы и строки окружения, сигналы сбрасываются, регистры обнуляются. С этого момента новая программа начинает исполнение.


Поделиться:

Дата добавления: 2015-08-05; просмотров: 105; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты