Многозадачность
Операционная система Linux является многозадачной. За многозадачность отвечает ядро. Что же представляет собой многозадачность? Мы привыкли под этим термином понимать концепцию одновременного выполнения нескольких программ. Однако такое понимание не является корректным в плане программирования. Во — первых — реально многозадачности не существует. Во вторых — есть понятие процесс, и есть понятие программа, которые нельзя отождествлять.
Итак, многозадачности не существует. Действительно, любой компьютер — это императивная машина, т.е. машина, основанная на последовательном анализе состояния вычислителя и изменении состояния этого вычислителя. Число комбинаций всевозможных состояний в такой системе конечно. Многозадачность, реализованная в операционных системах — это иллюзия, весьма удобная пользователю. Любая многозадачность — это абстракция императивности. То есть, мы думаем, что два процесса выполняются одновременно, а на самом деле они просто поочередно используют процессор для выполнения своих команд. За очередностью использования процессора следит ядро, которое и создает иллюзию многозадачности.
Чем же программа отличается от процесса? Программа — это нечто, готовое к выполнению, а процесс — это выполняющийся экземпляр программы. Почему экземпляр? Все дело в том, что одну и ту же программу можно запустить, например, два раза. Таким образом, получится два процесса, хотя программа одна.
Основы многозадачности в Linux
Наберите в своей оболочке следующую команду:
На экран будут выведен список всех работающих в системе процессов. Если хотите посчитать количество процессов, наберите что-нибудь, наподобие этого:
$ ps -e —no-headers | nl | tail -n 1
Первое число — это количество работающих в системе процессов. Пользователи KDE могут воспользоваться программой kpm, а пользователи Gnome — программой gnome-system-monitor для получения информации о процессах. На то он и Linux, чтобы позволять пользователю делать одно и то же разными способами.
Возникает вопрос: «Что такое процесс?». Процессы в Linux, как и файлы, являются аксиоматическими понятиями. Иногда процесс отождествляют с запущенной программой, однако, это не всегда так. Будем считать, что процесс — это рабочая единица системы, которая выполняет что-то. Многозадачность — это возможность одновременного сосуществования нескольких процессов в одной системе.
Linux — многозадачная операционная система. Это означает, что процессы в ней работают одновременно. Естественно, это условная формулировка. Ядро Linux постоянно переключает процессы, то есть время от времени дает каждому из них сколько-нибудь процессорного времени. Переключение происходит довольно быстро, поэтому нам кажется, что процессы работают одновременно.
Одни процессы могут порождать другие процессы, образовывая древовидную структуру. Порождающие процессы называются родителями или родительскими процессами, а порожденные — потомками или дочерними процессами. На вершине этого «дерева» находится процесс init, который порождается автоматически ядром в процессе загрузки системы.
К каждому процессу в системе привязана пара целых неотрицательных чисел: идентификатор процесса PID (Process IDentifier) и идентификатор родительского процесса PPID (Parent Process IDentifier). Для каждого процесса PID является уникальным (в конкретный момент времени), а PPID равен идентификатору процесса-родителя. Если ввести в оболочку команду ps -ef, то на экран будет выведен список процессов со значениями их PID и PPID (вторая и третья колонки соотв.). Пример работы такой команды:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 17:08 ? 00:00:00 /sbin/init
root 2 0 0 17:08 ? 00:00:00 [kthreadd]
root 3 2 0 17:08 ? 00:00:00 [migration/0]
root 4 2 0 17:08 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 17:08 ? 00:00:00 [watchdog/0]
root 6 2 0 17:08 ? 00:00:00 [migration/1]
root 7 2 0 17:08 ? 00:00:00 [ksoftirqd/1]
root 8 2 0 17:08 ? 00:00:00 [watchdog/1]
root 9 2 0 17:08 ? 00:00:00 [events/0]
root 10 2 0 17:08 ? 00:00:00 [events/1]
root 11 2 0 17:08 ? 00:00:00 [cpuset]
root 12 2 0 17:08 ? 00:00:00 [khelper]
root 13 2 0 17:08 ? 00:00:00 [netns]
root 14 2 0 17:08 ? 00:00:00 [async/mgr]
root 15 2 0 17:08 ? 00:00:00 [kintegrityd/0]
root 16 2 0 17:08 ? 00:00:00 [kintegrityd/1]
root 17 2 0 17:08 ? 00:00:00 [kblockd/0]
root 18 2 0 17:08 ? 00:00:00 [kblockd/1]
root 19 2 0 17:08 ? 00:00:00 [kacpid]
df00 16389 16387 0 20:10 pts/1 00:00:00 /bin/bash
df00 17446 2538 0 20:26 ? 00:00:00 [nautilus]
df00 18544 2932 0 20:41 pts/2 00:00:00 /bin/bash -l
df00 19010 18544 0 20:48 pts/2 00:00:00 ps -ef
Надо отметить, что процесс init всегда имеет идентификатор 1 и PPID равный 0. Хотя в реальности процесса с идентификатором 0 не существует. Дерево процессов можно также представить в наглядном виде при помощи опции —forest программы ps:
16388 ?00:00:00 \_ gnome-pty-helpe
Если вызвать программу ps без аргументов, то будет выведен список процессов, принадлежащих текущей группе, то есть работающих под текущим терминалом.