<<
>>

Фундаментальные концепции

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

Linux представляет собой многозадачную систему и несколько независимых процессов могут работать одновременно. Более того, у каждого пользователя может быть одновременно несколько активных процессов, так что в большой системе могут одновременно работать сотни и даже тысячи процессов. Фактически на большинстве однопользовательских рабочих станций (даже когда пользователь куда-либо отлучился) работают десятки фоновых процессов, называемых демонами (daemons). Они запускаются при загрузке системы из сценария оболочки.

Типичным демоном является cron.

Он просыпается раз в минуту, проверяя, не нужно ли ему что-то сделать. Если у него есть работа, он ее выполняет, а затем отправляется спать дальше (до следующей проверки).

Этот демон позволяет планировать в системе Linux активность на минуты, часы, дни и даже месяцы вперед. Например, представьте, что пользователю назначено явиться к зубному врачу в 15.00 в следующий вторник. Он может создать запись в базе данных демона cron, чтобы тот просигналил ему, скажем, в 14.30. Когда наступают назначенные день и время, демон cron видит, что у него есть работа, и в нужное время запускает программу звукового сигнала (в виде нового процесса).

Демон cron также используется для периодического запуска задач, например ежедневного резервного копирования диска в 4.00 или напоминания забывчивым пользователям каждый год 31 октября купить новые «страшненькие» товары для веселого празднования Хэллоуина.

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

Процессы создаются в операционной системе Linux чрезвычайно просто. Системный вызов fork создает точную копию исходного процесса, называемого родительским процессом (parent process) . Новый процесс называется дочерним процессом (child process). У родительского и у дочернего процессов есть собственные (приватные) об

разы памяти. Если родительский процесс впоследствии изменяет какие-либо свои переменные, то эти изменения остаются невидимыми для дочернего процесса (и наоборот).

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

Тот факт, что образы памяти, переменные, регистры и все остальное у родительского и дочернего процессов идентичны, приводит к небольшому затруднению: как процессам узнать, какой из них должен исполнять родительский код, а какой — дочерний? Секрет в том, что системный вызов fork возвращает дочернему процессу число 0, а родительскому — отличный от нуля PID (Process IDentifier — идентификатор процесса) дочернего процесса. Оба процесса обычно проверяют возвращаемое значение и действуют так, как показано в листинге 10.1.

Листинг 10.1. Создание процесса в системе Linux

/* если fork завершился успешно, pid > 0 в родительском процессе */

/* fork потерпел неудачу (например, память или какая-либо таблица переполнена) */

/* здесь располагается родительский код */

/* здесь располагается дочерний код */

Процессы именуются своими PID-идентификаторами.

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

В системе Linux процессы могут общаться друг с другом с помощью некой формы передачи сообщений. Можно создать канал между двумя процессами, в который один процесс сможет писать поток байтов, а другой процесс сможет его читать. Эти каналы иногда называют трубами (pipes). Синхронизация процессов достигается путем блокирования процесса при попытке прочитать данные из пустого канала. Когда данные появляются в канале, процесс разблокируется.

При помощи каналов организуются конвейеры оболочки. Когда оболочка видит строку вроде

sort

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Фундаментальные концепции:

  1. 29. Концепция символического интеракционизма. Концепция управления впечатлениями
  2. НАУКА ФУНДАМЕНТАЛЬНАЯ
  3. Постановка фундаментальных вопросов
  4. Правило фундаментальности.
  5. Правило фундаментальности.
  6. ФУНДАМЕНТАЛЬНЫЙ МЕТОД.
  7. НЛП целиком построено на двух фундаментальных принципах:
  8. § 1. ФУНДАМЕНТАЛЬНАЯ (ОБЩАЯ) СОЦИОЛОГИЧЕСКАЯ ТЕОРИЯ КАК СУБЪЕКТ ПРИЛОЖЕНИЯ
  9. 52. Аномическая концепция девиации Опираясь на идею аномии, Роберт Мертон разработал аномическую концепцию девиации.
  10. Я-КОНЦЕПЦИЯ
  11. КОНЦЕПЦИЯ САМООРГАНИЗАЦИИ
  12. 2.1. Методологические концепции
  13. КОНЦЕПЦИЯ ДИСПОЗИЦИОННАЯ
  14. 2. СОЦИОЛОГИЧЕСКИЕ КОНЦЕПЦИИ ГОРОДА
  15. КОНЦЕПЦИЯ СТРАТОМЕТРИЧЕСКАЯ
  16. КОНЦЕПЦИЯ И СВОЙСТВА ИНЬ — ЯН
  17. 2.2. Концепция структуры города ЛЕКЦИЯ 9