- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF130:DrBrown2
Материал из Linuxformat.
О процессах ясно
- О процессах слышали все, но что, собственно, это такое?
Нас пришла навестить тетушка Мод – джин пришлось припрятать. Тетя Мод что-то слышала о мире ИТ, но знала, что я «эксперт», и (к ее чести) хотела узнать еще. Она спросила: «А где программы, которые работают на моем компьютере? Если мы заглянем внутрь, сможешь их показать?» На этот вопрос было непросто ответить так, чтобы тетя Мод поняла. Конечно, можно было сказать, что программа – это «последовательность команд», и, указав на жесткий диск или чипы памяти, заявить: «Вот тут они и живут».
Мы спрятали и виски, потому что ее муж, Клайв, тоже пришел. Его познания простирались несколько дальше, и потому он был еще опаснее тети. Он спросил: «Если Linux – многопроцессная операционная система, то где же процессы? Если открыть компьютер, сможешь их показать?» Этот вопрос посложнее, потому что по сравнению с программой процесс – более абстрактное понятие. Я мог бы выдать готовый ответ, сказав, что «процесс – это экземпляр выполняемой программы», но это вряд ли бы помогло бедному Клайву. Да и мне бы не помогло.
Нудные основы
Итак, вот мое объяснение, что же такое процесс. Оно ни сжато, ни красочно – я не думаю, что так вы разберетесь в этой штуке. Программе, выполняемой в Linux, нужны некие ресурсы. Ей требуется память (кодовый сегмент, где хранится она сама, сегмент статических данных, стек и «куча», где содержатся данные). Программа может открывать файлы или подключаться к определенному серверу. Эти соединения отслеживаются с помощью «файловых дескрипторов». У программы есть понятие о «текущем каталоге», где она будет искать файлы, если их имена начинаются не с ‘/’. У нее есть «окружение» с «переменными окружения», вроде HOME=/home/chris. Наконец, программе нужно процессорное время – действительная возможность быть запланированной на выполнение в соперничестве с другими процессами, требующими того же. Именно процесс хранит весь контекст и ресурсы, необходимые для запуска программы.
Здесь может помочь аналогия с актером, читающим сценарий пьесы. Сценарий – набор инструкций, поясняющий актеру, что говорить и как вести себя на сцене. Сценарий можно сравнить с программой. Актер – объект, ответственный за чтение сценария, и подобие процесса.
Новый процесс создается тогда, когда в существующем процессе происходит системный вызов fork(). Исходный процесс называется родительским, а новый – дочерним. Сначала дочерний процесс представляет собой точную копию родительского и выполняет ту же самую программу. В моем примере с актерами, два актера теперь стоят рядом и читают один и тот же сценарий. Иногда дочерний процесс продолжает выполнять ту же программу, что и родительский: например, когда Apache порождает дочерние процессы, все они выполняют один и тот же код. Но чаще дочерний процесс перестает работать и запускает другую программу с помощью системного вызова exec(). В моем примере актер видит указание отложить текущую пьесу, взять текст «Макбета» и начать сначала.
Процесс завершается системным вызовом exit(). Его можно прервать и с помощью сигнала: об этом мы поговорим через месяц. Когда дочерний процесс прекращает работу, он возвращает код завершения (exit status) родительскому процессу, для сообщения о том, что все закончилось хорошо (код завершения 0) или что-то пошло не так (значение, отличное от нуля). Родительский процесс может ждать, пока завершится дочерний, и получить его статус с помощью системного вызова wait(). Такое происходит, когда вы набираете команду в оболочке: она создает для переданной команды новый процесс и ждет, пока он завершится. Но родительский процесс не обязан дожидаться дочерних. Когда из меню рабочего стола запускается графическое приложение или оболочкой запускается фоновое задание, родительский процесс просто продолжает работать вместе с дочерним.
Просмотреть процессы, выполняющиеся на компьютере, можно командой ps. У нее есть много флагов для выбора отображаемых процессов и информации о них, но особенно удобно начать с ps -ef. Команда произвела глубокое впечатление на моего дядюшку Клайва.