Процессы
Процесс – это программа, выполняемая в оперативной памяти компьютера. В многозадачной Системе одновременно могут быть активны множество процессов, каждый из которых использует выделенные ему ресурсы: процессорное время, память, устройства ввода-вывода.
Распределением ресурсов управляет планировщик ядра, который назначает приоритеты, переключает выполнение между процессами и контролирует использование памяти, исключая пересечения адресных пространств.
Все процессы в Системе создаются путём клонирования существующих с использованием системных вызовов clone(2) и fork(2). Новый (дочерний) процесс наследует окружение родительского и получает собственный идентификатор (PID).
Жизненный цикл процесса
Алгоритм работы процессов в ОС определяется следующими условиями:
- имеется запущенный процесс;
- каждый процесс может запускать подпроцессы;
- создание нового процесса создается клонированием исходного;
- прародителем всех процессов в системе является процесс init, запускаемый ядром ОС при загрузке;
- процессы взаимодействуют между собой посредством межпроцессного взаимодействия:
- каналы;
- сигналы;
- сокеты;
- разделяемая память;
- каждый процесс обладает свойствами (процесс обладает контекстом):
- PID – идентификатор процесса;
- PPID – идентификатор процесса, породившего данный процесс;
- UID и GID – идентификаторы прав процесса (соответствует UID и GID пользователя, от имени которого запущен процесс);
- приоритет процесса;
- состояние процесса (выполнение, сон и т.п.).
Типичный процесс в Linux-подобной ОС может быть представлен схемой (рисунок 72).

Рисунок 72 - Схема жизненного цикла процесса в ОС
Этапы состоят из следующих шагов:
- процесс /bin/bash клонирует себя системным вызовом
fork(); - при этом создается клон /bin/bash с новым PID (идентификатор процесса) и PPID, равный PID родителя;
- клон выполняет системный вызов exec с указанием на исполняемый файл и заменяет свой код кодом исполняемого файла (родительский процесс при этом ждет завершения потомка
wait()); - если по каким-то причинам потомок завершил свою работу, а родительский процесс не смог получить об этом сигнал, то данный процесс (потомок) не освобождает занятые структуры ядра и состояние процесса становиться
zombie.
Первый процесс в Системе запускается при инициализации ядра. Данный процесс называется init и имеет PID=1 – это прародитель всех процессов в Системе.
Каждый запущенный процесс может находиться в одном из следующих состояний:
R (Running)– активен, выполняется или ожидает выделения процессорного времени;S (Sleeping)– находится в прерываемом ожидании события или освобождения ресурса;D (Uninterruptible sleep)– ожидает сигнал от аппаратной части и не реагирует на другие сигналы;T (Stopped)– приостановлен, обычно в режиме трассировки при отладке;Z (Zombie)– завершён, но его структуры ядра не освобождены. Такое состояние возникает, если родительский процесс не получил сигнал о завершении дочернего;Сироты (Orphan)– процессы, потерявшие родителя. Они автоматически передаются процессу init, который обрабатывает сигналы об их завершении.
Процессы-зомби не используют ресурсы, но занимают записи в таблице процессов. Их появление свидетельствует о нарушении работы программ или оборудования и требует проверки состояния Системы.
Также, говоря о процессах в ОС, можно выделить особый вид процессов демоны. Данный вид процессов работает в фоне (подобно службам в Windows) без терминала и выполняет задачи для других процессов. Данный вид процессов на серверных системах является основным.
Приоритезация процессов
Каждому процессу при запуске назначается приоритет от –20 до +20, где:
–20– наивысший приоритет (процесс получает больше процессорного времени),+20– низший приоритет.
Значение приоритета наследуется от родительского процесса.
Для изменения приоритета запускаемой программы используется утилита nice. Пример использования:
nice [-n adnice] команда [аргументы]
где adnice — числовое значение от –20 до +19, добавляемое к приоритету (значению nice) родительского процесса.
Отрицательные значения могут назначаться только суперпользователем.
Если параметр adnice не указан, приоритет процесса-потомка автоматически увеличивается на 10 по сравнению со значением родителя.
Изменить приоритет уже выполняющегося процесса позволяет команда renice. Обычные пользователи могут понижать приоритет только своих процессов, суперпользователь — любых.
Для управления процессами применяются сигналы. Наиболее часто используется команда kill:
kill [-SIG] PID
где SIG – это номер сигнала или наименование сигнала. Если сигнал не указан, по умолчанию отправляется SIGTERM (15) — корректное завершение процесса.
Для принудительного завершения любого процесса пользователем root применяется сигнал SIGKILL (9), приостанавливает выполнение — SIGSTOP (19), возобновляет — SIGCONT (18).
Обычные пользователи могут посылать сигналы только тем процессам, для которых они являются владельцами. Суперпользователь root может посылать сигналы любым процессам.
Работа в фоновом и переднем режиме
По умолчанию процессы выполняются на переднем плане. Для запуска в фоновом режиме используется символ "&" в формате:
команда &
Команды fg и bg переводят процессы между передним и фоновым режимом соответственно. Список активных заданий отображается командой jobs.
Чтобы процесс продолжал выполняться после выхода из оболочки, применяется утилита nohup:
nohup команда &
Запущенный таким образом процесс будет игнорировать посылаемые ему сигналы (не игнорируются только сигналы SIGHUP и SIGQUIT).
Получение информации о процессе
Для получения информации о каком-либо процессе можно использовать существующие утилиты ps и top для просмотра информации о процессах.
Чтобы получить список всех процессов, достаточно ввести команду:
ps aux
Следует обратить внимание, что некоторые процессы указаны в квадратных скобках "[ ]" – это процессы, которые входят непосредственно в состав ядра и выполняют важные системные задачи, например, такие как управление буферным кешем pdflush и организацией свопинга kswapd, которые требуют очень ответственное отношение. Остальная часть процессов относится к пользовательским.
Информация, получаемая по каждому процессу:
PID,PPID– идентификатор процесса и его родителя;%CPU– доля процессорного времени, выделенная процессу;%MEM– процент используемой оперативной памяти;VSZ– виртуальный размер процесса;TTY– управляющий терминал;STAT– статус процесса:R– выполняется;S– "спит";Z– "зомби";<– повышенный приоритет;+– в интерактивном режиме;
START– время запуска;TIME– время исполнения на процессоре.
Команда ps делает моментальный снимок процессов в текущий момент. В отличие от нее команда top динамически выводит состояние процессов и их активность в реальном режиме времени.
Пример вывода команды top:
14:32:49 up 35 days, 6:01, 4 users, load average: 0.65, 0.51, 0.49
Tasks: 432 total, 1 running, 431 sleeping, 0 stopped, 0 zombie
CPU0 : 1.6%us, 3.6%sy, 0.0%ni, 85.3%id, 9.2%wa, 0.0%hi, 0.3%si, 0.0%st
CPU1 : 0.9%us, 1.9%sy, 0.0%ni, 96.9%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 1033596K total, 1016644K used, 16952K free, 82928K buffers
Swap: 2096376K total, 12632K used, 2083744K free, 478220K cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2788 root 15 -5 0 0 0 S 2.0 0.0 404:43.97 md3_raid1
7961 root 20 0 5964 2528 1684 R 2.0 0.2 0:00.14 top
6629 root 20 0 8612 2884 2096 S 0.7 0.3 0:00.96 dovecot-auth
57 root 15 -5 0 0 0 S 0.3 0.0 4:36.10 kblockd/0
8703 ulogd 20 0 17700 4216 656 S 0.3 0.4 87:23.98 ulogd
11336 ldap 20 0 394M 15M 8292 S 0.3 1.5 5:29.28 slapd
25757 ldap 20 0 394M 15M 8292 S 0.3 1.5 5:11.71 slapd
10991 root 20 0 2188 1004 588 S 0.3 0.1 4:23.33 dovecot
1 root 20 0 1712 516 464 S 0.0 0.0 0:46.17 init
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT -5 0 0 0 S 0.0 0.0 0:05.92 migration/0
.....
2960 root 16 -4 1980 520 392 S 0.0 0.1 0:10.04 udevd
2993 dovecot 20 0 4412 1800 1476 S 0.0 0.2 0:00.00 pop3-login
2994 dovecot 20 0 4412 1800 1476 S 0.0 0.2 0:00.02 pop3-login
В верхней части вывода отображается астрономическое время, время, прошедшее с момента запуска Системы, число пользователей в Системе, число запущенных процессов и число процессов, находящихся в разных состояниях, данные об использовании ЦПУ, памяти и свопа. Далее следует таблица, характеризующая отдельные процессы. Число строк, отображаемых в этой таблице, определяется размером окна: сколько строк помещается, столько и выводится.
Содержимое окна обновляется каждые 5 секунд. Список процессов может быть отсортирован по используемому времени ЦПУ (по умолчанию), по использованию памяти, по PID, по времени исполнения. Переключать режимы сортировки при отображении можно с помощью следующих клавиатурных команд:
Shift+N– по PID;Shift+A– по возрасту;Shift+P– по использованию ЦПУ;Shift+M– по использованию памяти;Shift+T– по времени выполнения.
С помощью команды <K> можно завершить некоторый процесс (его PID будет запрошен), а с помощью команды <R> можно переопределить значение nice для некоторого процесса.
Полезную информацию о процессах также позволяет получить программа lsof, которая выдает список всех файлов, используемых сейчас процессами, включая каталоги, используемые каким-либо процессом в качестве текущего или корневого; разделяемые библиотеки, загруженные в память и т. д.
Управление процессами
Команда free
Команда free используется для получения подробного отчета об использовании памяти Системой, предоставляет информацию об общем объеме физической памяти и памяти подкачки, а также о свободной и используемой памяти.
Синтаксис команды следующий:
free [OPTIONS]
При использовании без какой-либо опции команда free будет отображать информацию о памяти и подкачке в килобайтах.
Обозначения столбцов при выводе команды:
total– общий объем памяти, который может быть использован приложениями.used– используемая память, которая рассчитывается как:used = total-free-buffers- cache.free– свободная/неиспользуемая память.Shared– можно игнорировать, поскольку не имеет значения (только для обратной совместимости);buff/cache– объединенная память, используемая буферами ядра, а также страничным кешем и блоками. Эта память может быть освобождена в любое время, если это необходимо приложениям.available– оценка объема памяти, доступного для запуска новых приложений без подкачки.
Если требуется, чтобы буферы и кеш отображались в двух отдельных столбцах, используют параметр -w.
По умолчанию команда free показывает информацию о памяти в килобайтах. Чтобы просмотреть информацию в удобочитаемом формате (обычно в мегабайтах и гигабайтах), используют параметр -h:
free -h
Команда free также позволяет указать единицы измерения памяти. Допустимые варианты:
b,--bytes– отображать вывод в байтах;-kilo– отображать вывод в килобайтах (1 Кб = 1000 байт);-mega– отображать вывод в мегабайтах;-giga– показать вывод в гигабайтах;-tera– показать вывод в терабайтах;k,--kibi– показать вывод в кибибайтах. (1 Киб = 1024 байт) (по умолчанию);m,--mebi– показать вывод в мебибайтах (1 МиБ = 2^20 байт);g,--gibi– показать вывод в гибибайтах (1 ГиБ=2^30 байт);-tebi– отображать вывод в тебибайтах (1 ТиБ = 2^40 байт);-peti– показать вывод в пебибайтах (1 ПиБ = 2^50 байт);-si– вместо 1024 используют --mebi --si 1000. Например,--mebi --siравно--mega.
Например, чтобы отобразить результат в мегабайтах, следует выполнить:
free --mega
Чтобы постоянно отображать информацию о памяти на экране, нужно вызвать free с параметром -s(--seconds), за которым следует число, определяющее задержку.
Например, чтобы выдавать информацию о памяти каждые пять секунд, необходимо выполнить (рисунок 73):
free -s 5

Рисунок 73 - Вывод команды free -s 5
Команда free будет продолжать отображать результат, пока не будет нажата комбинация клавиш Ctrl+C, что похоже на поведение команды watch.
Чтобы отображать результат определенное количество раз, используют параметр -c(--count) и целое число. Например:
free -s 5 -c 3
Команда htop
Команда htop – это интерактивный монитор Системы в терминале, который предоставляет детальную информацию о загрузке процессора, использовании памяти, активности сети и других ресурсах. Вот несколько ключевых функций и использований htop:
- отображение активных процессов и их иерархии, а также загрузки CPU, памяти, дисков и сети;
- интерактивное управление процессами – изменение приоритета, приостановка, возобновление и завершение;
- визуальный мониторинг ресурсов с помощью цветных графиков и индикаторов;
- сортировка, поиск и фильтрация процессов по различным параметрам.
Команду htop можно запускать с правами обычного пользователя (рисунок 74):
htop
Также команду htop можно запускать и с привилегиями суперпользователя:
sudo htop

Рисунок 74 - Вывод команды htop
Основные параметры запуска htop:
htop -u <имя_пользователя>– отображение только процессов указанного пользователя;htop -p <PID1,PID2,…>– показ только выбранных процессов по их PID;htop -s <поле>– сортировка списка по заданному полю (например, CPU%, MEM%, PID);htop -d <время>– установка интервала обновления экрана (в десятых долях секунды);htop -t– отображение процессов в виде дерева (Tree view);htop -C– отключение цветового оформления;htop -v– вывод информации о версии утилиты.
Горячие клавиши в интерактивном режиме:
F2– настройки интерфейса;F3– поиск процесса;F4– фильтрация списка процессов;F5– переключение в древовидный режим;F6– выбор поля сортировки;F9– завершение выбранного процесса;F10– выход из программы.
Команда df
Команда df (disk free) используется для отображения информации о файловых системах, подключённых к Системе, включая их общий объём, использованное и свободное пространство, а также точки монтирования.
Базовый вызов команды (рисунок 75):
sudo df

Рисунок 75 - Вывод команды df
Наиболее используемые опции команды:
-h– вывод в удобном для чтения формате (K, M, G);-H– аналогично-h, но с использованием степеней 1000, а не 1024;-T– отображение типа файловой системы;-i– отображение информации об inode (вместо байтов);-t <тип>– показать только файловые системы указанного типа (например, ext4, tmpfs);-x <тип>– исключить файловые системы заданного типа;--total– добавление строки с общим суммарным объёмом всех разделов;-a– вывод всех файловых систем, включая псевдо-файловые и те, где размер равен нулю;-P– использование стандартного формата POSIX (удобно при парсинге вывода скриптами);-hT– оценка загрузки дисков и поиск переполненных разделов;-h /имя каталога– вывод объема доступного пространства в каталоге.
Команда du
Команда du сообщает приблизительный объем дискового пространства, используемого данными файлами или каталогами. Это практически полезно для поиска файлов и каталогов, занимающих большие объемы дискового пространства.
Общий вид команды:
du [OPTIONS]... FILE...
Если данный FILE является каталогом, команда du будет суммировать использование диска для каждого файла и подкаталога в этом каталоге. Если FILE не указан, du сообщит об использовании диска в текущем рабочем каталоге.
При выполнении без какой-либо опции du отображает использование диска для данного файла или каталога и каждого из его подкаталогов в байтах.
Также можно передать команде du несколько файлов и каталогов в качестве аргументов:
du ~/Documents ~/Pictures
Если запустить du для файла или каталога, для которого нет прав, в выводе получится примерно следующее "du: невозможно прочитать каталог". В этой ситуации нужно будет добавить к команде sudo.
Часто используемые параметры для команды du:
-a– сообщает об использовании дискового пространства каждым файлом в каталоге:
du -a /tmp/
-h– отображает информацию о пространстве, занимаемом только данным каталогом, в удобочитаемом формате, например, чтобы получить общий размер /var/lib и всех его подкаталогов, нужно выполнить следующую команду:
sudo du -h /var/lib
Следует использовать команду sudo, потому что большинство файлов и каталогов внутри каталога /var/lib принадлежат пользователю root и не доступны для чтения обычным пользователям.
-s– отображает только общий размер указанного каталога, а не подкаталогов (рисунок 76):
sudo du -sh /var

Рисунок 76 - Вывод команды du -sh /var
-c– указывает команде du** **сообщать общую сумму, если требуется получить объединенный размер двух или более каталогов (рисунок 77):
sudo du -csh /var/log /var/lib

Рисунок 77 - Вывод команды du -csh /var/lib /var/log
--max-depth– отображает использование диска подкаталогами n-уровня с указанием уровня подкаталогов, например, чтобы получить отчет о каталогах первого уровня, используют (рисунок 78):
sudo du -h --max-depth=1 /var/log

Рисунок 78 - Вывод команды du -h --max-depth=1 /var/log
--apparent-size– по умолчанию утилита du повторно использует дисковое пространство, используемое каталогом или файлом; чтобы узнать очевидный размер файла (фактический объем данных в файле), используют переключатель (рисунок 79):
sudo du -sh --apparent-size /var/lib

Рисунок 79 - Вывод команды sudo du -sh --apparent-size /var/lib
du также позволяет использовать шаблон оболочки. Например, чтобы получить размер всех каталогов из /etc, начинающихся с "rc", нужно выполнить:
sudo du -csh /etc/rc*
Комбинации команд
Команду du можно комбинировать с другими командами с конвейерами.
Например, чтобы напечатать 5 самых больших каталогов внутри каталога /var нужно передать вывод du в команду sort, чтобы отсортировать каталоги по их размеру, а затем передать результат в команду head, которая распечатает только 5 верхних каталогов:
sudo du -h /var/ | sort -rh | head -5
В отличие от команды df, которая выводит информацию об использовании диска смонтированными ФС, команда du дает оценку дискового пространства, используемого данными файлами или каталогами.