Процессы

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

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

Все процессы в Системе создаются путём клонирования существующих с использованием системных вызовов clone(2) и fork(2). Новый (дочерний) процесс наследует окружение родительского и получает собственный идентификатор (PID).

Жизненный цикл процесса

Алгоритм работы процессов в ОС определяется следующими условиями:

  • имеется запущенный процесс;
  • каждый процесс может запускать подпроцессы;
  • создание нового процесса создается клонированием исходного;
  • прародителем всех процессов в системе является процесс init, запускаемый ядром ОС при загрузке;
  • процессы взаимодействуют между собой посредством межпроцессного взаимодействия:
    • каналы;
    • сигналы;
    • сокеты;
    • разделяемая память;
  • каждый процесс обладает свойствами (процесс обладает контекстом):
    • PID – идентификатор процесса;
    • PPID – идентификатор процесса, породившего данный процесс;
    • UID и GID – идентификаторы прав процесса (соответствует UID и GID пользователя, от имени которого запущен процесс);
    • приоритет процесса;
    • состояние процесса (выполнение, сон и т.п.).

Типичный процесс в Linux-подобной ОС может быть представлен схемой (рисунок 72).

Рисунок 72 - Схема жизненного цикла процесса в ОС

Этапы состоят из следующих шагов:

  1. процесс /bin/bash клонирует себя системным вызовом fork();
  2. при этом создается клон /bin/bash с новым PID (идентификатор процесса) и PPID, равный PID родителя;
  3. клон выполняет системный вызов exec с указанием на исполняемый файл и заменяет свой код кодом исполняемого файла (родительский процесс при этом ждет завершения потомка wait());
  4. если по каким-то причинам потомок завершил свою работу, а родительский процесс не смог получить об этом сигнал, то данный процесс (потомок) не освобождает занятые структуры ядра и состояние процесса становиться 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 дает оценку дискового пространства, используемого данными файлами или каталогами.