DataLife Engine > Управление процессами > Компоненты процесса

Компоненты процесса


30-09-2009, 04:09. Разместил: admin

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

В структурах данных ядра хранится различная информация о каждом процессе. К наиболее важным сведениям относятся:

  • таблица распределения памяти процесса;

  • текущий статус процесса (неактивен, приостановлен, выполняется и т.п.);

  • приоритет выполнения процесса;

  • информация о ресурсах, которые используются процессом;

  • маска сигналов процесса (запись о том, какие сигналы блокируются);

  • идентификатор владельца процесса.

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

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

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

 

Идентификатор процесса (PID)

 

Каждому новому процессу, созданному ядром, присваивается уникальный идентификатор (Process ID, PID). Большинство команд и системных вызовов, работающих с процессами, требуют указания конкретного идентификатора, чтобы был ясен контекст операции. Идентификационные номера присваиваются процессам по порядку по мере их создания. Когда номера заканчиваются, ядро сбрасывает счетчик в единицу и снова начинает присваивать их по порядку, пропуская те идентификаторы, которые еще используются.

 

Идентификатор родительского процесса (PPID)

 

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

Исходный процесс в терминологии UNIX называют родительским, а его клон — порожденным или дочерним. Помимо собственного идентификатора, каждый процесс имеет атрибут PPID (Parent Process ID), который равен идентификатору родительского процесса, породившего данный процесс.

 

Идентификатор пользователя (UID) и эффективный идентификатор пользователя (EUID)

 

UID (User ID) — это идентификатор пользователя, создавшего данный процесс, или, точнее, это копия значения EUID родительского процесса. Вносить изменения в процесс могут только его создатель (владелец) и пользователь root.

EUID (Effective User ID) — это "эффективный" пользовательский идентификатор процесса. Он используется для того, чтобы определить, к каким ресурсам и файлам у процесса есть право доступа в данный конкретный момент. У большинства процессов значения UID и EUID будут одинаковыми. Исключение составляют программы с установленным битом смены идентификатора пользователя (SUID).

Зачем нужны два идентификатора? Просто потому, что имеет смысл разграничить понятия персонификации и прав доступа. Программа, у которой установлен бит SUID, не всегда хочет выполняться с расширенными привилегиями. В большинстве систем значение EUID можно устанавливать и сбрасывать, чтобы предоставить процессу дополнительные полномочия или отобрать их.

 

Идентификатор группы (GID) и эффективный идентификатор группы (EGID)

 

GID (Group ID) — это идентификатор группы, к которой относится владелец процесса. Эффективный идентификатор группы (Effective Group ID, EGID) связан с атрибутом GID так же, как значение EUID — с UID. Если процесс попытается обратиться к файлу, который ему не принадлежит, ядро автоматически проверит, можно ли предоставить процессу соответствующие разрешения на основании эффективного идентификатора группы.

 

В некоторых системах процесс одновременно может относиться к нескольким группам. В этом случае атрибуты GID и EGID представляют собой списки идентификаторов групп. Если пользователь пытается получить доступ к какому-либо ресурсу, весь список проверяется на предмет того, принадлежит ли этот пользователь к группе, члены которой имеют право использовать данный ресурс.

 

Приоритет и значение nice

 

От приоритета процесса зависит, какую долю времени центрального процессора он получит. Ядро применяет динамический алгоритм назначения приоритетов, учитывающий, сколько времени центрального процессора уже использовал процесс и сколько времени он ожидает своей очереди. Кроме того, учитывается заданный административным путем так называемый фактор уступчивости (устанавливается с помощью команды nice), определяющий, в какой степени программа может "делиться" процессором с другими программами. Чем выше значение nice, тем "уступчивее" программа. Подробнее этот механизм рассматривается в параграфе 4.6.

 

Управляющий терминал

 

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


Вернуться назад