русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Жизненный цикл процесса


Дата добавления: 2015-07-09; просмотров: 458; Нарушение авторских прав


Как было отмечено ранее, процессы создаются другими процессами. Когда процессу требуется создать дочерний процесс, используется системный вы- зов fork().

Предположим, что пользователь выполнил в оболочке команду ps -f, желая получить список процессов, запущенных на данном виртуальном терминале. В таком случае ps -f является дочерним процессом оболочки. Пример 5.6 демонстрирует, что команда ps -f является дочерним процессом оболочки: PPID команды ps -f 1751 соответствует PID оболочки.

 

Пример 5.6. Идентификаторы дочернего процесса

 

$ ps -f  
UID PID PPID C STIME TTY TIME CMD
user1 0 21:01 pts/0 00:00:00 bash
user1 0 21:32 pts/0 00:00:00 ps -f

 

Команда ps -f будет подробнее рассмотрена далее, сейчас нам необходимо разобраться в том, каков был жизненный цикл процесса.

Когда пользователь ввел в командной строке команду ps -f, эта команда бы- ла проверена оболочкой bash, не является ли она встроенной. Так как эта ко- манда не является встроенной, для ее выполнения оболочка произвела сис- темный вызов fork().

Системный вызов fork() приводит к тому, что ядро копирует адресное про- странство процесса, произведшего этот вызов, в свободное адресное про- странство в памяти. Начиная с этого момента, в системе имеются два совер- шенно одинаковых процесса bash. В обоих процессах выполнение производится с одной и той же инструкции, следующей после fork().

При создании процесса ядро назначает ему уникальный идентификатор про- цесса PID. Так и сейчас, для копии родительской оболочки — дочернего процесса bash, в нашем случае, система назначила PID 1870, а PPID новой оболочки соответствует PID породившей ее оболочки — 1751.


 

Итак, в настоящий момент в системе имеются два одинаковых процесса bash. Но требовалось получить процесс команды ps -f. Поэтому в дочер- нем процессе bash должен быть произведен системный вызов класса exec() (см. man 3 exec), который позволяет загрузить программу /bin/ls и поместить прочитанный исполняемый код в адресное пространство до- чернего процесса.



В то же время родительский процесс bash должен быть приостановлен с по- мощью системного вызова wait(), ожидающего сигнала о завершении рабо- ты дочернего процесса. До тех пор, пока этот сигнал получен не будет, роди- тельский процесс bash не может продолжить работу.

Как же отличить родительский и дочерний процессы bash для того, чтобы определить, в каком из них надо вызвать exec(), а в каком — wait()? Их можно различить с помощью анализа значения, возвращаемого функцией fork(). Она возвращает PID дочернего процесса. Родительский процесс bash породил дочерний процесс, и, следовательно, fork() возвратил PID дочерне- го процесса. В порожденном процессе fork() возвращает 0.

После вызова exec() дочерний процесс уже не является процессом bash — он выполняет инструкции команды ps. Родительский процесс ждет заверше- ния дочернего процесса.

После того как команда ps -f завершает свою работу системным вызовом exit(), ее адресное пространство освобождается. Родительский процесс bash, который с помощью системного вызова wait() ожидал завершения ра- боты дочернего процесса, продолжит после этого свою работу.

Нормальный жизненный цикл процесса в системе может быть нарушен вследствие наступления какого-либо события. Например, процесс может по- лучить сигнал от другого процесса, который может привести к его прежде- временной остановке.

Информация о дочерних процессах в таблице процессов может быть важна для родительского процесса. Поэтому информация о них не стирается из таб- лицы процессов до вызова родительским процессом функции wait() (см. man 2 wait).

Возможна ситуация, когда дочерний процесс уже завершил свою работу, а родительский процесс не произвел еще системного вызова wait(). В таком случае информация об уже несуществующем дочернем процессе сохраняется в таблице процессов, т. к. эта информация может потребоваться родитель- скому процессу. Запись в таблице о завершившемся дочернем процессе по- мечается как defunct или, иначе, процесс-зомби (zombie).


 



<== предыдущая лекция | следующая лекция ==>
Фоновый режим выполнения заданий | Мониторинг процессов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.008 сек.