Управление процессами
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: реферат орган, диплом
| Добавил(а) на сайт: Вонифатий.
1 2 3 4 5 6 7 8 9 | Следующая страница реферата
Вторым по значимости понятием в операционной системе (ОС) является понятие процесса. Процесс - сущность, которая определяется по-разному. Это может быть - “упорядоченный набор команд и принадлежащих ему ресурсов”. С точки зрения ОС UNIX, процесс - это объект, зарегистрированный в специальной таблице процессов. Структура этой таблицы следующая: она позиционна (как практически и все таблице в UNIX), то есть номер записи в таблице - есть идентификатор процесса “PID”. Формируются процессы с 0 до N-1, где N - предельное число процессов, которые система может одновременно обрабатывать. Это параметр настройки ОС.
Рассмотрим информативную нагрузку таблицы. В строке-записи таблицы находится ссылка на контекст процесса, там же находится ссылка на тело процесса. Телом процесса мы будем называть набор команд и данных, которыми оперирует процесс.
Контекст процесса - атрибут, который присутствует практически во всех ОС, в разных ОС он может называться по-разному. Контексты всех процессов размещаются в адресном пространстве ОС и содержат оперативную информацию о состоянии процесса и текущую информацию, связанную с процессом и его запуском.
Контекст содержит:
номера пользователя и группы;
указатель на индексный дескриптор текущего каталога;
специфические условия работы процесса:
- обработка сигналов;
Рассмотрим это подробнее. В ОС UNIX каждый процесс может послать другому процессу некоторое воздействие, которое называют “сигнал”; соответственно, если процесс-отправитель имеет право передать сигнал процессу-получателю, то при выполнении передачи в последнем возникает событие, связанное с сигналом.
Это событие очень похоже на прерывание, возникающее в аппаратуре вычислительной системы. В ОС имеется набор сигналов, которые могут передавать друг другу процессы; перечень сигналов описан в файле “signal.h”. Отправитель может подать некоторым образом команду ОС, что он передает сигнал с заданным номером процессу-получателю, процесс-получатель может прореагировать на сигнал тремя способами: 1) прекращение выполнения, причиной которого является пришедший сигнал; 2) игнорирование сигнала (здесь следует отметить, что игнорировать можно далеко не все сигналы); 3) вызывается предопределенная процессом функция, которая может выполнить какие-то действия; возврат из этой функции осуществляется в точку прихода сигнала.
- информация об открытых в процессе файлах;
- информация о текущем состоянии процесса на случай его приостановки;
Останавливая выполнение процесса, ОС “упрятывает” в соответствующий контекст информацию, нужную для его продолжения: режимы программы в момент приостановки, состояние регистров, адрес точки прерывания.
Тело процесса, - как уже было сказано, можно представить в виде объединения сегмента текста (кода) и сегмента данных. Развитые ОС позволяют размещать сегменты текста и данных в различных, не зависящих друг от друга, местах оперативной памяти. Это хорошо, так как вместо одного большого куска памяти нам требуется два маленьких. Но еще лучше следующее - такая организация позволяет использовать сегмент кода повторно. В системе допускается существование еще одного процесса с собственным контекстом, сегментом данных, но у которого общий с другими процессами сегмент кода.
Если k пользователей вызывают один текстовой редактор, то в системе находится одна копия этого редактора и k копий сегмента данных и контекстов (копии, надо заметить, не идентичные). Это вещь полезная, так как отсюда сразу же можно увеличить “разум” планировщика откачки (он может, например, откачивать сегмент данных, а не сегмент текста).
Мы перечислили не все содержимое контекста, и в дальнейшем эта информация будет дополняться и уточняться.
Мы говорили, каким образом в UNIX-e можно создать копию текущего процесса, - это функция fork(), которая работает следующим образом:
fork( ): >0 PID сыновьего процесса (мы находимся в процессе-отце)
=0 (мы находимся в процессе-сыне)
=-1 произошла ошибка - невозможно создать новый процесс (остаемся в процессе-отце), эта ошибка может возникнуть при недостатке места в таблице процессов, при нехватке места в системных областях данных и т.п.
Система поддерживает родственные взаимоотношения между процессами, это означает, что существуют некоторые функции, характерные для работы с процессами, которые доступны только процессам, являющимся родственниками. При порождении сыновнего процесса с использованием fork() порожденный процесс наследует:
Окружение - при формировании процесса ему передается некоторый набор параметров-переменных, используя которые, процесс может взаимодействовать с операционным окружением (интерпретатором команд и т.д.);
Файлы, открытые в процессе-отце, за исключением тех, которым было запрещено передаваться специальным параметром при открытии;
Способы обработки сигналов;
Разрешение переустановки действующего идентификатора пользователя (это то, что связано с s-bit’ом)
Все присоединенные разделяемые сегменты памяти - у нас есть механизм управления разделяемыми ресурсами, и в качестве одного из разделяемых ресурсов может выступать оперативная память, в ней может быть выделен сегмент, к которому одновременно имеют доступ несколько процессов. При формировании сыновнего процесса эта часть памяти также будет унаследована;
Текущий рабочий каталог и корневой каталог;
Не наследуется при создании нового процесса идентификатор процесса (почему - очевидно).
Возвращаясь к функции fork(), следует заметить, что она сама по себе бессмысленна, ибо применение такому созданию точной копии процесса найти весьма сложно. Поэтому функция fork() используется совместно с группой функций exec(...). Эта группа объединяет в себе функции, которые частью своего имени имеют слово “exec” и выполняют приблизительно одинаковые действия, (набором или интерпретацией параметров).
Суть функций 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; i0, то есть мы находимся в процессе-отце, то продолжаем создавать сыновние процессы, пока есть аргументы.
В качестве иллюстрации работы fork() можно привести следующую картинку:
Рекомендуем скачать другие рефераты по теме: сочинения по литературе, реферат на тему государство.
Категории:
1 2 3 4 5 6 7 8 9 | Следующая страница реферата