Утилиты

Ядро

Структура UNIX

Семейства UNIX

(***слайд 46) Все UNIX-системы можно отнести либо к гнезду USG (это прямые наследники творения Bell Labs: Linux, UnixWare, SCO Open Server, HPUX, AIX, Solaris,), либо к гнезду BSD (все системы, название которых включает BSD, ядро Mac OS (Darwin), Tru64 и некоторые другие).

Следует понимать, что Linux - название даже не операционной системы, а одного только ядра. Ядро это, ориентированное первоначально на процессор i386, написал в одиночку Линус Торвальдс (Linus Torvalds), желая создать на этом компьютере среду выполнения UNIX, аналогичную коммерческим версиям. Тогда, в самом начале 90-х, UNIX-подобные системы для i386 были неполными и довольно нелепыми, а кроме того, исходные тексты этих систем не были доступны. Все остальное в Linux-системе - программы, написанные программистами со всего мира и собранные (после тщательной доработки напильником) в единое целое.

Из всей UNIX-истории нам важны два факта. Во-первых, UNIX создавался для того, чтобы на нем работать, а не для того, чтобы им потом торговать, т. е. для себя. А когда им додумались торговать, уже ничего испортить, перекроив удобство в привлекательность, было нельзя. Образ мысли авторов UNIX породил особую идеологию и принципы системы. Именно попытка формализовать и обосновать эти принципы и привела к понятию "проективной системы".

Рассмотрим теперь вкратце общее устройство UNIX как ОС (*** слайд 47).

Центром ОС является, как было сказано раньше, менеджер ресурсов и планировщик задач. Функции этих частей системы востребованы, пока есть хоть одна задача (т. е. всегда), и к тому же они работают в режиме супервизора. В UNIX они составляют ядро системы (kernel). Ядро постоянно находится в памяти, обслуживая непрерывный поток запросов на использование универсальных ресурсов системы: памяти и времени. В ядро UNIX, кроме того, входит реализация сетевых протоколов. Ядро UNIX предоставляет программам пользователя унифицированный интерфейс к ресурсам компьютера (так называемые системные вызовы, system calls) и содержит всю непростую логику распределения ресурсов по задачам, которые в UNIX называются процессами.

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

Программные драйверы включаются в состав ядра в том случае, если соответствующие им устройства входят (или будут входить) в состав компьютера. Одни драйверы (скажем, шины PCI) есть в системе почти всегда, другие написаны специально для контроллера какого-нибудь экзотического устройства. Существуют драйверы, которые не являются интерфейсной частью внешнего устройства, а реализуют дополнительную функциональность самой системы (скажем, драйвер файловой системы ISO-9660, которая используется на лазерных дисках).

В старых версиях UNIX все драйверы приходилось заранее прикомпоновывать к ядру (т. е. пользоваться компоновщиком). Процесс компиляции ядра из исходных текстов или компоновки его из объектных модулей называетсясборкой ядра и во многих системах практикуется и по сей день. С увеличением размеров оперативной памяти отпала необходимость экономить байты на сборке ядра. Но, однако, разработчики все же стараются собрать ядро, содержащее драйверы всех самых популярных устройств, чтобы оно, не занимало слишком много памяти и могло управлять системой на подавляющем большинстве компьютеров. Такое ядро называется базовым (generic). Поскольку для пересборки ядра необходимы многие знания (как минимум, нужно разбираться в архитектуре используемой версии UNIX, в архитектуре ЭВМ и в особенности внешних устройств), а нужда в этом может возникнуть даже при первой установке системы, хорошо укомплектованное базовое ядро во многом облегчает жизнь неопытному пользователю. Можно сказать, что все современные версии Linux изначально имеют базовое ядро.

Если базового ядра все-таки недостаточно, то в современных системах многие драйверы можно загружать динамически, из дополнительных модулей и даже перекомпоновать ядро прямо на ходу! Т.к. модули ядра работают в привилегированном режиме, обращаться с ними следует крайне осторожно: ошибка в таком модуле (скажем, запись неизвестно чего неизвестно куда в память) может быть фатальной и даже, вызвать крах системы.

Итак, ядро и его дополнительные модули работают в привилегированном режиме, а все остальные части UNIX запускаются уже как процессы в режиме пользователя. Хотя, очень тесно с ядром взаимодействует функциональная подсистема (службы), т.е. наборы программных средств, выполняющих определенную функцию (например, система печати, система передачи почты и т. д.). Управляющий центр функциональной подсистемы - это так называемый демон (daemon, в переводах с греческого называемый "даймон"). Демон - это процесс, который запускается при старте UNIX для обслуживания запросов к функциональной подсистеме, т.е. выполняет роль посредника. Пользователю запускать его незачем, он работает всегда. Именно демон обменивается данными с ядром системы, часто он держит очередь пользовательских запросов, работает с сетью и выполняет некоторые другие задачи.

Обращаться к системным вызовам могут, конечно, не только демоны, но и вообще любые программы. В UNIX входит немало программ, при помощи которых можно решать разнообразные инструментальные задачи (т. е. связанные с работой самой системы). Это так называемые системные утилиты. Они используются в первую очередь самой системой и системным администратором. Однако и пользователь, не обладающий правами администратора, вполне может задействовать системные утилиты, если они помогают ему в работе, а системе не мешают (например, создавать файловую систему на дискете, просматривать состояние системы или ее ресурсов и т.п.).

Пользовательских программ-утилит в UNIX еще больше, чем системных (чем определенно нарушается принцип Умопостижимости контекста. Множество пользовательских утилит занимается преобразованием текста, немало утилит помогает при разработке различных решений: компиляторы, отладчики, редакторы диаграмм и т. д. Почти всеми пользовательскими утилитами пользуется система, потому что при проективном подходе вообще невозможно провести четкую границу между системным и пользовательским наполнением. К обеим категориям, например, относятся утилиты для работы с файлами и файловой системой или интерпретатор командной строки (shell).