Отправляет email-рассылки с помощью сервиса Sendsay

Программирование и др.

  Все выпуски  

Программирование в Linux с нуля [03.08.2007]


Программирование в Linux с нуля [03.08.2006]

Объявление

Здравствуйте! Рассылка "Программирование в Linux с нуля" вышла из отпуска.

Книга "Программирование в Linux с нуля" версия 0.091

Tarball: ftp://ftp.lindevel.ru/zlp/zlp-0.091.tar.gz
Online: http://www.lindevel.ru/zlp

Изменения:

  • Добавлена глава 6. МНОГОЗАДАЧНОСТЬ;
  • Добавлен раздел 6.1 "Основы многозадачности в Linux".

Новые материалы книги

Глава 6. МНОГОЗАДАЧНОСТЬ

6.1. Основы многозадачности в Linux

Эта глава открывает большую и очень важную для Linux-программиста тему многозадачности. Описать все сразу не получится, поэтому мы будем неоднократно возвращаться к многозадачности в последующих главах книги. Пристегните ремни покрепче!

Наберите в своей оболочке следующую команду:


$ ps -e

На экран будут выведен список всех работающих в системе процессов. Если хотите посчитать количество процессов, наберите что-нибудь, набодобие этого:


$ ps -e --no-headers | nl | tail -n 1
74 4650 pts/0 00:00:00 tail
$

Первое число - это количество работающих в системе процессов. Пользователи KDE могут воспользоваться программой kpm, а пользователи Gnome - программой gnome-system-monitor для получения информации о процессах. На то он и Linux, чтобы позволять пользователю делать одно и то же разными способами.

Возникает вопрос: "Что такое процесс?". Процессы в Linux, как и файлы, являются аксиоматическими понятиями. Иногда процесс отождествляют с запущенной программой, однако это не всегда так. Будем считать, что процесс - это рабочая единица системы, которая выполняет что-то. Многозадачность - это возможность одновременного сосуществования нескольких процессов в одной системе.

Linux - многозадачная операционная система. Это означает что процессы в ней работают одновременно. Естественно, это условная формулировка. Ядро Linux постоянно переключает процессы, то есть время от времени дает каждому из них сколько-нибудь процессорного времени. Переключение происходит довольно быстро, поэтому нам кажется, что процессы работают одновременно.

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

К каждому процессу в системе привязана пара целых неотрицательных чисел: идентификатор процесса PID (Process IDentifier) и идентификатор родительского процесса PPID (Parent Process IDentifier). Для каждого процесса PID является уникальным (в конкретный момент времени), а PPID равен идентификатору процесса-родителя. Если ввести в оболочку команду ps -ef, то на экран будет выведен список процессов со значениями их PID и PPID (вторая и третья колонки соотв.). Вот, например, что творится у меня в системе:


$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:16 ?        00:00:01 init [3]
root         2     1  0 06:16 ?        00:00:00 [migration/0]
root         3     1  0 06:16 ?        00:00:00 [ksoftirqd/0]
root         4     1  0 06:16 ?        00:00:00 [watchdog/0]
root         5     1  0 06:16 ?        00:00:00 [migration/1]
root         6     1  0 06:16 ?        00:00:00 [ksoftirqd/1]
root         7     1  0 06:16 ?        00:00:00 [watchdog/1]
root         8     1  0 06:16 ?        00:00:00 [events/0]
root         9     1  0 06:16 ?        00:00:00 [events/1]
root        10     1  0 06:16 ?        00:00:00 [khelper]
root        11     1  0 06:16 ?        00:00:00 [kthread]
root        35    11  0 06:16 ?        00:00:00 [kblockd/0]
root        36    11  0 06:16 ?        00:00:00 [kblockd/1]
root        37    11  0 06:16 ?        00:00:00 [kacpid]
root       216    11  0 06:16 ?        00:00:00 [kseriod]
root       244    11  0 06:16 ?        00:00:00 [pdflush]
root       245    11  0 06:16 ?        00:00:00 [pdflush]
root       246    11  0 06:16 ?        00:00:00 [kswapd0]
root       247    11  0 06:16 ?        00:00:00 [aio/0]
root       248    11  0 06:16 ?        00:00:00 [aio/1]
root       395    11  0 06:16 ?        00:00:00 [ata/0]
root       396    11  0 06:16 ?        00:00:00 [ata/1]
root       397    11  0 06:16 ?        00:00:00 [ata_aux]
root       407    11  0 06:16 ?        00:00:00 [scsi_eh_0]
root       408    11  0 06:16 ?        00:00:00 [scsi_eh_1]
root       409    11  0 06:16 ?        00:00:00 [scsi_eh_2]
root       410    11  0 06:16 ?        00:00:00 [scsi_eh_3]
root       422    11  0 06:17 ?        00:00:00 [scsi_eh_4]
root       423    11  0 06:17 ?        00:00:00 [scsi_eh_5]
root      1406    11  0 06:17 ?        00:00:00 [kjournald]
root      1443    11  0 06:17 ?        00:00:00 [ksuspend_usbd]
root      1446    11  0 06:17 ?        00:00:00 [khubd]
root      1462     1  0 06:17 ?        00:00:00 /sbin/udevd --daemon
root      3230    11  0 06:17 ?        00:00:00 [kpsmoused]
nn        3498 11591  0 12:06 pts/1    00:00:08 kate 006.html
nn        3984 11591  0 12:08 pts/1    00:00:03 kate 007.html
nn        4026     1  0 12:09 ?        00:00:00 kio_uiserver [kdeinit]
nobody    4563  6054  0 09:15 ?        00:00:00 /usr/sbin/httpd -k start
root      4652    11  0 06:17 ?        00:00:00 [khpsbpkt]
root      4785    11  0 06:17 ?        00:00:00 [pccardd]
root      4786    11  0 06:17 ?        00:00:00 [tifm/0]
root      4840    11  0 06:17 ?        00:00:00 [knodemgrd_0]
root      4849    11  0 06:17 ?        00:00:00 [kmmcd]
nn        5504  6133  0 12:17 ?        00:00:00 konsole [kdeinit]
nn        5505  5504  0 12:17 pts/0    00:00:00 /bin/bash
root      5807    11  0 06:17 ?        00:00:00 [kjournald]
root      5810    11  0 06:17 ?        00:00:00 [kjournald]
root      5970     1  0 06:17 ?        00:00:00 /usr/sbin/syslog-ng
root      5973     1  0 06:17 ?        00:00:00 /usr/sbin/crond
root      5981     1  0 06:17 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe
root      5983    11  0 06:17 ?        00:00:00 [loop0]
root      5984     1  0 06:17 tty1     00:00:00 /bin/login --
root      5985     1  0 06:17 tty2     00:00:00 /sbin/agetty 38400 vc/2 linux
root      5986     1  0 06:17 tty3     00:00:00 /sbin/agetty 38400 vc/3 linux
root      5987     1  0 06:17 tty4     00:00:00 /sbin/agetty 38400 vc/4 linux
root      5988     1  0 06:17 tty5     00:00:00 /sbin/agetty 38400 vc/5 linux
root      5989     1  0 06:17 tty6     00:00:00 /sbin/agetty 38400 vc/6 linux
mysql     6026  5981  0 06:17 ?        00:00:00 /usr/sbin/mysqld --basedir=/usr
root      6029     1  0 06:17 ?        00:00:00 /usr/sbin/cupsd
postgres  6033     1  0 06:17 ?        00:00:00 /usr/bin/postmaster -D /var/lib/
root      6046     1  0 06:17 ?        00:00:00 /usr/bin/mpd /etc/mpd.conf
root      6048  6046  0 06:17 ?        00:00:04 /usr/bin/mpd /etc/mpd.conf
root      6049  6048  0 06:17 ?        00:00:01 /usr/bin/mpd /etc/mpd.conf
root      6054     1  0 06:17 ?        00:00:00 /usr/sbin/httpd -k start
postgres  6059  6033  0 06:17 ?        00:00:00 postgres: writer process
postgres  6060  6033  0 06:17 ?        00:00:00 postgres: stats buffer process
postgres  6061  6060  0 06:17 ?        00:00:00 postgres: stats collector proces
nobody    6062  6054  0 06:17 ?        00:00:00 /usr/sbin/httpd -k start
nobody    6063  6054  0 06:17 ?        00:00:00 /usr/sbin/httpd -k start
nobody    6064  6054  0 06:17 ?        00:00:00 /usr/sbin/httpd -k start
nobody    6065  6054  0 06:17 ?        00:00:00 /usr/sbin/httpd -k start
nobody    6066  6054  0 06:17 ?        00:00:00 /usr/sbin/httpd -k start
nn        6067  5984  0 06:28 tty1     00:00:00 -bash
nn        6071  6067  0 06:28 tty1     00:00:00 xinit
root      6072  6071  1 06:28 tty7     00:04:28 X :0
root      6090  6072  0 06:28 tty7     00:00:00 X :0
nn        6092  6071  0 06:28 tty1     00:00:00 /bin/sh /opt/kde/bin/startkde
nn        6113     1  0 06:28 ?        00:00:00 /usr/bin/gpg-agent --daemon
nn        6116     1  0 06:28 ?        00:00:00 /usr/bin/ssh-agent -s
root      6132     1  0 06:28 tty1     00:00:00 start_kdeinit --new-startup +kcm
nn        6133     1  0 06:28 ?        00:00:00 kdeinit Running...
nn        6136     1  0 06:28 ?        00:00:00 dcopserver [kdeinit] --nosid
nn        6138  6133  0 06:28 ?        00:00:00 klauncher [kdeinit] --new-startu
nn        6140     1  0 06:28 ?        00:00:21 kded [kdeinit] --new-startup
nn        6145  6092  0 06:28 tty1     00:00:00 kwrapper ksmserver
nn        6147     1  0 06:28 ?        00:00:00 ksmserver [kdeinit]
nn        6148  6133  0 06:28 ?        00:00:05 kwin [kdeinit] -session 106e6e64
nn        6150     1  0 06:28 ?        00:00:00 knotify [kdeinit]
nn        6152     1  0 06:28 ?        00:00:02 kdesktop [kdeinit]
nn        6154     1  0 06:28 ?        00:00:11 kicker [kdeinit]
nn        6160     1  0 06:28 ?        00:00:00 kaccess [kdeinit]
nn        6163     1  0 06:28 ?        00:00:00 kmix [kdeinit] -session 106e6e64
nn        6164  6133  0 06:28 ?        00:00:00 konqueror [kdeinit] --preload
nn        6166  6133  0 06:28 ?        00:00:00 konqueror [kdeinit] --preload
nn        6242  6133  0 06:29 ?        00:00:04 /usr/bin/python /usr/bin/sonata
nn        6251  6133  0 09:24 ?        00:00:00 kio_file [kdeinit] file /tmp/kso
nn        6256     1  0 06:29 ?        00:00:00 dbus-launch --autolaunch 27b9194
nn        6257     1  0 06:29 ?        00:00:00 /usr/bin/dbus-daemon --fork --pr
nn        8952     1  0 06:43 ?        00:00:40 kopete
nn       10460  6133  0 12:43 ?        00:00:01 konsole [kdeinit]
nn       10461 10460  0 12:43 pts/2    00:00:00 /bin/bash
nn       11454 10461  0 12:49 pts/2    00:00:00 ps -ef
nn       11590  6133  0 06:58 ?        00:00:03 konsole [kdeinit]
nn       11591 11590  0 06:58 pts/1    00:00:00 /bin/bash
nn       13609  6133  0 07:07 ?        00:00:00 /bin/sh /usr/bin/firefox
nn       13620 13609  0 07:07 ?        00:00:00 /bin/sh /opt/firefox/run-mozilla
nn       13625 13620  1 07:07 ?        00:05:52 /opt/firefox/firefox-bin
nn       13632     1  0 07:07 ?        00:00:00 /opt/gnome/libexec/gconfd-2 12
nobody   24957  6054  0 08:09 ?        00:00:00 /usr/sbin/httpd -k start

Надо отметить, что процесс init всегда имеет идентификатор 1 и PPID равный 0. Хотя в реальности процесса с идентификатором 0 не существует. Дерево процессов можно также пресставить в наглядном виде при помощи опции --forest программы ps:


$ ps -e --forest
  PID TTY          TIME CMD
    1 ?        00:00:01 init
    2 ?        00:00:00 migration/0
    3 ?        00:00:00 ksoftirqd/0
    4 ?        00:00:00 watchdog/0
    5 ?        00:00:00 migration/1
    6 ?        00:00:00 ksoftirqd/1
    7 ?        00:00:00 watchdog/1
    8 ?        00:00:00 events/0
    9 ?        00:00:00 events/1
   10 ?        00:00:00 khelper
   11 ?        00:00:00 kthread
   35 ?        00:00:00  \_ kblockd/0
   36 ?        00:00:00  \_ kblockd/1
   37 ?        00:00:00  \_ kacpid
  216 ?        00:00:00  \_ kseriod
  244 ?        00:00:00  \_ pdflush
  245 ?        00:00:00  \_ pdflush
  246 ?        00:00:00  \_ kswapd0
  247 ?        00:00:00  \_ aio/0
  248 ?        00:00:00  \_ aio/1
  395 ?        00:00:00  \_ ata/0
  396 ?        00:00:00  \_ ata/1
  397 ?        00:00:00  \_ ata_aux
  407 ?        00:00:00  \_ scsi_eh_0
  408 ?        00:00:00  \_ scsi_eh_1
  409 ?        00:00:00  \_ scsi_eh_2
  410 ?        00:00:00  \_ scsi_eh_3
  422 ?        00:00:00  \_ scsi_eh_4
  423 ?        00:00:00  \_ scsi_eh_5
 1406 ?        00:00:00  \_ kjournald
 1443 ?        00:00:00  \_ ksuspend_usbd
 1446 ?        00:00:00  \_ khubd
 3230 ?        00:00:00  \_ kpsmoused
 4652 ?        00:00:00  \_ khpsbpkt
 4785 ?        00:00:00  \_ pccardd
 4786 ?        00:00:00  \_ tifm/0
 4840 ?        00:00:00  \_ knodemgrd_0
 4849 ?        00:00:00  \_ kmmcd
 5807 ?        00:00:00  \_ kjournald
 5810 ?        00:00:00  \_ kjournald
 5983 ?        00:00:00  \_ loop0
 1462 ?        00:00:00 udevd
 5970 ?        00:00:00 syslog-ng
 5973 ?        00:00:00 crond
 5981 ?        00:00:00 mysqld_safe
 6026 ?        00:00:00  \_ mysqld
 5984 tty1     00:00:00 login
 6067 tty1     00:00:00  \_ bash
 6071 tty1     00:00:00      \_ xinit
 6072 tty7     00:04:40          \_ X
 6090 tty7     00:00:00          |   \_ X
 6092 tty1     00:00:00          \_ startkde
 6145 tty1     00:00:00              \_ kwrapper
 5985 tty2     00:00:00 agetty
 5986 tty3     00:00:00 agetty
 5987 tty4     00:00:00 agetty
 5988 tty5     00:00:00 agetty
 5989 tty6     00:00:00 agetty
 6029 ?        00:00:00 cupsd
 6033 ?        00:00:00 postmaster
 6059 ?        00:00:00  \_ postmaster
 6060 ?        00:00:00  \_ postmaster
 6061 ?        00:00:00      \_ postmaster
 6046 ?        00:00:00 mpd
 6048 ?        00:00:04  \_ mpd
 6049 ?        00:00:01      \_ mpd
 6054 ?        00:00:00 httpd
 6062 ?        00:00:00  \_ httpd
 6063 ?        00:00:00  \_ httpd
 6064 ?        00:00:00  \_ httpd
 6065 ?        00:00:00  \_ httpd
 6066 ?        00:00:00  \_ httpd
24957 ?        00:00:00  \_ httpd
 4563 ?        00:00:00  \_ httpd
 6113 ?        00:00:00 gpg-agent
 6116 ?        00:00:00 ssh-agent
 6132 tty1     00:00:00 start_kdeinit
 6133 ?        00:00:00 kdeinit
 6138 ?        00:00:00  \_ klauncher
 6148 ?        00:00:05  \_ kwin
 6164 ?        00:00:00  \_ konqueror
 6166 ?        00:00:00  \_ konqueror
 6242 ?        00:00:04  \_ sonata
11590 ?        00:00:03  \_ konsole
11591 pts/1    00:00:00  |   \_ bash
 3498 pts/1    00:00:09  |       \_ kate
 3984 pts/1    00:00:03  |       \_ kate
13609 ?        00:00:00  \_ firefox
13620 ?        00:00:00  |   \_ run-mozilla.sh
13625 ?        00:05:56  |       \_ firefox-bin
 6251 ?        00:00:00  \_ kio_file
 5504 ?        00:00:00  \_ konsole
 5505 pts/0    00:00:00  |   \_ bash
10460 ?        00:00:01  \_ konsole
10461 pts/2    00:00:00      \_ bash
12140 pts/2    00:00:00          \_ ps
 6136 ?        00:00:00 dcopserver
 6140 ?        00:00:21 kded
 6147 ?        00:00:00 ksmserver
 6150 ?        00:00:00 knotify
 6152 ?        00:00:02 kdesktop
 6154 ?        00:00:11 kicker
 6160 ?        00:00:00 kaccess
 6163 ?        00:00:00 kmix
 6256 ?        00:00:00 dbus-launch
 6257 ?        00:00:00 dbus-daemon
 8952 ?        00:00:40 kopete
13632 ?        00:00:00 gconfd-2
 4026 ?        00:00:00 kio_uiserver

Если вызвать программу ps без аргументов, то будет выведен список процессов, принадлежащих текущей группе, то есть работающих под текущим терминалом. О том, что такое терминалы и группы процессов, будет рассказано в последующих главах.

Контакты

Сайт проекта Lindevel.Ru (http://www.lindevel.ru) посвящен программированию в Linux. Здесь вы всегда сможете найти последнюю версию книги, а также оставить вопросы и пожелания в форуме (http://forum.lindevel.ru). E-mail автора книги nn at lindevel dot ru (Nikolay N. Ivanov).


Рассылки Subscribe.Ru
FreeBSD

В избранное