Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_1_11_Процессы_пользовательский аспект.doc
Скачиваний:
4
Добавлен:
21.09.2019
Размер:
129.02 Кб
Скачать

Когда и кем уничтожаются процессы? (Завершение процесса).

Преднамеренно:

  1. Обычный выход (например компилятор закончил свою работу успешно).

  2. Выход по ошибке (например транслятор не нашел транслируемого файла)

Непреднамеренно:

  1. Выход по неисправимой ошибке (логическая ошибка в программе) например /0, обращение к несуществующей ячейке памяти, недопустимая команда и т.д.

  2. Другой процесс вызывает системный запрос на уничтожение некоторого процесса.

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.