Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Processes - Metodicka (edited) with MPI - last....doc
Скачиваний:
59
Добавлен:
22.12.2018
Размер:
1.59 Mб
Скачать
      1. Использование системного вызова wait()

Пример программы, последовательно запускающей программы, имена которых указаны при вызове.

#include <sys/types.h>

#include <unistd.h>

#include <sys/wait.h>

#include <stdio.h>

int main(int argc, char **argv)

{

int i;

for (i=1; i<argc; i++)

{

int status;

if(fork()>0)

{

/*процесс-предок ожидает сообщения от процесса-потомка о завершении */

wait(&status);

printf(“process-father\n”);

continue;

}

execlp(argv[i], argv[i], 0);

return -1;

/*попадем сюда при неуспехе exec()*/

}

return 0;

}

Пусть существуют три исполняемых файла print1, print2, print3, каждый из которых только печатает текст first, second, third соответственно, а код вышеприведенного примера находится в исполняемом файле с именем file. Тогда результатом работы команды file print1 print2 print3 будет

first

process-father

second

process-father

third

process-father

      1. Использование системного вызова wait()

В данном примере процесс-предок порождает два процесса, каждый из которых запускает команду echo. Далее процесс-предок ждет завершения своих потомков, после чего продолжает выполнение.

#include <sys/types.h>

#include <unistd.h>

#include <sys/wait.h>

#include <stdio.h>

int main(int argc, char **argv)

{

if ((fork()) == 0) /*первый процесс-потомок*/

{

execl(“/bin/echo”, ”echo”, ”this is”, ”string 1”, 0);

return -1;

}

if ((fork()) == 0) /*второй процесс-потомок*/

{

execl(“/bin/echo”, ”echo”, ”this is”, ”string 2”, 0);

return -1;

}

/*процесс-предок*/

printf(“process-father is waiting for children\n”);

while(wait(NULL) != -1);

printf(“all children terminated\n”);

return 0;

}

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

    1. Жизненный цикл процесса в ос unix.

Подведем короткие итоги. Итак, процесс в UNIX представляет собой исполняемую программу вместе с необходимым ей окружением. Окружение состоит из информации о процессе, которая содержится в различных системных структурах данных, информации о содержимом регистров, программ операционной системы, стеке процесса, информации об открытых файлах, обработке сигналов и так далее. Процесс представляет собой изменяющийся во времени динамический объект. Программа представляет собой часть процесса. Процесс может создавать процессы-потомки посредством системного вызова fork(), может изменять свою программу через системный вызов exec(). Процесс может приостановить свое исполнение, используя вызов wait(), а также завершить свое исполнение посредством функции exit().

С учетом вышеизложенного, рассмотрим подробнее состояния, в которых может находится процесс:

  1. Процесс только что создан посредством вызова fork().

  2. Процесс находится в очереди готовых на выполнение процессов.

  3. Процесс выполняется в режиме задачи, т.е. реализуется алгоритм, заложенный в программу. Выход из этого состояния может произойти через системный вызов, прерывание или завершение процесса.

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

  5. Процесс в ходе выполнения не имеет возможность получить требуемый ресурс и переходит в состояние блокирования.

  6. Процесс осуществил вызов _exit() или получил сигнал на завершение. Ядро освобождает ресурсы, связанные с процессом, кроме кода возврата и статистики выполнения. Далее процесс переходит в состоянии зомби, а затем уничтожается.

Рис. 12 Жизненный цикл процесса в ОС UNIX.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]