Основы программирования в Linux
Системные библиотеки также можно совместно использовать. Следовательно, в памяти нужна, например, только одна копия функции
, даже если многие выполняющиеся программы вызывают ее. Эта схема более сложная, но аналогичная той, которую используют для работы динамически подключаемые библиотеки в ОС Windows.printfКак видно из приведенной схемы, дополнительное преимущество заключается в том, что дисковый файл, содержащий исполняемую программу
, меньше, т.к. не включает программный код совместно используемой библиотеки. Возможно, для одной программы это не слишком ощутимый выигрыш, но извлечение часто используемых подпрограмм, к примеру, из стандартной библиотеки С экономит значительный объем для операционной системы в целом.grepКонечно не все, что нужно программе, может быть совместно использовано. Например, переменные отдельно используются каждым процессом. В данном примере искомая строка, передаваемая команде
, — это переменнаяgrep, принадлежащая пространству данных каждого процесса. Эти пространства разделены и, как правило, не могут читаться другим процессом. Файлы, которые применяются в двух командах grep, тоже разные; у каждого процесса есть свой набор файловых дескрипторов, используемых для доступа к файлам.sКроме того, у каждого процесса есть собственный стек, применяемый для локальных переменных в функциях и для управления вызовами функций и возвратом из них. У процесса также собственное окружение, содержащее переменные окружения, которые могут задаваться только для применения в данном процессе, например, с помощью функций
иputenv, как было показано в главе 4. Процесс должен поддерживать собственный счетчик программы, запись того места, до которого он добрался за время выполнения, или поток исполнения. В следующей главе вы увидите, что процессы могут иметь несколько потоков исполнения.getenvВо многих системах Linux и некоторых системах UNIX существует специальный набор "файлов" в каталоге /proc. Это скорее специальные, чем истинные файлы, т.к. позволяют "заглянуть внутрь" процессов во время их выполнения, как если бы они были файлами в каталогах, В главе 3 мы приводили краткий обзор файловой системы /proc.
И наконец, поскольку Linux, как и UNIX, обладает системой виртуальной памяти, которая удаляет страницы кода и данных на жесткий диск, можно управлять гораздо большим количеством процессов, чем позволяет объем физической памяти.
Таблица процессов
Таблица процессов Linux подобна структуре данных, описывающей все процессы, загруженные в текущий момент, например, их PID, состояние и строку команды, разновидность информационного вывода команды
. Операционная система управляет процессами с помощью их идентификаторов, PID, которые применяются как указатели в таблице процессов. У таблицы ограниченный размер, поэтому число процессов, поддерживаемых системой, ограничено. В первых системах UNIX оно равнялось 256 процессам. Более современные реализации значительно ослабили это ограничение и ограничены только объемом памяти, доступным для формирования элемента таблицы процессов.psПросмотр процессов
Команда
показывает выполняемые вами процессы, процессы, выполняемые другим пользователем, или все процессы в системе. Далее приведен еще один пример вывода:ps$ <b>ps -ef</b>UID PID PPID С STIME TTY TIME CMDroot 433 425 0 18:12 tty1 00:00:00 [bash]rick 445 426 0 18:12 tty2 00:00:00 -bashrick 456 427 0 18:12 tty3 00:00:00 [bash]root 467 433 0 18:12 tty1 00:00:00 sh /usr/X11R6/bin/startxroot 474 467 0 18:12 tty1 00:00:00 xinit /etc/X11/xinit/xinitrc --root 478 474 0 18:12 tty1 00:00:00 /usr/bin/gnome-sessionroot 487 1 0 18:12 tty1 00:00:00 gnome-smproxy --sm-client-id defroot 493 1 0 18:12 tty1 00:00:01 [enlightenment]root 506 1 0 18:12 tty1 00:00:03 panel --sm-client-id defaultsroot 508 1 0 18:12 tty1 00:00:00 xscreensaver -no-splash -timeoutroot 510 1 0 18:12 tty1 00:00:01 gmc --sm-client-id default10root 512 1 0 18:12 tty1 00:00:01 gnome-help-browser --sm-client-iroot 649 445 0 18:24 tty2 00:00:00 suroot 653 649 0 18:24 tty2 00:00:00 bashneil 655 428 0 18:24 tty4 00:00:00 -bashroot 713 1 2 18:27 tty1 00:00:00 gnome-terminalroot 715 713 0 18:28 tty1 00:00:00 gnome-pty-helperroot 717 716 13 18:28 pts/0 00:00:01 emacsroot 718 653 0 18:28 tty2 00:00:00 ps -efВывод отображает информацию о многих процессах, включая процессы, запущенные редактором Emacs в графической среде X ОС Linux. Например, столбец
показывает, с какого терминала стартовал процесс, столбецTTYпоказывает время ЦПУ, затраченное к данному моменту, а столбецTIME— команду, примененную для запуска процесса. Давайте познакомимся поближе с некоторыми из этих процессов.CMDneil 655 428 0 18:24 tty4 00:00:00 -bashНачальная регистрация была произведена на консоли номер 4. Это просто консоль на данном компьютере. Выполняемая программа командной оболочки — это стандартная оболочка Linux,
.bashroot 467 433 0 18:12 tty1 00:00:00 sh /usr/X11R6/bin/startxX Window System была запущена командой
. Это сценарий командной оболочки, который запускает сервер X и выполняет некоторые начальные программы системы X.startxroot 717 716 13 18:28 pts/0 00:00:01 emacsЭтот процесс представляет окно в системе X, выполняющее программу Emacs. Он был запущен оконным диспетчером в ответ на запрос нового окна. Командной оболочке был назначен новый псевдотерминал pts/0 для считывания и записи.
root 512 1 0 18:12 tty1 00:00:01 gnome-help-browser --sm-client-iЭто обозреватель системы помощи среды GNOME, запущенный оконным диспетчером.
По умолчанию программа
выводит только процессы, поддерживающие подключение к терминалу, консоли, последовательной линии связи или псевдотерминалу. Другие процессы выполняются без взаимодействия с пользователем на терминале. Обычно это системные процессы, которые система Linux применяет для управления совместно используемыми ресурсами. Командуpsможно применять для отображения всех таких процессов, использовав опциюpsи запросив "полную" информацию с помощью опции-е.-f