Лекция №12 - Процессы Linux. nice-фактор. Команда ps.

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

Как вы уже знаете самый первый пользовательский процесс называется init. Его PID всегда равен 1, а PPID равен 0, так как он не имеет родительского процесса, а порождается ядром на определенном этапе загрузки системы. Все остальные процессы являются дочерними процессами и имеют PPID отличный от нуля. Для того чтобы породить новый процесс, родительский вызывает функцию ядра fork(), в результате которой происходит клонирование родительского процесса и получается абсолютно одинаковый процесс на начальном этапе. Единственное отличие: у дочернего процесса увеличивается PID. PID дочернего процесса всегда будет больше чем у родительского. В остальном контекст полностью будет совпадать с родительским. Затем для дочернего процесса запускается функция exec(), которая начинает уже изменять контекст на нужный, загружать в память код программы и т.д.

Операционная система Linux является еще и многопользовательской. У каждого процесса есть такой параметр как “владелец” - от имени которого выполняется процесс. Это UID процесса. Также у процесса есть такой параметр как GID (по аналогии с GID пользователя). Кроме этого есть такие параметры как EUID (эффективный UID) и EGID (эффективный GID). Возможности процесса в системе определяются именно этими параметрами: EUID и EGID.

EUID = UID пользователя, если бит setuid = 0
EUID = UID программы, если бит setuid = 1

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

Многие процессы выполняют операции ввода/вывода информации в/из терминала. Поэтому есть такой параметр как Терминал. А есть процессы которые работают в фоновом режиме. Такие процессы не привязаны к терминалу. Например, процесс cron.

Процесс может находится в нескольких состояниях:

1. Выполнение - менеджер процессов выделил все необходимые ресурсы и процесс просто ждет своей очереди на получение следующей порции процессорного времени.
2. Ожидание - процесс получил все ресурсы, но для продолжения работы он ждет какую-то информацию, например, от другого процесса.
3. Остановленный - процесс ничего не делает, процессорное время не получает. Процесс был переведен в это состояние с помощью специальных сигналов и выйти из этого состояния может также только с помощью соответствующего сигнала.
4. “Зомби” - это процесс который должен был завершиться с освобождением всех ресурсов, но по какой-то причине завершение не произошло корректно. С процессами “Зомби” нужно быть осторожными. Если таких процессов много значит в системе что-то не так.

Для просмотра процессов и их свойств предназначена команда ps. Команда имеет очень много ключей и параметров. Все их можно посмотреть в man ps. Мы рассмотрим несколько самых нужных для администратора компьютера. Также хочу обратить внимание на то, что программе ps можно передавать как параметры, так и ключи. Напомню, что перед ключом (или последовательностью ключей) всегда стоит дефис, а параметры пишутся без дефиса. Сравните результаты команд ps с ключом (ps -a) и с параметром (ps a). Как видите результаты существенно отличаются. А теперь рассмотрим еще несколько распространенных вариантов команды ps.

Чтобы отобразить все существующие процессы предназначена команда ps aux. Результат ниже сокращен (процессов гораздо больше):

igor@adm-ubuntu:~/linux$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 11740 0.0 0.0 3124 448 ? S< 11:28 0:00 udevd --daemon
igor 11805 0.0 0.0 1848 548 pts/0 S+ 11:43 0:00 ping 192.168.222.10
igor 11915 0.0 0.1 2640 1040 pts/2 R+ 12:00 0:00 ps aux

По команде ps aux можно увидеть достаточно обширный объем информации. Расшифровка столбцов следующая:

USER - владелец процесса
PID - PID процесса
%CPU - процент использования процессора. Это время использования процессора деленное на общее время существования процесса.
%MEM - процент использования физической оперативной памяти.
VSZ - объем виртуальной памяти выделенной процессу (в Килобайтах)
RSS - объем физической оперативной памяти выделенной процессу (в Килобайтах)
TTY - к какому терминалу “привязан” процесс
STAT - статус (состояние) процесса. R - выполнение, S - ожидание, T - остановлен, Z - “зомби”
START - время когда был запущен процесс
TIME - количество процессорного времени, которое брал себе процесс. Обычно там нули или малое число (0:00 - 0:09). Если число большое, то процесс загружает процессор и следует проверить все ли с ним в порядке.
COMMAND - имя команды. Какой код был выполнен во время исполнения функции exec().

Чтобы увидеть информацию о nice-факторе необходимо выполнить команду ps lax:

igor@adm-ubuntu:~$ ps lax
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
1 1000 2760 1 20 0 17928 5512 poll_s Ss ? 0:01 gnome-screensaver
0 1000 5859 3543 20 0 6292 3512 wait Ss pts/2 0:00 bash
0 1000 12275 5859 20 0 3752 1564 wait S+ pts/2 0:00 man ps

Особый интерес для нас предоставляют следующие столбцы:

PPID - отображен PID родительского процесса. Например для первой строки примера PPID равен 1, значит родительским для этого процесса является процесс init. Процесс из третьей строки является дочерним процесса из второй строки и т.д.
NI - значение nice-фактора.
PRI - приоритет процесса.

Выше я уже упоминал о nice-факторе как параметре который влияет на приоритет процесса. Чем выше число в столбце PRI тем ниже приоритет процесса. Пользователи могут изменить приоритет процесса при помощи изменения nice-фактора. Для этого существуют две команды: nice и renice. Диапазон значений nice-фактора невелик: от -20 до 19. Когда создается дочерний процесс, то он наследует nice-фактор своего предка. По умолчанию большинство пользовательских процессов имеют nice-фактор 0, так как именно такой nice-фактор установлен для процесса init. Чтобы изменить nice-фактор запускаемого процесса используют команду nice:

igor@adm-ubuntu:~$ nice -n 5 sleep 30 &

igor@adm-ubuntu:~$ ps lax | grep sleep
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 1000 3567 3543 20 0 6292 3528 wait Ss pts/0 0:00 bash
0 1000 13098 3567 25 5 2952 628 hrtime SN pts/0 0:00 sleep 30

Синтаксис команды простой: через ключ -n мы передаем значение приращения nice-фактора, а затем идет команда для которой будет устанавливаться новый nice-фактор. Речь идет именно о приращении, так как реальный nice-фактор нового процесса будет равен nice-фактору родительского процесса сложенному с числом передаваемым команде nice. В приведенном выше примере nice-фактор родительского процесса (оболочки bash) равен нулю, значит nice-фактор дочернего будет 0+5=5, что мы и видим на результатах.

Обычные пользователи могут только увеличивать nice-фактор, но не могут его уменьшать. Сделано это для того, чтобы пользователи не смогли создавать высокоприоритетные процессы. Если от имени пользователя выполнить команду nice -n -5 sleep 30 &, получим сообщение об ошибке. Уменьшать nice-фактор может только пользователь root.

Если необходимо изменить nice-фактор уже запущенного процесса, то используют команду renice. Например:

igor@adm-ubuntu:~$ renice 14 13229
13229: старый приоритет 10, новый приоритет 14

где 13229 это PID процесса для которого меняется nice-фактор. Из примера, также видно, что число 14 это уже не приращение, а просто новое значение nice-фактора. Если необходимо изменить nice-фактор всех процессов одного пользователя, то используется ключ -u. Например, изменим nice-фактор всех процессов пользователя test:

test@adm-ubuntu:~$ ps lax | grep test
4 1001 13256 5630 20 0 8656 3036 wait S pts/1 0:00 su - test
0 1001 13297 13266 20 0 3056 824 pipe_w S+ pts/1 0:00 grep –color=auto test
test@adm-ubuntu:~$ renice 5 -u test
1001: старый приоритет 0, новый приоритет 5
test@adm-ubuntu:~$ ps lax | grep test
4 1001 13256 5630 25 5 8656 3036 wait SN pts/1 0:00 su - test
0 1001 13302 13266 25 5 3056 820 pipe_w SN+ pts/1 0:00 grep –color=auto test

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

На следующей лекции поговорим о сигналах.

Читать другие лекции по курсу Администратор ПК с Linux

Статьи и новости схожей тематики:

Комментариев: 11

  1. Жена:

    Давненько я ,честно говоря, нечитала твой блог :(. ВОт захожу открываю самую свежую статью,пробегаю взглядом,что бы понять о чём это и может ли мой мозг это осилить и вдруг.. вижу выделенным уже знаокомое слово CRON!
    Дело в том,что разработчики нашего проекта работают под Fedora ну и видимо всё сервера по максимумум тоже линуксовые. Так вот однажды они не смогли посмотреть по логам причину проблемы возникшей у заказчика,т.к. что-то случилось с cron на сервере и логи просто не писались :(
    Кстати, а ты не знаеш почему они могли выбрать именно Fedora , а не Ubuntu?

    Ответить

    Igorka Reply:

    Почему они выбрали дистрибутив Fedora, а не Ubuntu я конечно же не знаю. Тут можно только предполагать. Возможно администратор работает с Red Hat (или c тем же Fedora) и поэтому установил именно этот дистрибутив. Дистрибутивов много ведь… Я когда-то спрашивал у нашего unix-администратора, какой дистрибутив Linux лучше начать изучать. И он мне ответил, что лучше изучать тот, по которому у тебя есть знакомый гуру, чтобы было у кого спрашивать на начальном этапе, когда, что-то не получается.

    Ответить

    Жена Reply:

    Так твой знакомый гуру сидит на Ubunt’е ? ;) Это ведь не первый твой дистрибутив,но отсановился ты именно на нём :)

    Ответить

    Igorka Reply:

    К сожалению у меня нет знакомых гуру в Linux. Из дистрибутивов я пару недель смотрел на Fedora, а затем перешел на Ubuntu. Также пару дней еще поработал в OpenSuse. В общем остановился на Ubuntu и Debian. Наверное, ко всему прочему, сыграло свою роль то, что и Серега тоже остановился на этих дистрибутивах, хотя сейчас работает только в Debian.

    Ответить

  2. Жена:

    У нас тут сервер упал и тепепрь видно,что твоя догадка про причины выбора Fedora для наших разработчиков оправдалась :) На серверах стоит Red Hat судя по ошибке :)
    Apache/2.2.3 (Red Hat) Server at test-server.com Port 80

    Ответить

    Igorka Reply:

    Вот как все быстро выяснили :)

    Ответить

  3. Igorka:

    Хочу еще отметить, что с темой процессы будут связаны лекции номер 13 и 14. Смотрите в разделе “Курсы Администратор ПК с Linux”

    Ответить

  4. Dawessede:

    Привет! С удовольствием почитал Ваш блог. Хочу также поздравить Вас и всех читателей этого блога с новым 2010 годом. Удачи всем, новых жизненных побед и исполнения всех ваших замыслов. :)

    Ответить

    Igorka Reply:

    Спасибо большое за поздравление. :) И Вас также с наступающим Новым Годом.

    Ответить

  5. читатель:

    >>Чтобы реализовать ее процесс имеет еще такой параметр как владелец - от имени кого выполняется процесс
    если можно, поправьте пожалуйста стиль. Не то “Чтобы реализовать ее (операционную систему), процесс имеет еще такой параметр как владелец”, не то “Чтобы реализовать ее процесс, имеет[b]ся[/b] еще такой параметр как владелец…”

    Ответить

    Igorka Reply:

    Спасибо. Поправил.

    Ответить

Оставьте свой отзыв