Управление процессами. Лекции
Рефераты >> Программирование и компьютеры >> Управление процессами. Лекции

Суть функций exec() - в следующем: при обращении к ней происходит замена тела текущего процесса, оно заменяется в соответствии с именем исполняемого файла, указанного одним из параметров функции. Функция возвращает «-1», если действие не выполнено, и код, отличный от «-1», если операция прошла успешно. Здесь следует отметить следующий факт - в UNIX-е при работе с системными вызовами иногда возникают диагностические сообщения в виде кода ответа, которые невозможно разделить на конкретные причины, вызвавшие возвращение этого кода. Примером этого являются коды “-1” для fork() и exec( .). Для того чтобы обойти это неудобство, следует включить в программу файл “errno.h”, и после этого при возникновении отказов в выполнении системных вызовов в переменной “errno” будет код конкретной причины отказа выполнения заказа. Всевозможные коды отказа описаны в самом “errno.h”.

Давайте приведем небольшой пример. Мы напишем программу, которая будет запускать файлы, имена которых перечислены при вызове.

main(argc, argv)

int argc;

char *argv;

{ int i, pid;

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

if (pid=fork()) continue; /* отец */

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

}

}

Здесь, если pid=0, мы замещаем тело процесса-сына процессом, имя файла которого нам передается в качестве параметра. Если же pid>0, то есть мы находимся в процессе-отце, то продолжаем создавать сыновние процессы, пока есть аргументы.

В качестве иллюстрации работы fork() можно привести следующую картинку:

Здесь процесс с PID=105 создается процессом с PID=101.

Также следует отметить, что если убивается процесс-отец, то новым отцом становится 1-ый процесс ОС.

Связка fork/exec по своей мощности сильнее, чем, если бы была единая функция, которая сразу бы создавала новый процесс и замещала бы его содержимое. Fork/exec позволяют вставить между ними еще некоторую программу, которая будет содержать какие-то полезные действия.

Мы начали рассматривать организацию процессов. Мы на пальцах показали, как размещается информация в ОС. В принципе, вся информация, которая отражает оперативное состояние ОС, а также программы ОС, которые управляют этой информацией и наиболее важными устройствами, составляют ядро ОС.

Ядро ОС - программа, функцией которой является управление базовыми объектами системы (для UNIX-а это два объекта - файл и процесс). Ядро в своем теле размещает необходимые таблицы данных. Ядро считается некоторой неразделяемой частью ОС. Оно обычно работает в режиме супервизора, все остальные функции ОС могут работать и в других режимах.

Лекция №12

На прошлой лекции мы начали говорить о процессах в операционной системе UNIX. Можно однозначно сказать о том, что процессы и механизмы управления процессами в операционной системе - это одна из принципиальных особенностей операционной системы UNIX, т.е. тех особенностей, которые отличали систему при создании и отличают ее до сих пор. Более того, несмотря на старания господина Гейтса, ситуация такова, что он повторяет те программные интерфейсы, которые используются для взаимодействия управления процессами, а не фирмы разработчики UNIX-ов повторяют те интерфейсы, которые появились в Windows. Первенство операционной системы UNIX очевидно.

Мы говорили о том, что процесс в UNIX-е - это есть нечто, что зарегистрировано в таблице процессов. Соответственно каждая запись в таблице процессов имеет номер. Номера идут от нуля до некоторого предельного значения, которое предопределено при установке системы. Номер в таблице процессов - это есть, так называемый, идентификатор процесса, который в системе обозначается PID. Соответственно, подавляющее большинство действий, которые можно выполнить с процессом, выполняются при помощи указания идентификатора процесса. Каждый процесс характеризуется контекстом процесса. Это блок данных, характеризующий состояние процесса, в том числе в этом блоке данных указывается информация об открытых файлах, о правилах обработки событий, возникающих в процессе. В этом наборе данных хранится информация, которая образуется при полном «упрятывании» процесса при переключении системы с процесса на процесс. То есть когда происходит по той или иной причине переключение выполнения с одного процесса на другой, для того чтобы можно было восстановить работу процесса, некий набор данных размещается в контексте процесса. Этот набор данных заключает в себе содержимое регистровой памяти, некоторые режимы, которые установила программа и в которые вмешался процессор (например, содержимое регистра результата), точку возврата из прерывания. Плюс - контекст содержит много полезной информации, о которой мы будем говорить позже.

Мы говорили о том, что в некотором смысле определено понятие тела процесса. Тело процесса состоит из двух сегментов: сегмента текста и сегмента данных. Сегмент текста - это часть данных процесса, которые включают в себя код исполняемой программы. Сегмент данных - это те пространства оперативной памяти, которые могут статически содержать данные. Мы говорили, что в системе есть возможность иметь разделенные сегменты текста и сегменты данных. В свою очередь, система позволяет с одним сегментом текста связывать произвольную группу сегментов данных. Это, в частности, бывает полезно, когда в системе одновременно работают несколько одинаковых процессов.

Принципиально важная вещь, связанная с организацией управлением процессами, - механизм fork/exec. При обращении к функции fork происходит создание нового процесса, который является копией текущего процесса. Незначительные отличия этих процессов есть в идентификаторе процессов. Возможны некоторые отличия в содержимом контекста процесса.

Функция exec позволяет заменять тело процесса, т.е. при обращении к этой функции, в случае успешного ее выполнения, тело процесса меняется на новое содержимое, которое указано в качестве аргументов функции exec в виде имени некоторого файла. Мы говорили о том, что сама по себе функция fork почти бессмысленна. Попробуем уловить смысл функции exec - можно выполнять в рамках одного процесса несколько задач. Возникает вопрос: почему формирование этого процесса раздроблено на две функции fork и exec? Чем это обосновано? Во многих системах есть одна функция, формирующая процесс с заданным содержимым. Дело в том, что при обращении к функции fork, как уже неоднократно было сказано, создается копия процесса, в том числе процесс-сын наследует все те файлы, которые были открыты в процессе отце и многие другие права и привилегии. Бывает ситуация, когда не хотелось бы, чтобы наследник приобретал все особенности отца. И есть возможность между выполнением функций fork и exec выполнить какие-то действия по закрытию файлов, открытию новых файлов, по переопределению чего-либо и т.д. В частности, вы при практических занятиях должны освоить отладчик системы deb. Какова суть его работы?


Страница: