Самодел 2 (1114717), страница 6
Текст из файла (страница 6)
Нечеткая граница между распределенными приложениями и распределенными функциями.
Иногда к этой категории относят мультипроцессорные системы.
Мультипроцессорная система – сетевая ОС, у которой распределенными функциями являются управление процессами и общая файловая система.
2. Управление процессами
2.1. Основные концепции
Процесс - совокупность машинных команд и данных, которая обрабатывается и исполняется в рамках вычислительной системы и обладает правами на владение некоторым набором ресурсов.
Ресурсы могут принадлежать только одному процессу, либо ресурсы могут разделяться между процессами – разделяемые ресурсы. В последнем случае возникает проблема выбора стратегии доступа к распределенным ресурсам (например, оперативной памяти).
Выделение ресурсов процессу:
-
предварительная декларация – до начала выполнения
например запрос куска памяти, доступ к области файловой системы, режим использования (временное/статическое хранение данных)
-
динамическое пополнение списка принадлежащих процессу ресурсов
декларация по факту использования
Если процесс зациклится, то со временем система понизит ему приоритет.
Количество допустимых процессов в системе – ресурс ВС.
Жизненный цикл процесса
С момента запуска и до завершения выполнения процесс может находиться в различных активных или пассивных состояниях, которые в совокупности описывают жизненный цикл процесса в вычислительной системе. Количество и характеристики таких состояний могут меняться в зависимости от конкретной вычислительной системы. Можно выделить несколько основных состояний процесса:
-
Образование (порождение) процесса
состояние процесса, когда он уже создан, но не готов к запуску, при этом создаются информационные структуры, описывающие данный процесс; загружается кодовый сегмент процесса в оперативную память или в область свопинга.
-
Обработка (выполнение) процесса
активное состояние процесса, во время которого процесс обладает всеми необходимыми ресурсами и непосредственно выполняется процессором;
-
Ожидание (по тем или иным причинам) постановки на выполнение
пассивное состояние процесса, процесс заблокирован, он не может выполняться по своим внутренним причинам, т.е. он ждет осуществления некоторого события, например, завершения операции ввода-вывода, получения сообщения от другого процесса, освобождения какого-либо необходимого ему ресурса;
-
Завершение процесса
конечное состояние в жизненном цикле процесса, процесс выгружается из памяти, и разрушаются все структуры данных, связанные с ним.
Жизненный цикл любого процесса начинается с момента его создания, когда он попадает в очередь готовых к выполнению процессов. Жизненный цикл процесса во всех состояниях, кроме собственно выполнения, всегда связан с той или иной очередью, количество которых также зависит от операционной системы. Основной причиной попадания процесса в ту или иную очередь является невозможность взаимодействия с тем или иным устройством (это может быть как центральный процессор, так и любое устройство ввода-вывода) в данный момент времени. Поэтому основные состояния процесса описываются набором очередей в операционной системе: очередь на начало обработки, очередь готовых процессов, очередь заблокированных процессов. Последняя есть совокупность очередей, связанных с ожиданием использования конкретных ресурсов в вычислительной системе. Количество таких очередей меняется в зависимости от конкретной архитектуры или операционной системы. Это множество очередей может состоять из очередей распределения процессов по функциональным устройствам, времени ЦП, доступа к внешним или внутренним устройствам ввода-вывода, памяти. Итак, жизненный цикл процесса есть совокупность состояний, которые в основном характеризуются либо работой процесса, либо ожиданием в какой-либо очереди.
Модельная ОС
Буфер ввода процессов (БВП) – пространство, в котором размещаются и хранятся сформированные процессы от момента их образования, до момента начала выполнения.
Буфер обрабатываемых процессов (БОП) - буфер для размещения процессов, находящихся в системе в мультипрограммной обработке.
Модель пакетной однопроцессной системы
0. Поступление процесса в очередь на начало обработки ЦП
(процесс попадает в БВП, причем в БОП может быть только один процесс).
1. Начало обработки процесса на ЦП (из БВП в БОП).
2. Завершение выполнения процесса, освобождение системных ресурсов.
Примеры таких ОС можно найти в старых операционных системах, например, DOS.
М
одель пакетной мультипроцессной системы и системы с разделением времени
-
Поступление процесса в очередь на начало обработки ЦП (процесс попадает в БВП)
-
Начало обработки процесса на ЦП (из БВП в ВОП)
-
Процесс прекращает обработку ЦП по причине ожидания операции ввода/вывода или прерывания, поступает в очередь до завершения операции обмена/обработки прерывания (БОП).
-
Операция обмена завершена и процесс поступает в очередь ожидания продолжения выполнения ЦП (БОП).
-
Выбирается процесс для выполнения на ЦП.
-
(Этот пункт есть только в случае ОС с разделением времени.) Процесс прекращает обработку ЦП, но в любой момент может быть продолжен (истек квант времени ЦП, выделенный процессу). Поступает в очередь процессов, ожидающих продолжения выполнения центральным процессором (БОП). В модификации ОС с разделением времени заблокированный процесс может быть перекачен (своппирован) на внешний носитель, а на освободившееся место может быть подкачен процесс с внешнего носителя, который был откачен ранее, либо взят новый.
-
Завершение выполнения процесса, освобождение системных ресурсов.
Системе приходится всё время следить за запусками процессов из БВП и выбирать стратегии запусков процессов из БВП и БОП.
Типы процессов.
-
“полновесные” процессы
-
“легковесные” процессы
«Полновесные процессы » - это процессы, выполняющиеся внутри защищенных участков памяти операционной системы, то есть имеющие собственные виртуальные адресные пространства для статических и динамических данных.
«Легковесные процессы» - нити - работают в мультипрограммном режиме одновременно с активировавшей их задачей и используют ее виртуальное адресное пространство.
То есть нити - это такие сопрограммы, работающие в незащищенных участках памяти. Нити могут работать асинхронно. В одной защищенной области памяти могут работать одна и более нитей. Если их много, то они не защищены друг от друга. Таким образом, организация процесса может быть однонитевой и многонитевой. Классическое определение процесса подразумевает однонитевую организацию.
Понятие «процесс».
Понятие «процесс » включает в себя следующее:
-
исполняемый код;
-
собственное адресное пространство, которое представляет собой совокупность виртуальных адресов, которые может использовать процесс (доступ к нему может быть только у этого процесса или разделяться несколькими)
-
ресурсы системы, которые назначены процессу ОС;
-
хотя бы одну выполняемую нить.
Контекст процесса.
Каждая ОС сопоставляет процессу контекст (в информационных полях и пр.).
Контекст процесса – совокупность данных, характеризующих актуальное состояние процесса:
-
Пользовательская составляющая – текущее состояние программы (совокупность машинных команд, размещенных в ОЗУ)
-
Системная составляющая:
-
информация идентификационного характера (PID процесса, PID «родителя»…)
-
информация о содержимом регистров (РОН, индексные регистры, флаги...)
-
информация, необходимая для управления процессом (состояние процесса, приоритет...)
-
-
Процессы в ОС UNIX.
Понятие процесса в UNIX
Рассмотрим упрощенную модель (современные UNIX используют технологию нитей).
Тогда понятие процесса в UNIX может быть в различных реализациях следующее:
В
ОС есть таблица процессов (системных и пользовательских), каждая запись которой имеет свой размер, свой номер (от 0 до некоторого значения) и идентификатор (PID) – уникальный номер, соответствующий этому процессу. Количество процессов в системе ограничено размером этой таблицы, оно характеризует мощность ВС.
Рассмотрим процесс, как объект, зарегистрированный в таблице процессов.
Контекст процесса
Разделение сегмента кода
В системе может работать несколько пользователей. Они могут быть объединены в группы. В UNIX есть запись о каждом пользователе – User ID. У пользователей есть права доступа к файлам – на чтение, запись и исполнение. В каждом файле есть информация о идентификатора пользователя, владеющего им, его правах, правах других пользователей его группы и правах остальных.
Базовые средства организации и управления процессами
Рассмотрим процесс, как объект, порожденный системным вызовом fork().
Создание нового процесса
Для порождения новых процессов в UNIX существует единая схема, с помощью которой создаются все процессы, за исключением процессов с PID=0 и PID=1. Для этого используется системный вызов fork().
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
Fork() возвращает целое значение pid_t, которое равно:
-
При удачном завершении:
- сыновнему процессу значение 0
- родительскому процессу PID порожденного процесса
-
При неудачном завершении –1, код ошибки устанавливается в переменной errno
При выполнении системного вызова fork():
-
Заносится новая запись в таблицу процессов
-
Новый процесс получает уникальный идентификатор
-
Создание контекста для сыновнего процесса
Наследуются от родительского процесса:
-
Окружение
-
Файлы, открытые в процессе-отце
-
Способы обработки сигналов
-
Разрешение переустановки эффективного идентификатора пользователя
-
Разделяемые ресурсы процесса-отца
-
Текущий рабочий каталог и домашний каталоги
-
...
Не наследуются от родительского процесса:
-
Идентификатор процесса (PID)
-
Идентификатор родительского процесса (PPID)
-
Сигналы, ждущие доставки в родительский процесс
-
Время посылки ожидающего сигнала, установленное системным вызовом alarm()
-
Б
локировки файлов, установленные родительским процессом
По завершении системного вызова fork() каждый из процессов – родительский и порожденный – получив управление, продолжит выполнение с одной и той же точки, где происходит возврат из системного вызова fork(). Возникает проблема различения сыновнего и родительского процессов, так как сегменты кода у них идентичны. Благодаря тому, что fork() возвращает выше указанные значения, программист имеет возможность разделить путь выполнения инструкций в этих процессах.
Примеры:
int main (int argc, char **argv)
{
printf("PID=%d; PPID=%d \n", getpid(), getppid());
fork();
printf("PID=%d; PPID=%d \n", getpid(), getppid());
}
pid_t getpid() – возвращает процессу его PID.
pid_t getppid() – возвращает PID процесса, его породившего.
При выполнении первой строчки из main в stdout процесса запишется PID этого процесса и PID процесса, его породившего. После вызова fork() родительский процесс допишет еще одну строчку, точно такую же, как до этого, а сыновний – свой PID и PID родительского процесса (тот самый, который предыдущий рассмотренный процесс записал первым, если он не завершится раньше сына). Следует отметить, что заранее нельзя сказать, кому из процессов первому передастся управление => кто из них первый запишет свою строчку.
int main (int argc, char **argv)
{
char ch, first, last;
int pid;
if ((pid=fork())>0) {