Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Один из таких примеров — процедура регистрации. Процесс

init
запускает программу
getty
для каждого последовательного терминала или модема коммутируемой линии передачи, которые можно применять для регистрации. Эти процессы отображены в следующем выводе команды
ps
:

9619 tty2 Ss+ 0:00 /sbin/mingetty tty2

Процессы

getty
ждут работы на терминале, приглашая пользователя зарегистрироваться хорошо всем знакомой строкой, и затем передают управление программе регистрации, которая устанавливает окружение пользователя и в конце запускает сеанс командной оболочки. Когда пользовательский сеанс командной оболочки завершается, процесс
init
запускает новый процесс
getty
.

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

fork
,
exec
и
wait
.

Планирование процессов

В следующем примере вывода команды

ps
приведен элемент списка для самой команды
ps
.

21475 pts/2 R+ 0:00 ps ax

Эта строка означает, что процесс

21475
находится в состоянии выполнения (
R
) и выполняет он команду
ps ах
. Таким образом, процесс описан в своем собственном выводе! Индикатор состояния показывает только то, что программа готова к выполнению, а не то, что она обязательно выполняется в данный момент. На однопроцессорном компьютере в каждый момент времени может выполняться только один процесс, в то время как другие процессы ждут своего рабочего периода. Эти периоды, называемые квантами времени, очень короткие и создают впечатление одновременного выполнения программ. Опция
R+
просто показывает, что данная программа — фоновая задача, не ждущая завершения других процессов или окончания ввода или вывода данных. Именно поэтому можно увидеть два таких процесса, приведенные в списке вывода
команды
ps. (Другой, часто встречающийся процесс, помечаемый как выполняющийся, — дисплейный сервер системы X.)

Ядро Linux применяет планировщик процессов для того, чтобы решить, какой процесс получит следующий квант времени. Решение принимается исходя из приоритета процесса (мы обсуждали приоритеты процессов в главе 4). Процессы с высоким приоритетом выполняются чаще, а другие, такие как низкоприоритетные фоновые задачи, — реже. В ОС Linux процессы не могут превысить выделенный им квант времени. Они преимущественно относятся к разным задачам, поэтому приостанавливаются и возобновляются без взаимодействия друг с другом. В более старых системах, например Windows 3.х, как правило, для возобновления других процессов требовалось явное согласие процесса.

В многозадачных системах, таких как Linux, несколько программ могут претендовать на один и тот же ресурс, поэтому программы с короткими рабочими циклами, прерывающиеся для ввода, считаются лучше ведущими себя, чем программы, прибирающие к рукам процессор для продолжительного вычисления какого-либо значения или непрерывных запросов к системе, касающихся готовности ввода данных. Хорошо ведущие себя программы называют nice-программами (привлекательными программами) и в известном смысле эту "привлекательность" можно измерить. Операционная система определяет приоритет процесса на основе значения "nice", по умолчанию равного 0, и поведения программы. Программы, выполняющиеся без пауз в течение долгих периодов, как правило, получают более низкие приоритеты. Программы, делающие паузы время от времени, например в ожидании ввода, получают награду. Это помогает сохранить отзывчивость программы, взаимодействующей с пользователем; пока она ждет какого-либо ввода от пользователя, система увеличивает ее приоритет, чтобы, когда программа будет готова возобновить выполнение, у нее был высокий приоритет. Задать значение

nice
для процесса можно с помощью команды
nice
, а изменить его — с помощью команды
renice
. Команда
nice
увеличивает на 10 значение
nice
процесса, присваивая ему более низкий приоритет. Просмотреть значения
nice
активных процессов можно с помощью опций
– l
или
– f
(для полного вывода) команды
ps
. Интересующие вас значения представлены в столбце
NI
(nice).

$ ps -l

F S UID PID PPID С PRI NI ADDR SZ WCHAN TTY TIME CMD

000 S 500 1259 1254 0 75 0 - 710 wait4 pts/2 00:00:00 bash

000 S 500 1262 1251 0 75 0 - 714 wait4 pts/1 00:00:00 bash

000 S 500 1313 1262 0 75 0 - 2762 schedu pts/1 00:00:00 emacs

000 S 500 1362 1262 2 80 0 - 789 schedu pts/1 00:00:00 oclook

000 R 500 1363 1262 0 81 0 - 782 - pts/1 00:00:00 ps

Как видно из списка, программа

oclock
выполняется (как процесс 1362) со значением
nice
по умолчанию. Если бы она была запущена командой

$ nice oclock &

то получила бы значение

nice
+10. Если вы откорректируете это значение командой

$ renice 10 1362

1362: old priority 0, new priority 10

программа

oclock
будет выполняться реже. Увидеть измененное значение nice можно снова с помощью команды
ps
:

$ ps -l

F S UID PID PPID С PRI NI ADDR SZ WCHAN TTY TIME CMD

000 S 500 1259 1254 0 75 0 - 710 wait4 pts/2 00:00:00 bash

000 S 500 1262 1251 0 75 0 - 714 wait4 pts/1 00:00:00 bash

000 S 500 1313 1262 0 75 0 - 2762 schedu pts/1 00:00:00 emacs

000 S 500 1362 1262 0 90 10 - 789 schedu pts/1 00:00:00 oclock

000 R 500 1365 1262 0 81 0 - 782 - pts/1 00:00:00 ps

Столбец состояния теперь также содержит

N
, указывая на то, что значение
nice
было изменено по сравнению с принятым по умолчанию:

ps х

PID TTY STAT TIME COMMAND

1362 pts/1 SN 0:00 oclock

Поле

PPID
в выводе команды
ps
содержит ID родительского процесса (PID), либо процесса, запустившего данный процесс, либо, если этот процесс уже не выполняется, процесса
init
(PID, равный 1).

Планировщик процессов ОС Linux решает, какому процессу разрешить выполнение, на основе приоритета. Конкретные реализации конечно отличаются, но высокоприоритетные процессы выполняются чаще. В некоторых случаях низкоприоритетные процессы не выполняются совсем, если высокоприоритетные процессы готовы к выполнению.

Запуск новых процессов

Применив библиотечную функцию

system
, вы можете заставить программу выполняться из другой программы и тем самым создать новый процесс:

Поделиться:
Популярные книги

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение

Суть науки Каббала. Том 2

Лайтман Михаэль Семенович
Научно-образовательная:
прочая научная литература
религиоведение
5.00
рейтинг книги
Суть науки Каббала. Том 2

Наследник

Назимов Константин Геннадьевич
3. Травник
Фантастика:
фэнтези
6.27
рейтинг книги
Наследник

Газлайтер. Том 38

Володин Григорий Григорьевич
38. История Телепата
Фантастика:
городское фэнтези
аниме
попаданцы
6.20
рейтинг книги
Газлайтер. Том 38

Дэмономания

Краули Джон
3. Эгипет
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
Дэмономания

Перерождение

Кронин Джастин
1. Перерождение
Детективы:
триллеры
8.81
рейтинг книги
Перерождение

Неучтенный элемент. Том 2

NikL
2. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 2

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.25
рейтинг книги
Отморозок 3

Королевский казначей

Костейн Томас
Приключения:
исторические приключения
6.00
рейтинг книги
Королевский казначей

История Древнего мира. От истоков Цивилизации до падения Рима

Бауэр Сьюзен Уайс
Страницы истории
Научно-образовательная:
история
5.00
рейтинг книги
История Древнего мира. От истоков Цивилизации до падения Рима

Дарданелльское сражение

Шигин Владимир Виленович
Во славу земли русской
Проза:
историческая проза
5.00
рейтинг книги
Дарданелльское сражение

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

Язычник

Мазин Александр Владимирович
5. Варяг
Приключения:
исторические приключения
8.91
рейтинг книги
Язычник

Правь, Британия!

дю Морье Дафна
Проза:
современная проза
6.25
рейтинг книги
Правь, Британия!