Студопедия  
Главная страница | Контакты | Случайная страница

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

LINUX|| Процессы в ОС Linux. Этапы создания процесса.

Читайте также:
  1. I. Этапы развития западной социологической мысли.
  2. II. Основные этапы работы
  3. II. Основные этапы развития мировой социологической мысли.
  4. II. Факторы эпидемического процесса.
  5. II. Хозяйственные процессы и их результаты.
  6. III. 3.1. Геоурбанизационные процессы в России
  7. III. Механизм развития эпидемического процесса.
  8. IV. Периоды (этапы) развития организма.
  9. IV. Правотворчество: понятие, функции, виды. Стадии законотворческого процесса.
  10. IV. Этапы внедрения программы

Механизмы создания нового процесса. Системный вызов fork созпдает … называемого родительским процессом (parent process), новый процесс называется дочерним процессом (child process). У родительского и дочернего процесса есть свои собственные образы памяти. Если впоследствии, родительский процесс изменяет свои переменные, то эти изменения остаются невидимыми для дочернего процесса. Сразу после выполнения системного вызова fork, значения всех соответствующих переменных в обоих процессах одинаковы, но после копирования всего адресного пространства родителя, последующие изменения в одном процессе не влияют на другой. Системный вызов fork возвращает дочернему процессу число 0, а родительскому – отличный от нуля PID дочернего процесса. Оба процесса проверяют возвращаемое значение и действуют соответственно. Открытые файлы используются родительскими и дочерними процессами совместно. Это значит, что, если какой-либо файл был открыт в родительском процессе, до выполнения системного вызова fork, то он остается открытым в обоих процессах. Изменения, произведенные с этим файлом любым из процессов видны другому. Если дочерний процесс желает узнать свой идентификатор, то он может воспользоваться системным вызовом getpid. Например, когда дочерний процесс завершается, его родитель получает идентификатор только что завершившегося процесса.

Механизм создания процесса

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

(картинка в СОС ~756 с)

При вызове fork() происходит следующее:

1) Выделение структуры задач для потомка

2) Заполнение структуры задач потоком данными родителя

3) Выделение памяти для стека и области пользователя дочернего процесса

4) Заполнение области пользователя дочернего процесса

5) Выделение идентификатора для дочернего процесса

6) Настройка дочернего процесса на использование программы родительского процесса

7) Копирование таблицы страниц для данных и стека

8) Настройка совместного использования открытых файлов

9) Копирование регистров родительского процесса в дочерний процесс

При системном вызове exec() происходит следующее:

1) Поиск исполняемого файла

2) Проверка разрешения на выполнение

3) Чтение и проверка заголовка

4) Копирование аргументов, среды в ядро

5) Освобождение нового адресного пространства

6) Копирование аргументов среды в стек

7) Сбрасывание сигнала

8) Инициализация регистров

Когда выполняется системный вызов fork(), вызывающий процесс выполняет эмулированное прерывание в ядро и создает структуру задачи. Большая часть содержимого дескриптора процесса заполняется значениями из дескриптора родителя, затем Linux ищет доступный идентификатор и обновляет элемент хэш-таблицы идентификаторов, чтобы там был указатель на новую структуру задачи. Далее система выделяет дочернему процессу его собственные таблицы страниц, но эти таблицы указывают на страницы родительского процесса, помеченного, как доступные только для чтения. Когда дочерний процесс пытается писать в такую страницу, происходит нарушение защиты. Ядро видит это и выделяет дочернему процессу новую копию этой страницы, которую помечает как доступную для чтения и для записи. Таким образом копируются только те страницы, в которые дочерний процесс пишет. Такой механизм называется копированием при записи. После того, как дочерний процесс начинает работу, его код делает системный вызов exec(), задавая имя команды в качестве параметра, при этом ядро находит и проверяет исполняемый файл, копирует в ядро аргументы и освобождает старое адресное пространство. Далее записывается новое адресное пространство. Сигналы сбрасываются, а все регистры устанавливаются в 0. После этого программа готова к работе.

 

 


Дата добавления: 2014-12-19; просмотров: 13 | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2018 год. (0.006 сек.)