Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Структура процессов

Читайте также:
  1. A) структура рабочего стола
  2. I. Правосознание: понятие, структура, функции и виды.
  3. II Разновидности производственных процессов
  4. II. Система культуры и её структура.
  5. II. Сравнение потоков и процессов
  6. II. СТРУКТУРА отчетА по Практике по профилю специальности
  7. II. СТРУКТУРА отчетА по УЧЕБНОЙ Практике
  8. II. Структура правовой нормы.
  9. II. Структура программы
  10. III Принципы организации производственных процессов

 

3.1 Процесс как часть системы

 

Когда пользователь запускает программу на выполнение под UNIX, система создает специальную среду для этой программы. Эта среда содержит все необходимое для системы, чтобы выполнять программу, как если бы она была единственной выполняемой в данный момент программой.

Программой называется исполняемый файл, а процессом называется последовательность операций программы или часть программы при ее выполнении. В системе UNIX может одновременно выполняться множество процессов (эту особенность иногда называют мультипрограммированием или многозадачным режимом), причем их число логически не ограничивается. Несколько процессов могут быть экземплярами одной и той же программы. Различные системные операции позволяют процессам:

- порождать новые процессы;

- завершать процессы;

- синхронизировать выполнение этапов процесса;

- управлять реакцией на наступление различных событий.

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

Вообще, использование обращений к операционной системе дает возможность пользователю создавать программы, выполняющие сложные действия, и как следствие, ядро операционной системы UNIX не включает в себя многие функции, являющиеся частью «ядра» в других системах. Такие функции, и среди них компиляторы и редакторы, в системе UNIX являются программами пользовательского уровня. Наиболее характерным примером подобной программы может служить командный процессор shell, с которым обычно взаимодействуют пользователи после входа в систему. Shell интерпретирует первое слово командной строки как имя команды (во многих командах сама команда ассоциируется с ее именем), все остальные слова в командной строке трактуются как параметры команды.

 

 

3.2 Уровни выполнения процессов

 

Выполнение пользовательских процессов в системе UNIX осуществляется на двух уровнях:

- на уровне пользователя;

- на уровне ядра.

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

Основные различия между этими двумя режимами:

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

· В режиме ядра процессам уже доступны адресные пространства ядра и пользователей. Например, виртуальное адресное пространство процесса может быть поделено на адреса, доступные только в режиме ядра, и на адреса, доступные в любом режиме.

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

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

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

Сделанный вывод будет скорее относиться к «ядру», распределяющему ресурсы, или к «ядру», производящему различные операции, и это будет означать, что процесс, выполняемый в режиме ядра, распределяет ресурсы и производит соответствующие операции. Например, командный процессор shell считывает вводной поток с терминала с помощью запроса к операционной системе. Ядро операционной системы, выступая от имени процессора shell, управляет функционированием терминала и передает вводимые символы процессору shell. Shell переходит в режим задачи, анализирует поток символов, введенных пользователем, и выполняет заданную последовательность действий, которые могут потребовать выполнения и других системных операций.

 

 

3.3 Прерывания и особые ситуации

 

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

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

 

 

3.4 Уровни прерывания процессора

 

   
 
 
 
Рис.9 Стандартные уровни прерываний

 

 


Ядро иногда обязано предупреждать возникновение прерываний во время критических действий, могущих в случае прерывания привести к порче информации. Например, во время обработки списка с указателями возникновение прерывания от диска для ядра нежелательно, т.к. при обработке прерывания можно потерять или затереть указатели. Обычно имеется ряд привилегированных команд, устанавливающих уровень прерывания процессора в слове состояния процессора. Установка уровня прерывания на определенное значение отсекает прерывания этого и более низких уровней, разрешая обработку только прерываний с более высоким приоритетом. На Рис.9 показана последовательность уровней прерывания. Если ядро игнорирует прерывания от диска, в этом случае игнорируются и все остальные прерывания, кроме прерываний от часов и машинных сбоев.

 

 

3.5 Создание процессов

 

С практической точки зрения процесс в системе UNIX является объектом, создаваемым в результате выполнения системной операции fork. Каждый процесс, за исключением нулевого, порождается в результате запуска другим процессом операции fork. Функция fork создает новый процесс. Порождаемый процесс представляет собой точную логическую копию процесса-родителя. На выходе из функции процессу-родителю возвращается код идентификации потомка, потомку – нулевое значение. Процесс, запустивший операцию fork, называется родительским, а вновь созданный процесс – порожденным.

Хотя операции fork вполне хватает на то, чтобы породить новый процесс, ее недостаточно для запуска другой программы, отличной от родительской. Для этого существует функция exec (точнее говоря, семейство функций). Функция exec не порождает новый процесс, а просто переписывает его. Другими словами, exec замещает один процесс новым. При этом идентификатор процесса не изменяется, т.е. система и родитель “видят” процесс таким, как и прежде. Операция exec оставляет все файлы открытыми, предоставляя их новому процессу. Если предварительно было произведено перенаправление стандартных файлов ввода-вывода, оно сохраняется и для нового процесса.

 

Пример

Рассмотрим программу procs.c:

 

#include <unistd.h>

#include <stdio.h>

#include <sys/types.h>

 

main()

{

pid_t Pid;

 

printf ("splitting the parent...\n");

 

if (Pid = fork() == 0)

{

/* 1 */ printf ("child %d is going to sleep...\n",Pid);

execl ("/bin/sh", "sh", "-c", "sleep 5", NULL);

/* 2 */ printf ("child woke up\n");

}

 

wait ((int*) 0);

printf ("parent %d done\n",Pid);

}

 

Процесс, выполняющийся в программе procs, запускает операцию fork, чтобы породить новый процесс. Новый процесс, именуемый порожденным процессом, являет собой точную копию процесса-родителя. Код завершения операции fork для потомка равен 0, поэтому выполняется ветка if-условия: печатается первое (/* 1 */) сообщение и вызывается операция execl. Эта операция полностью замещает порожденный процесс новым – sleep 5. В случае успешного выполнения операции execl, управление в вызвавший ее процесс не возвращается, поскольку процесс выполняется в новом адресном пространстве. При этом связь родитель-потомок не теряется. После выполнения команды sleep 5 (5-секундный сон) процесс-потомок завершается. Заметьте, что сообщение /* 2 */ не печатается, так как после завершения процесса-потомка управление родителю не передается.

Тем временем, процесс, запустивший операцию fork (родительский процесс), получает ненулевое значение кода завершения операции и вызывает операцию wait, которая приостанавливает его выполнение до тех пор, пока не закончится выполнение программы sleep 5. Затем процесс-родитель завершается. При работе программы на экран выводятся следующие сообщения:

 

splitting the parent...

child 0 is going to sleep...

parent 1 done

 

Каждый процесс имеет одного родителя, но может породить много процессов. Ядро системы идентифицирует каждый процесс по его номеру, который называется идентификатором процесса (PID).

Нулевой процесс является особенным процессом, который создается «вручную» в результате загрузки системы; после порождения нового процесса (процесс 1) нулевой процесс становится процессом подкачки. Процесс 1, известный под именем init, является предком любого другого процесса в системе и связан с каждым процессом особым образом.

 

 




Дата добавления: 2014-12-19; просмотров: 31 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.01 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав