<<
>>

Инициализация дерева процессов

Процесс init является первым пользовательским процессом и одновременно последним процессом, загружаемым как часть загрузочного образа. Глядя на рис. 1.5, можно подумать, что рост дерева процессов начинается с процесса init, однако это не совсем так.
Такое утверждение было бы верным в традиционной операционной системе, однако MINIX 3 работает несколько иначе. Во-первых, несколько системных процессов запускаются раньше, чем init. Задания CLOCK (таймер- ное задание) и SYSTEM (системное задание) — уникальные процессы, невидимые за пределами ядра. У них нет идентификаторов, и они не входят в дерево процессов. Первым процессом, выполняемым в пользовательском пространстве, является менеджер процессов. Он имеет нулевой идентификатор процесса и не является ни предком, ни потомком по отношению к каким-либо другим процессам. Предком всех прочих процессов, запущенных из загрузочного образа (например, драйверов и серверов), является сервер реинкарнации. Смысл такой структуры заключается в том, что сервер реинкарнации должен получать уведомления при необходимости перезапуска этих компонентов.

Как мы увидим далее, даже после запуска процесса init различия между построением дерева процессов в MINIX 3 и традиционных операционных системах остаются. В UNIX-подобных системах процессу init присваивается идентификатор 1, и хотя в MINIX 3 процесс init запускается не первым, для него тоже зарезервирован традиционный идентификатор 1. Как и все пользовательские процессы загрузочного образа (за исключением менеджера процессов), init является одним из потомков сервера реинкарнации. Первое, что делает процесс init, — запускает сценарий оболочки /etc/rc (это же характерно и для стандартных UNIX-подобных систем). Этот сценарий, в свою очередь, запускает дополнительные драйверы и серверы, не являющиеся частью загрузочного образа.

Любая программа, запущенная сценарием г с, является дочерней по отношению к init. Одной из первых запускается утилита service. Она тоже является потомком init, однако здесь снова начинаются отступления от традиционной схемы.

Утилита service предоставляет пользовательский интерфейс для сервера реинкарнации. Сервер реинкарнации запускает обычную программу и превращает ее в системный процесс. В частности, он запускает такие программы, как floppy (если она не использовалась ранее для загрузки системы), cmos (необходима для чтения часов реального времени) и is (информационный сервер, управляющий отладочной информацией, генерируемой по нажатию функциональных клавиш F1, F2 и др. на клавиатуре консоли). Одна из задач сервера реинкарнации — сделать все системные процессы, кроме менеджера процессов, своими потомками.

После запуска драйвера устройства cmos сценарий г с может инициализировать часы реального времени. К этому моменту все необходимые файлы должны присутствовать на корневом устройстве. Серверы и драйверы находятся в каталоге /sbin, а остальные команды, нужные для запуска, — в каталоге /bin. По завершении начальных шагов запуска выполняется монтирование других файловых систем, таких как /usr. Важной функцией сценария гс является проверка наличия повреждений файловых систем, которые могли появиться в результате последней аварии системы. Тест прост — если система завершает свою работу корректно, посредством команды shutdown, в журнал истории загрузки /usr/ adm/wtmp добавляется запись. Команда shutdown -С проверяет, является ли последняя запись wtmp записью завершения работы. Если нет, предполагается, что система закончила работу аварийно, и для проверки всех файловых систем запускается утилита f sek. Последняя функция сценария /etc/rc — запуск демонов. Эта функция может выполняться при помощи вспомогательных сценариев. Если вы изучите данные, выводимые командой ps axl, предназначенной для вывода идентификаторов PID (Process IDentifier — идентификатор процесса) и PPID (Parent Process IDentifier — идентификатор родительского процесса), вы увидите, что демоны update и usyslogd обычно находятся среди первых постоянных процессов, являющихся потомками init.

Наконец, init считывает файл /etc/ttytab, в котором перечислены все возможные терминальные устройства. Если какое-либо устройство может быть использовано как терминал для входа в систему (в стандартной поставке это только консоль и не более трех виртуальных консолей, хотя вы можете добавлять последовательные линии и сетевые псевдотерминалы), то в файле /etc/ttytab у него присутствует запись в поле getty. Для каждого такого терминала init запускает дочерний процесс. Обычно каждый из этих дочерних процессов запускает программу /usr/bin/getty, которая выводит приглашение и ждет, когда пользователь введет свое имя. Если же для определенного терминала требуются какие-то специальные действия (например, телефонное подключение), то в /etc/ttytab можно указать команду (например, /usr/bin/stty), которая будет выполнена перед запуском getty.

Когда пользователь вводит свое имя для входа в систему, запускается процесс /bin/login, которому в качестве аргумента передается имя пользователя. Процесс login определяет наличие пароля, при необходимости запрашивает и сверяет его. После успешного входа процесс login запускает пользовательскую оболочку. По умолчанию используется оболочка /bin/sh, однако в файле /etc/ passwd можно указать другую оболочку. Оболочка воспринимает и интерпретирует вводимые пользователем команды, запуская для их исполнения новые процессы. Таким образом, оболочки являются прямыми потомками процесса init, пользовательские процессы являются его «внуками», а все процессы вместе образуют единое дерево. Фактически, в дерево входят все процессы (пользовательские и системные), кроме внутренних заданий ядра и менеджера процессов. Тем не менее, в отличие от традиционных операционных систем семейства UNIX, init не является корнем дерева процессов, а структура дерева не позволяет определить порядок запуска процессов.

Для управления процессами в MINIX 3 предназначены два основных системных вызова: fork и ехес. Сделать вызов fork — это единственный способ создать новый процесс. Вызов ехес позволяет процессу запустить указанную программу. При запуске программы ей выделяется объем памяти, указанный в ее заголовке. Этот объем памяти удерживается за программой все время работы, хотя распределение памяти между сегментом данных, сегментом стека и неиспользованным пространством может меняться динамически.

Вся информация о процессах хранится в таблице процессов, поля которой поделены между ядром, менеджером памяти и файловой системой. Когда появляется новый процесс (благодаря вызову fork) или же когда процесс завершается (по системному вызову exit или по сигналу), то прежде всего свои поля в таблице процессов обновляет менеджер процессов. Затем он посылает ядру и файловой системе сообщения с указаниями поступить таким же образом.

2.5.3.

<< | >>
Источник: Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание. 2007

Еще по теме Инициализация дерева процессов:

  1. 3.11.10. Облако и Дерево
  2. О друзьях-деревьях
  3. Дерево упало
  4. Построение дерева целей.
  5. Над деревьями
  6. И НА КАМНЯХ РАСТУТ ДЕРЕВЬЯ
  7. ИДЕЯ 41 ДЕРЕВО, СПОСОБНОЕ ВЫДЕРЖАТЬ УРАГАН
  8. Глава 12 О ТОМ, КАК ТВОРИТ ДЕРЕВО
  9. Призыв к пробуждению от Красных Деревьев
  10. Предложение №2 Полазай по своему дереву
  11. Очерк 2: Берт «Процесс — вот мое достояние. Именно процесс создает успех»
  12. Задания, мешающие когнитивному процессу (ЗМКП), и задания, помогающие когнитивному процессу (ЗПКП)
  13. ПРОЦЕСС НЕРВНЫЙ
  14. ПРОЦЕСС НАДСОЗНАТЕЛЬНЫЙ
  15. Психические процессы