166
SIGQUIT Сигнал 3 — QUIT — выход; при нажатии Ctrl-\.
SIGTERM Сигнал 15 — TERMinate — прекратить: требует немедленного прекращения работы процесса.
SIGKILL Сигнал 9 — KILL — убить: ни одна программа не может перехватить или игнорировать этот сигнал.
Для просмотра номеров PID и состояний процессов используются ряд утилит.
ps |
Process status — состояние процессов. Выводит на консоль список |
|
процессов, включая PID. Формат вывода зависит от используемых ключей. |
top |
Интерактивная программа, соответствующая вызову ps -aux, отображающая |
|
процессы в порядке уменьшения потребляемого ими процессорного |
|
времени. Перед списком процессов выводится статистика различных |
|
характеристик задач и потребляемых ими ресурсов ЭВМ. |
В режиме пользователя обычно выполняется множество процессов, значимость которых (приоритет) может быть различным и подлежит достаточно сложной настройке.
Пользователь может изменять приоритет выполняемых процессов используя уровни тактичности.
Тактичность — целочисленное значение влияющее на количество процессорного времени, выделяемого процессу относительно других процессов.
В Linux, значения тактичности лежат в пределах от -20 до +20: -20 — максимальный приоритет; +20 — минимальный приоритет.
Обычный процесс при запуске получает приоритет 0.
Чтобы запустить процесс с измененной тактичностью, используется команда:
nice [ -приращение ] команда аргументы
Для изменения приоритетов запущенных процессов, используется команда:
renice приращение [[ -p ] PID... ] [[ -g ] PGRP...] [[ -u ] username]
Замечание
Повышать приоритет процессов может только пользователь root.
Для управления процессами также используются команды: прерывания — нажатие клавиш Ctrl-Z;
bg — перевод процесса в фоновый режим;
fg — перевод процесса в приоритетный режим.
167
Изучив управление процессами на макроуровне, что позволяет нам успешно использовать системные и прикладные средства работы с ОС, рассмотрим основные возможности самого процесса влиять на себя и другие процессы.
Сам процесс самостоятельно способен реализовать лишь некоторый набор алгоритмов по обработке данных, которые ему доступны непосредственно: объявленные переменные, массивы, структуры и подобное.
Максимально, самостоятельные возможности процесса можно расширить до уровня возможностей всех библиотек, которые он использует.
Весь другой функциональный потенциал процесса обеспечивается:
•напрямую, посредством системных вызовов к ядру ОС;
•косвенно, посредством взаимодействия с другими процессами, которое также
осуществляется через ядро ОС.
Таким образом, управление процессом из него самого:
•осуществляется посредством системных вызовов к ядру ОС;
•определяется свойствами самого процесса в системе.
Основные свойства процесса:
•уникальная идентификация (PID) и наличие контекста в ядре ОС;
•подверженность «жизненному циклу»: создание, функционирование и завершение;
•существование в оперативной памяти ЭВМ, выделенной для пользовательского режима работы ОС;
•сегментация структуры: сегмент кода, сегменты инициализированных и не-
инициализированных данных, а также по одному сегменту стека на каждую нить (thred) процесса.
Воздействуя на каждое из свойств процесса, можно управлять им.
Наличие в пользовательском пространсте ОС множества взаимодействующих процессов, каждый из которых может управляться по отдельному свойству, приводит к большому многообразию возможных системных вызовов к ядру ОС.
Чтобы упорядочить и, по возможности, минимизировать тупиковые ситуации между поцессами, системные вызовы к ядру ОС группируются, как было ранее показано на рисунке 6.2, на три большие части:
•планировщик, отслеживающий контест процесса и его «жизненный цикл»;
•подсистему распределения памяти, которая в частности, обеспечивает функции для динамического выделения памяти процессам;
•подсистему взаимодействия процессов, в которую кроме сигналов включа-
ются функции синхронизации в виде семафоров, разделяемая память и передача сообщений.
Вданном подразделе, мы ограничимся только функциями планировщика, обеспечивающими поддержку «жизненного цикла процесса».
168
Системный вызов fork(…) - обеспечивает порождение нового (дочернего процесса). В случае неудачи, возвращает -1.
Дочерний процесс получает 0.
Родительский процесс получает PID дочернего процесса. Системный вызов:
#include <unistd.h> pid_t fork(void);
Системный вызов _exit(…) - обеспечивает завершение процесса, вызвавшего его, удаляет PID процесса из таблицы (списка) процессов и передает родительскому процессу значение статуса завершения.
#include <unistd.h> void _exit(int status);
Системный вызов wait(…) - используется родительским процессом для ожидания завершения дочернего процесса и получения его PID.
#include <sys/types.h>
#include <sys/wait.h> pid_t wait(int *status);
Системный вызов exec(…) - обеспечивает различные варианты вызовов для модификации процесса.
#include <unistd.h> extern char **environ;
int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[],
char *const envp[]);
Замечание
Внешняя переменная (двойной указатель) environ обеспечивает доступ к переменным среды пользователя.
169
Вактивной форме (выполняться) процесс может только в оперативной памяти ЭВМ или ОЗУ.
ОЗУ — оперативное запоминающее устройство, которое часто называют основной памятью (ОП) ЭВМ.
Причина такой ситуации хорошо продемонстрирована на рисунке 6.8, где показано, что процессор:
•может выполнять только команды, находящиеся в оперативной памяти ЭВМ;
•взаимодействует с ОП через блок управления памятью (MMU).
MMU — Memory Managment Unit — устройство управления памятью.
Рисунок 6.8 — Управление памятью ЭВМ
Замечание
В ЭВМ, которые не имеют аппаратной реализации MMU, выполняется эмуляция его работы программой, находящейся в некоторой области ОП.
Назначение MMU — преобразование для процессора логических адресов ОП в
физические и — обратно.
Цель функционирования MMU — создание для нужд процессора виртуального (относительного) пространства памяти, в котором он работает.
Необходимость подобной аппаратной (или программно-эмулируемой) архитектуры ЭВМ вызвана потребностью:
•реализации для ОС мультипрограммного режима работы, требующего переносимости в адресном пространстве ОП кода и данных процессов;
•использования для целей программирования языков высокого уровня, например, языка С, которые используют символьные имена переменных не привязанных к абсолютным адресам ОП.
170
Относительность физической адресации ОП обеспечивается ее сегментной или
страничной организацией и в данной части дисциплины не рассматривается.
Относительность логической адресации процессора обеспечивается, например, для процессоров x86, наличием:
•сегментных регистров CS, DS, ES и SS, которые ссылаются на строки дескрипторных таблиц памяти, содержащих адреса начала сегментов памяти;
•регистров смещений IP, AX, BX, CX и других, адресующих ОП относитель-
но начала соответствующих сегментов
Относительность логической адресации процесса обеспечивается, как показано на рисунке 6.9:
•транслятором исходного текста программы, создающим объектный код программы с относительной адресацией;
•перемешающим загрузчиком, привязывающим части кода и данных процесса к конкретным адресам ОП.
Рисунок 6.9 — Виртуальные адреса процесса
Замечание
Все многобразие способов адресации и размещения процессов в ОП выходит за рамки нашей темы. Как уже было показано на рисунке 6.2, в подсистеме управления процессами выделена специальная подсистема: распределение памяти, отвечающая за все эти вопросы и предназначенная для сокрытия всех сложных особенностей работы процесса с памятью.
Активный (функционирующий) процесс сам, целиком или частично, находится в ОП, поэтому его возможности по управлению памятью естественным образом ограничены. Чтобы показать, какие возможности у него имеются, рассмотрим обобщенную структуру процесса, на примере ОС Linux.