Глава из книги Сага о FreeBSD
Алексей Федорчук
2008-11-19
ОС FreeBSD, как и любая Unix-подобная система, основывается на трёх понятиях: процесса, файла и пользователя (точнее, пользовательского аккаунта). Всё, что существует в системе статически, суть файлы; всё, что существует в системе в динамике, суть процессы; все, кто тем или иным образом взаимодействует с системой — её процессами и её файлами, — суть пользователи. Казалось бы, всё просто и понятно — но именно во взаимосвязи этих трёх понятий и кроется основная сложность при изучении Unix-подобных систем. Ибо ими определяется резкое топологическое отличие модели их мироустройства от привычных пользователю DOS или Windows.
Действительно, модель DOS — строго линейна: из пункта А можно достигнуть пункта Б посредством команды В. Более того, линейна она однонаправленно: вернуться назад можно в лучшем случае на один шаг. Из чего и проистекает ограниченность DOS, как на узкой тропе: шаг в сторону — побег (ошибка), прыжок на месте — провокация (зависание). Впрочем, в этой линейности и ограниченности кроется одна из притягательных особенностей DOS, а именно — простота ее использования. Особенно — в тех ситуациях, когда отклонение от генеральной линии нежелательно, а то и просто запрещено.
Модель мира Windows (и сходной с ней в этом отношении MacOS) аппроксимируется понятием плоскости — не зря же пресловутая метафора рабочего стола стала в этих системах столь популярной. Конечно, по плоскости можно двигаться не только вперед и назад, но также влево и вправо. Однако — не более, что также накладывает ограничения. И к тому же резко возрастает вероятность выбора неправильного направления...
Естественный путь преодоления ограничений двухмерной модели — придание плоскости глубины, что время от времени и проделывается в системах из рода Windows и ее идеологических собратьев. Однако ни один из экспериментов по созданию 3D-интерфейсов пока не дал иных результатов, кроме внешних "красивостей".
FreeBSD же не испытывает потребности в третьем измерении. Поскольку изначально она унаследовала от первозданного Unix принципиально иную концепцию мироздания — циклическую, или, если хотите, рекурсивную. Именно рекурсией обусловлена мощь Unix-подобных систем. Но она же и создает наибольшие трудности в их изучении, так как аналогичных понятий нет ни в DOS, ни в Windows, ни в MacOS. Да и в реальной жизни человек с понятием рекурсии практически не сталкивается...
Попробую проиллюстрировать свое утверждение применительно к трём краеугольным понятиям — процесса, файла, пользователя. К каковым и можно свести почти все происходящее в системе: пользователь инициирует процесс как нечто длящееся во времени, порождающее файл как статический результат своей деятельности, который возвращаетсяся пользователю в силу свойств процесса, породившего файл.
Однако и сам пользователь порождается процессом (вернее, цепочкой процессов, в первооснове которых — первый процесс системы, init), свойства которого определяются конфигурационным файлом, возникшим вследствии процесса и в силу этого принадлежащим пользователю. Который в ряде случаев и сам является не столько г-ном имя_рек, нажимающим на клавиши терминала, сколько процессом, инициированным процессом init.
В результате любой пользователь, начинающий изучение FreeBSD, упирается в замкнутый, казалось бы, круг — невозможно понять (или объяснить), что такое файл (и его атрибуты), не имея представления о процессе, осознать суть которого трудно, не зная понятия пользовательского аккаунта.
Тем не менее, осознание проблемы рекурсивности FreeBSD — уже половина ее решения. Ведь можно поступить подобно Александру Филипповичу (Македонскому) и просто разорвать круг в любой его точке. Какой? Тут не избежать чисто волюнтаристического решения. И в настоящей книге мы начнём знакомство с "тремя китами" Unix-мира с понятия процесса. И с верой в то, что со временем всё, что покажется поначалу непонятным, обретёт для читателя смысл. Для определённости, в этой и двух последующих главах речь пойдёт о процессах, файлах и пользовательских аккаунтах применительно к FreeBSD. Однако почти всё это, за буквально единичными (и специально оговоренными) исключениями, приложимо к любой Unix-подобной операционной системе.
Понятие процесса принадлежит к тем сущностям, кажущимся интуитивно ясными, и которым, тем не менее, нелегко дать строгое (и при этом удобопонятное) определение. Наиболее распространенное их них — это представление процесса как программы в стадии ее выполнения (Андрей Робачевский. Операционная система Unix. СПб: БХВ-Петербург, 2000).
Однако процесс и программа — далеко не идентичные понятия. Во-первых, существуют процессы, которым не соответствует никакой программы (то есть никакого исполняемого файла). Во-вторых, программа в ходе своего выполнения может породить более одного процесса. В-третьих, в рамках одного процесса может происходить замещение одной программы другой. И наконец, в-четвертых — и это, пожалуй, главное, — при запуске программы порождение нового процесса (системный вызов fork) предшествует собственно запуску программы (системный вызов exec).
Так что, пожалуй, наиболее строгим определением процесса будет следующее: процесс — это то, что порождается системным вызовом fork. Каковой, в свою очередь, в лучших традициях Unix-рекурсии можно определить как системный вызов, порождающий процессы. Не очень понятно, да? Ну что же, определение процесса в стандарте ISO 9000:2000 Definitions как совокупности взаимосвязанных действий, преобразующих входящие данные в исходящие, не намного более ясно. Что же примем это как данность...
Все сказанное может вызвать естественный вопрос: а зачем обычному (=конечному) пользователю FreeBSD вообще нужно знать о каких-то там процессах? Ведь пользователь MacOS (BSD-системы в своей основе — то есть тоже имеющей понятие процесса) спокойно обходится без этих знаний. Да и в Windows причин знакомиться с ними у пользователя нет ни малейших.
Причин к рассмотрению понятия процесса с позиций пользователя несколько. Первая, гносеологическая, — просто не кажется лишним знать, что там у этого пользователя в системе происходит (а, как уже говорилось, все, что происходит в системе — пользователя ли, администратора, или программиста — суть процессы).
Однако есть и несколько более практических причин для хотя бы беглого знакомства с понятием процесса. Во-первых, понимание взаимоотношений между процессом и запущенной программой очень не вредно при всякого рода настроечных мероприятиях — дабы не удивляться, почему командная оболочка в консоли ведет себя одним образом, запущенная в окне терминала — другим, а в некоторых особых случаях — вообще третьим (например, категорически отказывается находить исполняемые файлы). А во-вторых, представление о процессах и способах влияния на них часто оказывается незаменимым в аварийных ситуациях. Так что давайте уделим этому вопросу некоторое внимание.