- •12 Спо часть 1 Лек 1_11 (Кузнецова а.В.)
- •Процессы в unix. (пользовательский аспект).
- •Запуск – завершение процесса.
- •Отношение между процессами.
- •Общие сведения. Основные понятия.
- •Когда и с кем создаются процессы? (Создание процесса).
- •Когда и кем уничтожаются процессы? (Завершение процесса).
- •Создание процессов в unix.
- •Взаимодействие процессов
- •Управление процессами с помощью системных функций.
- •Контекст и дескриптор процесса (из учеб. Пособия Мохова)
Когда и кем уничтожаются процессы? (Завершение процесса).
Преднамеренно:
Обычный выход (например компилятор закончил свою работу успешно).
Выход по ошибке (например транслятор не нашел транслируемого файла)
Непреднамеренно:
Выход по неисправимой ошибке (логическая ошибка в программе) например /0, обращение к несуществующей ячейке памяти, недопустимая команда и т.д.
Другой процесс вызывает системный запрос на уничтожение некоторого процесса.
UNIX |
WIN |
Действие |
ps (команда) |
Ctrl+Alt+Del |
Вывод списка запущенных процессов |
fork (системный вызов, создает дубликат процесса),а новый процесс затем выполняет системный запрос execve или похожий для запуска новой программы, т.е. двухступенчатый. |
CreateProcess |
Запуск процесса |
Системный запрос exit |
Функция ExitProcess |
Завершение процесса |
Системный запрос kill |
Функция TerminateProcess |
Уничтожение процесса |
Наиболее важные поля элемента таблицы процесса (Структуры):
Для управления процессом |
Для управления памятью |
Для управления файлами |
Регистры Счетчик команд |
Указатель на сегмент кода |
Корневой каталог Рабочий каталог
|
Слово сост. процессора (флаги) |
Указатель на сегмент данных |
Дескрипторы открытых файлов |
Указатель стека |
Указатель на сегмент стека |
Идентификатор пользователя UID Идентификатор группы GID |
Состояние процесса Приоритет Параметры планирования PID (идентификаторы процесса) Родительский процесс (PPID) Группа пользователя GID Сигналы Время начала процесса Использованное процессорное время Процессорное время дочернего процесса Время следующего аварийного сигнала |
Демоны
У каждого пользователя могут быть одновременно несколько активных процессов и десятки фоновых процессов (демонов). Демоны запускаются автоматически при загрузке ОС, а могут и самим пользователем.
Типичный демон cron daemon который активизируется 1раз/мин. и позволяет планировать активность пользователя на часы-дни-месяцы вперед. Он же используется для периодического запуска задач: архивация, удаления ненужных файлов и т.д.
Создание процессов в unix.
Для создания процесса существует единственный системный вызов fork (ветвление, вилка – англ.). Он создает дубликат (точную копию) выходного процесса (родительского). После выполнения fork у обоих процессов одинаковые образы памяти, строки окружения, одни и те же открытые файлы.
Например, пользователь набирает команду sort. Оболочка создает дочерний процесс, а он с помощью системного вызова execve (или похожего) запускает программу sort. Т.е. для создания П. используется две ступени fork-execve. Смысл этого? Дочерний процесс успевает обработать описания файлов после fork, но до execve, чтобы выполнить перенаправление стандартных устройств вв/вывода и потока сообщений об ошибках.
При загрузке UNIX: при загрузке создается специальный процесс init. Этот процесс считывает файл, в котором находится информация о количестве терминалов. Затем процесс init разветвляется т.о., чтобы каждому терминалу соответствовал один процесс. Все эти процессы ждут, когда пользователь войдет в систему на каком-либо терминале. Если пароль верный, то процесс входа в систему запускает оболочку (тоже процесс), из которой запускаются команды (тоже процесс), а они тоже могут запустить процессы, необходимые для их работы. Все продолжаемые процессы принадлежат единому дереву, корень которого – init.
Изменение в открытых файлах (а они общие) видны и процессу-родителю и процессу-потомку. А так же любому другому процессу, который тоже откроет этот файл. Системный вызов fork возвращает дочернему процессу – 0 (ноль), а родительскому процессу – PID дочернего процесса. Пример, создания процесса:
pid = fork();
if (pid<0) { handle_error( ); } /*если fork не выполн.*/
else
if (pid>0) {….} /*здесь родительская прграмма*/
else {….} /*здесь дочерняя программа*/
Процессы распознаются по своим по своим PID-идентификаторам. Сам процесс может узнать свой PID с помощью системного вызова getpid (2). Когда дочерний процесс завершает, его PID выдается процессу-родителю (т.к. у родителя может быть много процессов-потомков).
А если родитель уже завершен , то дочернему процессу «передаются» родителю родителя, или процесс, с PID =1.