Процессы и задания

GNU/Linux — многопользовательская и многозадачная операционная систе- ма. Это значит, что одновременно в системе может выполняться множество программ, запущенных различными пользователями. Для обеспечения мно- гозадачности процессор компьютера последовательно переключается на об- работку программного кода различных приложений, системных и прочих программ, создавая впечатление, что все они выполняются одновременно. Рано или поздно, по истечении некоторого промежутка времени, каждая ждущая исполнения программа попадает на процессор для выполнения. Естественно, чем больше загружена система, тем большим становится этот промежуток времени. Сильно загруженная система может с точки зрения пользователя потерять интерактивность, т. е. она может настолько медленно отвечать на запросы пользователя, что он будет уверен в том, что система не работает.

Программы представляют собой исполняемые файлы двух типов:

r бинарные файлы, содержащие инструкции на машинном языке;

r интерпретируемые сценарии (например, сценарии Bash и программы Perl).

Когда от пользователя поступает команда выполнить некоторую программу, оболочка вначале определяет с помощью "магических чисел" (magic numbers, см. man file), к какому из этих двух типов относится данная программа.


 

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

/bin/bash), который, в свою очередь, относится к программам первого типа.

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

В GNU/Linux одновременно выполняется множество процессов, причем мно- гие из них запускаются автоматически без вмешательства пользователей. В силу этого факта следует выделить понятие задания (task или job). Задание — это команда, запущенная на исполнение пользователем с помощью оболочки. Запуск задания может приводить к созданию более чем одного процесса. На- пример, запуск сервера HTTP Apache приводит к параллельному запуску сра- зу нескольких экземпляров программы httpd.

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

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

Процессы ядра отделены от пользовательских процессов — они работают в пространстве ядра (kernel space). Приложения работают в пользовательском пространстве (user space) за исключением времени, когда в них производятся системные вызовы.

Команда time позволяет увидеть, сколько времени исполнялась программа ре- ально (от запуска до окончания), сколько времени она обслуживалась ядром и сколько она работала в пользовательском пространстве (пример 5.1).


 

Пример 5.1. Команда time

 

# time updatedb

 

real 0m0.158s

user 0m0.092s

sys 0m0.064s

 

В примере 5.1 программа time определила реальное время работы програм- мы updatedb, время работы на стороне пользователя и на стороне ядра.

В GNU/Linux одновременно выполняется множество процессов. Процессор выделяет каждому процессу интервалы времени (time slices), в течение ко- торых инструкции процесса выполняются процессором. Такой режим назы- вается разделением времени. Используемая в Linux модель управления процессами относится к классу вытесняющей многозадачности (preemptive multitaskings). В рамках этой модели каждый процесс имеет свой уровень важности в системе или приоритета. Более приоритетные процессы могут вытеснять с исполнения на процессоре менее приоритетные.

Если схематично описать внутреннюю структуру процесса, то в нем обычно можно выделить следующие составляющие части:

r заголовок процесса, содержащий, в частности, специальные сигнатуры, показывающие формат процесса (например, формат ELF или COFF);

r инструкции (по историческим причинам их именуют text);

r данные (data) — статические данные;

r куча (heap) — область памяти, предназначенная для выделения памяти динамическим переменным и т. п.;

r стек (stack) — структура типа LIFO (Last Input — First Output), предназна- ченная для вызовов подпрограмм и хранения некоторых переменных.

Процессы могут обращаться к каким-либо файлам. С каждым файлом ассо- циируется целое число, называемое дескриптором файла. Когда ядро создает процесс, с ним автоматически ассоциируются три потока ввода/вывода:

r стандартный поток ввода (stdin) — дескриптор 0;

r стандартный поток вывода (stdout) — дескриптор 1;

r стандартный поток ошибок (stderr) — дескриптор 2.

Процессы создаются другими процессами с помощью системного вызова

fork(). Между процессами устанавливаются отношения наследства. Про-


 

цесс, который породил другие процессы, называется родительским (parent).

А порожденные процессы называются дочерними (child).

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

Когда процесс-родитель завершает свою работу, он может завершить работу своих дочерних процессов. Если это не происходит, то "осиротевшие" про- цессы наследуются процессом с номером 1 — init.

Ядро Linux поддерживает специальную таблицу процессов, содержащую ин- формацию о процессах в системе. Таблица процессов динамически увеличи- вается при росте количества процессов в системе (увеличение таблицы про- цессов ограничено).

Важнейшие идентификаторы процесса:

r PID (Process ID) — уникальный порядковый номер процесса в системе, предназначенный для идентификации процесса;

r PPID (Parent Process ID) — PID родительского процесса, позволяющий выстроить иерархию процессов;

r UID (User ID) — идентификатор пользователя, от имени которого выпол- няется процесс;

r GID (Group ID) — идентификатор группы пользователей, от имени кото- рой выполняется процесс.

Процесс запускается с терминала, поэтому процесс связывается с термина- лом. Но, все же, есть процессы, не связанные с терминалами.

Процессы принято подразделять на три категории, перечисленные далее.

r Процессы ядра. Они выполняются в kernel space. Примером такого про- цесса в Linux является процесс упорядочивания процессов в очереди (scheduling). Процессы ядра располагаются в оперативной памяти и не имеют соответствующих им программ в виде исполняемых файлов. Соот- ветствующий им код находится в файле ядра и модулях ядра.

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

r Все остальные процессы называются прикладными. Они, как правило, по- рождаются в рамках сеанса работы пользователя.


 








Дата добавления: 2015-06-12; просмотров: 587;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.