Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
14-19).docx
Скачиваний:
3
Добавлен:
07.09.2019
Размер:
39.24 Кб
Скачать

15 Системные вызовы FreeBsd, реализующие функции управления процессами.

В FreeBSD новые процессы создаются с помощью семейства системных вызовов fork. Системный вызов fork создаст полную копию родительского процесса. Системный вызов rfork создает элемент нового процесса, который вместо копирования всего раз­деляет со своим родителем выбранный набор ресурсов Системный вызов vfork отличается от fork в том, как рассматриваются ресурсы виртуальной памяти, vfork гарантирует также, что родитель не будет имущей до тех пор, пока порожденный про­цесс не выполнит системный нм юн либо ехес, либо exit.

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

Вызов fork включает три главных шага.

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

  • Дублирование для порожденного процесса контекста родителя (включая струк­туру потока и ресурсы виртуальной памяти).

  • Планирование выполнения порожденного процесса.

Ядро начинает с выделения памяти для нового процесса и элементов потоков Эти элементы потоков и процесса инициализируются за три шага:

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

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

  • группу процесса и сеанс;

  • состояние сигналов (маски игнорируемых, перехватываемых и блокируемых сиг­налов);

  • параметр планирования kg nicе

ссылку на мандат родителя

ссылку на родительский набор открытых файлов;

ссылку на ограничения родителя.

Явным образом устанавливаемая информация включает: элемент в списке всех процессов;

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

элемент в списке групп процессов родителя;

элемент в кеш-структуре, которая позволяет искать процессы по их PID;

  • указатель на структуру статистики процесса, выделенную в сто структуре пользо­вателя;

  • указатель на структуру действий сигналов процесса, выделенную в его структуре пользователя;

  • новый PID для процесса.

Новый PID должен быть уникальным среди всех процессов. Ранние версии BSD проверяли уникальность PID.

После полного построения порожденного процесса о его потоке сообщается пла­нировщику через помещение его в очередь выполнения. Альтернативный путь возвра­та установит в порожденном процессе возвращаемое системным вызовом fork значе­ние в 0. Путь возврата обычного выполнения и родителе установит возвращаемое значение системного вызова fork равным новому PID.

Процессы завершаются либо добровольно - посредством системного вызова exit, либо непреднамеренно - в результате сигнала В любом случае завершение процесса вызы­вает возвращение кода состояния родителю завершающегося процесса если родитель все еще существует) Это состояние завершения возвращается посредством системно­го вызова wait4. Вызов wait4 дает приложению возможность запрашивать состояние как остановленных, так и завершенных процессов.

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

  • Любой поток, входящий в ядро из пространства пользователя, выполнит thread_cxit(), когда попадет в ядро.

  • Любой поток, уже находящийся в ядре и пытающимся войти в состояние сна. немедленно возвратится со значением EINTR или EAGAIN, что вернет их обратно в пространство пользователя, освободив ресурсы. Когда поток пытается вернуться в пространство пользователя, он вместо этого попадет в threadxit().

Затем процедура exit0 очистит состояние выполнения режима ядра процесса, выполнив следующее:

  • отменив все ожидающие таймеры;

  • освободив ресурсы виртуальной памяти;

  • закрыв открытые дескрипторы;

- обработав остановленные или трассировавшиеся порожденные процессы.

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

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