Процесс

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

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

Модель памяти процесса

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

Текст - инструкции программы.

Данные - статические переменные, используемые программой.

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

Стек - часть памяти, которая может расширяться и сжиматься по мере вызова функций и возвращения из них и которая используется для выделения хранилища под локальные переменные и информацию о взаимосвязанности вызовов функций.

Наглядное устройство памяти

Создание процесса и выполнение программы

Процесс может создать новый процесс с помощью системного вызова fork(). Процесс, вызывающий fork(), известен как родительский процесс, а новый процесс называется дочерним процессом. Ядро создаёт дочерний процесс путём изготовления дубликата родительского процесса. Дочерний процесс наследует копии родительских сегментов данных, стека и кучи, которые затем могут изменяться независимо от своих родительских копий.

Текст программы размещается в области памяти с пометкой "только для чтения" и совместно используется двумя процессами.

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

У вызова execve() есть ряд надстроек в виде родственных функций библиотеки языка Си с несколько отличающимся интерфейсом, но сходной функциональностью. У всех этих функций имена начинаются со строки exec.

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

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

Процесс init

При загрузке системы ядро создаёт особый процесс, который называется init, "родитель всех процессов". Он ведёт своё происхождение от программного файла /sbin/init. Все процессы в системе создаются (используя fork()) либо процессом init, либо одним из его потомков. Процесс init всегда имеет идентификатор процесса 1 и запускается с правами доступа суперпользователя. Процесс init не может быть уничтожен (даже привилегированным пользователем) и завершается только при завершении работы системы. Основной задачей init является создание и слежение за процессами, требуемыми работающей системе.

Процессы-демоны

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

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

К примерам процессов-демонов относятся syslogd, который записывает сообщения в системный журнал, и httpd, который отвечает на запросы веб-страниц сайта, посредством передачи гипертекста по протоколу HTTP.

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

С другой стороны, у работающей системы имеется всего одно ядро, которое обо всём знает и всем управляет. Ядро содействует выполнению всех процессов в системе. Оно решает, какой из процессов следующим получит доступ к центральному процессору, когда это произойдёт и сколько это продлится. Ядро обслуживает структуры данных, содержащие информацию обо всех запущенных процессах, и обновляет их по мере создания процессов, изменения их состояния и прекращения их выполнения. Ядро обслуживает все низкоуровневые структуры данных, позволяющие преобразовывать имена файлов, используемые программами, в физические местоположения файлов на диске. Ядро также обслуживает структуры данных, которые отображают виртуальную память каждого процесса в физическую память компьютера и область (области) подкачки на диске. Весь обмен данными между процессами осуществляется через механизмы, предоставляемые ядром. Отвечая на запросы процессов, ядро создаёт новые процессы и прекращает работу существующих. И наконец, ядро (в частности, драйверы устройств) выполняет весь непосредственный обмен данными с устройствами ввода-вывода, осуществляя по требованию перемещение информации в пользовательские процессы и из них в устройства.

Поддержите проект, если он помог вам

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