Реферат Курсовая Конспект
Основы многозадачности в 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 (вторая и третья колонки соотв.). Пример работы такой команды:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
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] <defunct>
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:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
PIDTTYTIMECMD
2 ? 00:00:00 kthreadd
3 ?00:00:00 _ migration/0
4 ?00:00:00 _ ksoftirqd/0
5 ?00:00:00 _ watchdog/0
6 ?00:00:00 _ migration/1
7 ?00:00:00 _ ksoftirqd/1
8 ?00:00:00 _ watchdog/1
9 ?00:00:00 _ events/0
10 ?00:00:00 _ events/1
11 ?00:00:00 _ cpuset
12 ?00:00:00 _ khelper
13 ?00:00:00 _ netns
14 ?00:00:00 _ async/mgr
15 ?00:00:00 _ kintegrityd/0
16 ?00:00:00 _ kintegrityd/1
….
18544 pts/2 00:00:00 _ bash
16388 ?00:00:00 _ gnome-pty-helpe
16389 pts/1 00:00:00 _ bash
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Если вызвать программу ps без аргументов, то будет выведен список процессов, принадлежащих текущей группе, то есть работающих под текущим терминалом.
Использование getpid() и getppid()
Процесс может узнать свой идентификатор (PID), а также родительский идентификатор (PPID) при помощи системных вызовов getpid() и getppid().
Системные вызовы getpid() и getppid() имеют следующие прототипы:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
pid_t getpid (void);
pid_t getppid (void);
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Для использования getpid() и getppid() в программу должны быть включены директивой #include заголовочные файлы unistd.h и sys/types.h (для типа pid_t). Вызов getpid() возвращает идентификатор текущего процесса (PID), а getppid() возвращает идентификатор родителя (PPID). pid_t - это целый тип, размерность которого зависит от конкретной системы. Значениями этого типа можно оперировать как обычными целыми числами типа int.
Рассмотрим теперь простую программу, которая выводит на экран PID и PPID, а затем "замирает" до тех пор, пока пользователь не нажмет <Enter>.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/* getpid.c */
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main (void)
{
pid_t pid, ppid;
pid = getpid ();
ppid = getppid ();
printf ("PID: %dn", pid);
printf ("PPID: %dn", ppid);
fprintf (stderr, "Press <Enter> to exit...");
getchar ();
return 0;
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Проверим теперь, как работает эта программа. Для этого откомпилируем и запустим ее:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
$ gcc -o getpid getpid.c
$ ./getpid
PID: 19724
PPID: 19702
Press <Enter> to exit...
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Теперь, не нажимая <Enter>, откроем другое терминальное окно и проверим, правильность работы системных вызовов getpid() иgetppid():
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
$ ps -ef | grep getpid
df00 19724 19702 0 20:58 pts/3 00:00:00 ./main
df00 19856 18544 0 21:00 pts/2 00:00:00 grep --colour=auto main
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
– Конец работы –
Эта тема принадлежит разделу:
Министерство образования и науки РФ... Федеральное агентство по образованию... Государственное образовательное учреждение высшего профессионального образования...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Основы многозадачности в Linux
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов