Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
chast2.doc
Скачиваний:
11
Добавлен:
06.11.2018
Размер:
523.26 Кб
Скачать

Атрибуты процесса Идентификатор процесса (pid)

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

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

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

Исходный процесс в терминологии ОС UNIX называют родительским, а его клон – порожденным. Помимо собственного идентификатора, каждый процесс имеет атрибут РРID, т.е. идентификатор своего родительского процесса.

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

UID – это идентификационный номер пользователя, создавшего данный процесс. Вносить изменения в процесс могут только его создатель и привилегированный пользователь. Система учета относит на счет создателя процесса все ресурсы, которые использует его процесс.

EUID – это «эффективный» UID процесса. ЕUID используется для того, чтобы определить, к каким ресурсам и файлам у процесса есть право доступа. У большинства процессов UID и ЕUID будут одинаковыми. Исключение составляют программы, у которых установлен бит смены идентификатора пользователя (см. об SUID в разделе, посвященном установлению прав доступа на файлы и каталоги).

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

GID – это идентификационный номер группы данного процесса. Допустимые идентификаторы групп указываются в файле /etc/group и в поле GID файла tc/passwd. Когда процесс запускается, его GID устанавливается равным GID родительского процесса.

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

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

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

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

Непосредственно установить внутренний приоритет невозможно, но можно установить так называемое значение nice, которое существенно влияет на внутренний приоритет. Кроме того, внутренний приоритет зависит от того, сколько времени центрального процессора уже использовал процесс и от времени ожидания своей очереди на выполнение.

Жизненный цикл процесса

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

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

  • у нового процесса свой PID;

  • PPID нового процесса равен PID родителя;

  • учетная информация нового процесса обнулена;

  • у нового процесса имеется свой собственный экземпляр дескрипторов файлов.

Когда система загружается, ядро самостоятельно создает несколько процессов. Наиболее важный из них – процесс (демон) init, PID которого всегда равен 1. Этот процесс отвечает за вызов shell для выполнения сценариев запуска rc, если Ваша система их использует. Все процессы, кроме тех, которые создает ядро, являются потомками init.

После обработки файлов запуска процесс init запускает для каждого виртуального терминала процесс getty.

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

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

Этот механизм работает нормально, если родительский процесс завершается позже порожденных им процессов и добросовестно вызывает wait для того, чтобы все процессы - зомби умерли. Если же родительский процесс умирает первым, то ядро понимает, что вызова wait не последует, и дарит всех зомби процессу init. Процесс init обязан принять этих «осиротевших» зомби и выполнить вызов wait, необходимый для того, чтобы ликвидировать их. Иногда init не выполняет свои обязанности как следует, и зомби остаются в системе. Но каких-либо проблем при этом они не создают.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]