- •14.Назовите последовательность операций, необходимую для:
- •15 Системные вызовы FreeBsd, реализующие функции управления процессами.
- •16. Охарактеризуйте многонитевые процессы. Поясните понятия параллельности и одновременности выполнения.
- •17 Укажите на характерные отличия между однонитевой и многонитевой реализацией процессов.
- •18 Классификация нитей. Нити ядра. Особенности реализации и рекомендуемая область применения.
- •19 Классификация нитей. Легковесные нити. Особенности реализации и рекомендуемая область применения.
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, что вернет их обратно в пространство пользователя, освободив ресурсы. Когда поток пытается вернуться в пространство пользователя, он вместо этого попадет в thread_еxit().
Затем процедура exit0 очистит состояние выполнения режима ядра процесса, выполнив следующее:
отменив все ожидающие таймеры;
освободив ресурсы виртуальной памяти;
закрыв открытые дескрипторы;
- обработав остановленные или трассировавшиеся порожденные процессы.
Сбросив состояния режима ядра, процесс далее удаляется из списка активных процессов - списка allproc - и помешается в список процессов-зомби, на который указывает zombproc. Состояние процесса изменяется для отображения того, что в текущий момент не выполняется ни один поток.