
- •Лекция-1:
- •Лекция-2:
- •Лекция-3:
- •Лекция-4:
- •Лекция-5:
- •Лекция-6:
- •Лекция-7:
- •Лекция-8:
- •Лекция-9:
- •Лекция-10:
- •Лекция-11:
- •Лекция-12:
- •Лекция-13:
- •Лекция-14:
- •Лекция-14:
- •Лекция-15:
- •Лекция-16:
- •Лекция-17:
- •Лекция-18:
- •Лекция-19:
- •Применение алгоритма банкира
- •Лекция-20:
- •Лекция-21
- •Лекция-22
- •Лекция-23
- •Лекция-24
Лекция-4:
Процессы UNIX
В ОС UNIX процессы занимают одно из важнейших мест. От оптимальной настройки системы управления процессами и числа одновременно выполняемых процессов зависит загрузка процессора, что влияет на общую производительность системы.
Ядро ОС предоставляет задачам базовый набор услуг, определяемых базовым интерфейсом вызовов. К ним относятся основные операции работы с файлами, управления процессами и памятью, поддержка межпроцессового взаимодействия.
Под программой можно понимать совокупность файлов (тексты программы, объектные файлы, выполняемые файлы). Перед запуском программы на выполнение ОС должна создать окружение (среду выполнения задачи). Сюда относятся ресурсы памяти и возможность доступа к устройствам ввода/вывода и различным системным ресурсам, включая услуги ядра.
Процесс можно представить как совокупность данных ядра системы, необходимых для описания программы в памяти и управления её выполнением, или как программу, на стадии выполнения, т.к. все выполняющиеся программы предоставлены в ОС UNIX в виде процессов.
Процесс состоит из инструкций, выполняемых процессором, данных и информации о выполняемой задаче. Процесс не отождествляется с программой, т.к. программа может породить более одного процесса.
Выполнение процесса заключается в точном следовании набору инструкций, который никогда не передаёт управление другому процессу. Процессу также недоступны данные и стеки других процессов. Но процессы могут обмениваться друг с другом данными с помощью системы межпроцессового взаимодействия, предоставляемой ОС UNIX. К этой системе относятся сигналы, каналы, разделяемая память, семафоры, сообщения, файлы. В остальном процессы изолированы.
Типы процессов
Системные процессы
Системные процессы являются частью ядра ОС и всегда находятся в оперативной памяти. Они не имеют соответствующих программ в виде исполняемых файлов и запускаются особым образом при инициализации ядра системы. Инструкции и данные этих процессов находятся в ядре системы, и они могут обращаться к функциям и данным, недоступным для остальных процессов.
Системными процессами являются:
shed диспетчер свопинга
vhand диспетчер страничного замещения
bd f flush диспетчер буферного кэша
kmadaemon диспетчер памяти ядра
К системным также можно отнести процесс init (хотя он не является частью ядра и его запуск производится из специального файла в /etc) являющийся прародителем всех остальных процессов.
Демоны
Демоны не интерактивные процессы, которые запускаются обычным образом (загрузка соответствующей программы) и выполняются в фоновом режиме Обычно демоны запускаются при инициализации системы и обеспечивают работу различных подсистем (терминального доступа, печати, сетевого доступа и т.д.)
Демоны не связаны ни с одним пользовательским сеансом и не могут непосредственно управляться пользователем. Большую часть времени демоны находятся в состоянии ожидания, пока какой-нибудь процесс не запросит определённую услугу.
Прикладные процессы
К ним относятся все остальные процессы, выполняющиеся в системе. В большинстве случаев это процессы, порожденные в рамках пользовательского сеанса работы.
Важнейших пользовательский процесс командный интерпретатор (shell), который запускается после регистрации пользователя в системе, а его завершение приводит к отключению пользователя от системы.
Пользовательские процессы могут выполняться как в интерактивном, так и в фоновом режиме, но время их жизни ограничено временем работы пользователя. При выходе из системы все пользовательские процессы уничтожаются.
Интерактивные процессы монопольно владеют терминалом. И пока такой процесс не завершит работу, пользователь не может работать с другими процессами, если в функции интерактивного процесса не входит запуск на выполнение других программ.
Атрибуты процесса
Идентификатор процесса (PID). Каждый процесс имеет уникальный идентификатор, позволяющий ядру системы различать процессы. Когда создается новый процесс, ядро присваивает ему следующий свободный идентификатор. Присваивание идентификаторов происходит по нарастанию, т.е. идентификатор следующего процесса больше идентификатора процесса, созданного перед ним. Если идентификатор достигает максимально возможного значения, то следующий процесс получит минимальный свободный идентификатор и цикл повторится. Когда процесс завершает свою работы, ядро освобождает занятый им идентификатор.
Идентификатор родительского процесса (PPID) идентификатор процесса, породившего данный процесс.
Приоритет процесса (NiceNumber). Относительный приоритет процесса учитывается планировщиком задач при определении очерёдности запуска. Фактическое распределение процессорных ресурсов определяется приоритетом выполнения, зависящим от нескольких факторов (в том числе и от задания относительного приоритета). Относительный приоритет не изменяется системой на всём протяжении жизни процесса, но может быть изменён пользователем или администратором, а приоритет выполнения динамически обновляется ядром.
Терминальная линия (TTY) терминал (псевдотерминал), ассоциированный с процессом. Демоны не имеют ассоциированного терминала.
Реальный (RID) и эффективный (EUID) идентификаторы пользователя. Реальный идентификатор идентификатор пользователя, запустившего процесс, а эффективный идентификатор используется для определения прав доступа процесса к системным ресурсам. Обычно, реальный и эффективный идентификаторы идентичны. Однако есть возможность задать процессу более широкие права, путём установки флага SUID. В этом случае процесс получает значение идентификатора владельца выполняемого файла.
Реальный (RGID) и эффективный (EGID) идентификаторы группы. Реальный идентификатор группы равен идентификатору первичной группы пользователя, запустившего процесс. Эффективный идентификатор служит для определения права доступа к системным ресурсам по классу доступа групп. Также можно его модифицировать с помощью SUID.
Программы в OS UNIX
Выполнение программы начинается с создания в памяти её образа и связывания с процессом структур ядра ОС, инициализации и передачи управления инструкциям программы. Завершение программы приводит к освобождению памяти и соответствующих структур ядра. Образ программы в памяти содержит сегменты инструкций и данных, созданных компилятором, а также стек, которым пользуется программа в ходе выполнения.
Заголовок программы может выглядеть или так:
main (int argc; char *argv[]; char *envp[])
или так:
extern char **environ; // глобальная переменная, указывающая на строки с переменными окружения.
main (int argc; char *argv[])
argc определяет число параметров, переданных программе, включая её имя. Указатели на каждый из этих параметров хранятся в массиве, являющемся указателем на эти аргументы.
Второй массив массив указателей на переменные окружения, передаваемые программе. Каждая переменная содержит строку вида:
HOME=/home/student/851003
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
void main(int argc, char *argv[])
{
char *term;
char buf[200], var[200];
if ((term=getenv("MYVAR"))==NULL)
{
printf("Переменная MYVAR не определена. Введите значение: ");
gets(buf);
sprintf(var,"MYVAR=%s",buf);
putenv(var);
printf("Новое значение %s \n",var);
}
else
{
printf("MYVAR=%s | Изменить? ",term);
gets(buf);
if (buf[0]=='Y' || buf[0]=='y')
{
printf("Новое значение: ");
gets(buf);
sprintf(var,"MYVAR=%s",buf);
putenv(var);
printf("Новое значение MYVAR=%s",var);
}
}
}
char *getenv (const char *name);
int putenv(const char *string);