- •Операционные системы
- •Ограниченный и
- •Ограниченный и
- •Ограниченный и
- •Ограниченный и
- •Процессы. Основные сведения
- •Диаграмма состояний процесса в UNIX
- •Дескриптор процесса и структура task_struct
- •Структура task_info
- •Структура task_info
- •Диаграмма состояний процесса в UNIX
- •Создание нового процесса
- •COW (copy-on-write)
- •Функция fork()
- •Функция copy_process()
- •Функция copy_process()
- •Функция copy_process()
- •Функция copy_process()
- •Process, thread, task?
- •Process and threads
- •Завершение процесса
Диаграмма состояний процесса в UNIX
Создание нового процесса
fork() – создает процесс, являющийся копией текущей задачи.
Отличия от родительского процесса:
PID
PPID
Сигналы
Статистика использования ресурсов
exec() – загружает исполняемый файл в адресное пространство процесса и передает ему управление.
COW (copy-on-write)
P1
RESOURCE
После вызова fork() и exec() |
|
P1 |
P2 |
RESOURCE |
|
P2 пытается изменить часть
данных RESOURCE
P1
RESOURCE
CHANGED
RESOURCE P2
DATA
Функция fork()
fork() clone()
do_fork(
)
copy_proces s()
Функция copy_process()
1.Вызывается функция dup_task_struct(), которая создает новый стек ядра, структуры thread_info и task_struct для нового процесса, причем все значения указанных структур данных идентичны для родительского и дочернего процессов. На этом этапе дескрипторы родительского и дочернего процессов идентичны.
2.Проверяется, не будет ли при создании нового процесса исчерпан лимит на количество процессов для данного пользователя.
Функция copy_process()
3. Теперь необходимо сделать так, чтобы дочерний процесс отличался от родительского. При этом различные поля дескриптора дочернего процесса очищаются или устанавливаются в начальные значения. Не копируются только те поля, в которых содержатся в основном статистические данные использования системных ресурсов. Большая часть полей структуры task_struct не меняется.
4. Далее дочерний процесс переводится в состояние TASK_UNINTERRUPTIBLE, чтобы он случайно не начал выполняться.
Функция copy_process()
5.Из функции copy_process() вызывается функция copy_flags(), которая обновляет значение поля flags структуры task_struct. При этом сбрасывается флаг PF_SUPERPRIV, который определяет, имеет ли процесс права суперпользователя. Флаг PF_FORKNOEXEC, который указывает на то, что процесс не вызвал функцию exec(), — устанавливается.
6.Вызывается функция alloc_pid(), которая назначает новое значение идентификатора PID для новой задачи.
Функция copy_process()
7.В зависимости от значения флагов, переданных в функцию clone(), в функции copy_process() выполняется копирование или совместное использование открытых файлов, информации о файловой системе, обработчиков сигналов, адресного пространства процесса и пространства имен (namespace). Обычно эти ресурсы совместно используются потоками одного процесса. В противном случае они становятся уникальными и будут копироваться на этом этапе.
8.Наконец, в функции copy_process() выполняется окончательная зачистка структур данных и возвращается указатель на новый дочерний процесс.
Process, thread, task?
Для ОС UNIX условно:
process = thread = task
Process and threads
Другие
ОС
Process 1
PD
resource s
thread 1
thread 2
thread 3
resource s
resource s
resource s
Linu x
Process 1
Process 2
Process 3