Читайте также:
|
|
Сегодня мы поговорим о процессах в 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. Например:
Дата добавления: 2014-12-19; просмотров: 120 | Поможем написать вашу работу | Нарушение авторских прав |