Архитектура UNIX. Файлы и устройства

Особенности архитектуры UNIX

Презентация 2-01: основные концепции UNIX

Знакомство с архитектурой UNIX начнем с рассмотрения таких неотъемлимых для неё характеристических понятий, как стандартизация и многозадачность:

Стандартизация

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

Многозадачность

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

Два кита UNIX: файлы и процессы

Существует два основных объекта операционной системы UNIX, с которыми приходится работать пользователю — файлы и процессы. Эти объекты тесно связаны друг с другом, и в целом способ организации работы с ними как раз и определяет архитектуру операционной системы.

Все данные пользователя храняться в файлах; доступ к периферийным устройствам осуществляется посредством чтения и записи специальных файлов; во время выполнения программы операционная система считывает исполняемый код из файла в память и передает ему управление. Принципы храниния и доступа к файлам объединяются понятием файловой системы, которое будет рассмотрено подробнее чуть позже.

С другой стороны, вся функциональность информационной системы определяется выполнением соответствующих процессов. Процесс — это исполняющаяся программа, относящаяся к операционной системе или запущенная пользователем.

Беглый взгляд на архитектуру UNIX

Презентация 2-02: беглый взгляд на архитектуру UNIX

Самый общий взляд на архитектуру UNIX позволяет увидеть двухуровневую модель системы, состоящую из пользовательской и системной части (ядра) (см. Рисунок 1.20, «Архитектура операционной системы UNIX»). Ядро непосредственно взаимодействует с аппаратной частью компьютера, изолируя прикладные программы (процессы в пользовательской части операционной системы) от особенностей ее архитектуры. Ядро имеет набор услуг, предоставляемых прикладным программам посредством системных вызовов. Таким образом, в системе можно выделить два уровня привилегий: уровень системы (привилегии специального пользователя root) и уровень пользователя (привилегии всех остальных пользователей). Подробнее об управлении доступом рассказывается в следующих главах («Введение в безопасность UNIX»).

Рисунок 1.20. Архитектура операционной системы UNIX

Архитектура операционной системы UNIX


Важную часть системных программ составляют демоны. Демон — это процесс, выполняющий опеределенную функцию в системе, который запускается при старте системы и не связан ни с одним пользовательским терминалом. Демоны предоставляют пользователям определенные сервисы, примерами которых могут служить системный журнал, веб-сервер и т. п. Аналогом демонов в операционной системе Windows NT и более поздних версиях являются системные службы.

Ядро UNIX

Презентация 2-03: ядро UNIX

Операционная система UNIX обладает классическим монолитным ядром (см. «Архитектура операционной системы»), в котором можно выделить следующие основные части:

Файловая подсистема

Доступ к структурам ядра осуществляется через файловый интерфейс.

Управление процессами

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

Драйверы устройств

Драйверы устройств делятся на символьные и блочные по типу внешнего устройства. Для каждого из устройств определен набор возможных операций (открытие, чтение и т. д.). Блочные устройства кэшируются с помощью специального внутреннего механизма управления буферами. Подробнее об этом сказано в разделе «Устройства и драйверы».

Рисунок 1.21. Ядро операционной системы UNIX

Ядро операционной системы UNIX


Благодаря тому, что в UNIX аппаратно-независимая часть отделена явно, операционные системы этого семейства могут быть с минимальными затратами перенесены на новые аппаратные платформы.

Видно, что ядро операционной системы UNIX является классическим для многозадачной многопользовательской операционной системы, поэтому оно широко используется в обучении системному программированию и теории операционных систем.

Файловая система UNIX

Термин файловая система по историческим причинам обозначает одновременно и иерархию каталогов и файлов, и часть ядра, управляющую доступом к каталогам и файлам.

Особенности файловой системы

Презентация 2-04: файловая система UNIX

Организация файловой системы в первом значении этого термина означает рассмотрение структур, в которые могут быть организованы файлы на носителях данных. Существует несколько видов таких структур: линейные, древовидные, объектные и другие, но в настоящее время широко распространены только древовидные структуры.

Каджый файл в древовидной структуре расположен в определенном хранилище файлов — каталоге, каждый каталог, в свою очередь, также расположен в некотором каталоге. Таким образом, по принципу вложения элементов файловой системы (файлов и каталогов) друг в друга строится дерево, вершинами которого являются непустые каталоги, а листьями — файлы или пустые каталоги. Корень такого дерева имеет название корневой каталог и обозначается каким-либо специальным символом или группой символов (например, «C:» в операционной системе Windows). Каждому файлу соответствует некоторое имя, определяющее его расположение в дереве файловой системы. Полное имя файла состоит из имен всех вершин дерева файловой системы, через которые можно пройти от корня до данного файла (каталога), записывая их слева-направо и разделяя специальными символами-разделителями.

Рисунок 1.22. Индексная файловая система UNIX

Индексная файловая система UNIX


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

  • Презентация 2-05: индексный узел

    Файлы и каталоги идентифицируются не по именам, а по индексным узлам (i-node) — индексам в общем массиве файлов для данной файловой системы. В этом массиве хранится информация об используемых блоках данных на носителе, а также — длина файла, владелец файла, права доступа и другая служебная информация под общим названием «метаданные о файле». Логические же связки типа «имя файла—i-node» — есть не что иное как содержимое каталогов.

    Таким образом, каждый файл характеризуется одним i-node, но может быть связан с несколькими именами — в UNIX это называют жёсткими ссылками (см. Рисунок 1.23, «Пример жесткой ссылки»). При такой схеме физическое удаление данных файла с носителя происходит только тогда, когда удаляется последняя из существующих жёстких ссылок на этот файл.

    Рисунок 1.23. Пример жесткой ссылки

    Пример жесткой ссылки


    Важной особенностью таких файловых систем является то, что имена файлов зависят от регистра, другими словами файлы test.txt и TEST.txt отличаются (т. е. могут находиться в одном каталоге и быть при этом разными файлами).

  • В определенных блоках физического носителя данных находится т. н. суперблок (см. рисунок Рисунок 1.22, «Индексная файловая система UNIX»). Местоположение суперблока на носителе определяется при создании файловой системы. Суперблок — это наиболее ответственная область файловой системы, содержащая информацию, необходимую для работы файловой системы в целом, а также — для ёе идентификации. В суперблоке находится «магическое число» — идентификатор файловой системы, отличающий её от других файловых систем, список свободных блоков, список свободных индексных узлов (i-node) и некоторая другая служебная информация.

  • Помимо каталогов и обычных файлов для хранения информации, ФС может содержать следующие виды файлов:

    Специальный файл устройства

    Обеспечивает доступ к физическому устройству. При создании такого устройства указывается тип устройства (блочное или символьное), старший номер — индекс драйвера в таблице драйверов операционной системы и младший номер — параметр, передаваемый драйверу, поддерживающему несколько устройств, для уточнения о каком «подустройстве» идет речь (например, о каком из нескольких IDE-устройств или COM-портов). Устройства рассматриваются в разделе «Устройства и драйверы».

    Именованный канал

    Используется для передачи данных между процессами, работает по принципу двунаправленной очереди (FIFO). Является одним из способов обмена данными между изолированными процессами (подробнее см. «Межпроцессное взаимодействие»).

    Символьная ссылка

    Особый тип файла, содержимое которого — не данные, а имя какого-либо другого файла (см. Рисунок 1.24, «Пример символьной ссылки». Для пользователя такой файл в большинстве ситуаций неотличим от того, на который он ссылается: операции чтения, записи и пр. над символьной ссылкой работают так, как если бы они производились непосредственно над тем файлом, на который указывает ссылка. Символьные ссылки могут указывать также и на каталог: в этом случае они «работают» как каталоги.

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

    Рисунок 1.24. Пример символьной ссылки

    Пример символьной ссылки


    Сокет

    Предназначен для взаимодействия между процессами через специальное API, схожее с TCP/IP-сокетеми (подробнее см. «Межпроцессное взаимодействие»).

Устроенные подобным образом файловые системы наследуют особенности оригинальной UNIX. К ним можно отнести, например: s5 (используемая в версиях UNIX System V), ufs (BSD UNIX), ext2, ext3, reiserfs (Linux), qnxfs (QNX). Все эти файловые системы различаются форматами внутренних структур, но совместимы с точки зрения основных концепций.

Виртуальная файловая система

Презентация 2-06: виртуальная файловая система

Рассмотрение второго значения термина файловая система приводит нас к уже обозначенной ранее совокупности процедур, осуществляющих доступ к файлам на различных носителях.

Файловая подсистема операционной системы UNIX имеет специальный уровень абстракции для обработки запросов к файлам — переключатель файловых систем или виртуальная файловая система (VFS). VFS предоставляет пользователю стандартный набор функций (интерфейс) для работы с файлами, вне зависимости от места их расположения и принадлежности к разным файловым системам.

Рисунок 1.25. Виртуальная фаловая система

Виртуальная фаловая система


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

В мире стандартов UNIX определено, что корневой каталог единого дерева файловой системы должен иметь имя /, как и символ-разделитель при формировании полного имени файла. Тогда полное имя файла может быть, например, /usr/share/doc/bzip2/README. Задача VFS — по полному имени файла найти его местоположение в дереве файловой системы, определить её тип в этом месте дерева и «переключить», т. е. передать файл на дальнейшую обработку драйверу конктретной файловой системы. Такой подход позволяет использовать практически неограниченое количество различных файловых систем на одном компьютере под управлением одной операционной системы, а пользователь даже не будет знать, что файлы физически находятся на разных носителях информации.

Дерево каталогов

Презентация 2-07: монтирование файловых систем

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

Презентация 2-08: стандарт на файловую систему

Использование общепринятых имен основных файлов и структуры каталогов существенно облегчает работу в операционной системе, её администрирование и переносимость. Приведем краткое описание основных каталогов системы, формально описываемых специальным стандартом на иерархию файловой системы (Filesystem Hierarchy Standart). Стандарт регулирует не только и не столько имена основных каталогов системы, сколько типы размещаемых в них данных (исполняемые программы, библиотеки, файлы пользователя, временные системные данные и т. д.). Главный принцип, который соблюдается довольно последовательно — группировка однотипных данных в одной области файловой системы (каталоге верхнего уровня и его подкаталогах).

Например, все каталоги можно разделить на две группы: для статических (редко меняющихся) данных — /bin, /usr и для динамических (часто меняющихся) данных — /var, /tmp. Исходя из этого администраторы могут разместить каждый из этих каталогов на собственном носителе, обладающем соответствующими характеристиками: скоростью доступа, объёмом, надёжностью и т. п.

Рисунок 1.26. Стандартные каталоги в файловой системе UNIX

Стандартные каталоги в файловой системе UNIX

Корневой каталог

Корневой каталог / является основой любой ФС UNIX. Все остальные каталоги и файлы располагаются в рамках струтуры (дерева), порождённой корневым каталогом, независимо от их физического местонахождения.

/bin

В этом каталоге находятся часто употребляемые команды и утилиты системы общего пользования. Сюда входят все базовые команды, доступные даже в том случае, если была примонтирована только корневая файловая система. Примерами таких утилит являются: ls, cp, sh и т. п.

/boot

Каталог содержит всё необходимое для процесса загрузки операционной системы: программу-загрузчик, образ ядра операционной системы и т. п.

/dev

Каталог содержит специальные файлы устройств, при помощи которых осуществляется доступ к периферийным устройствам. Наличие такого каталога не означает, что специальные файлы устройств нельзя создавать в другом месте, просто достаточно удобно иметь один каталог для всех файлов такого типа.

/etc

В этом каталоге находятся системные конфигурационные файлы. В качестве примеров можно привести файлы /etc/fstab, содержащий список монтируемых файловых систем, и /etc/resolv.conf, который задаёт правила составления локальных DNS-запросов. Среди наиболее важных файлов — скрипты инициализации и останова системы. В системах, наследующих особенности UNIX System V, для них отведены каталоги с /etc/rc0.d по /etc/rc6.d и общий для всех файл описания — /etc/inittab.

/home (необязательно)

Каталог содержит домашние каталоги пользователей. Его наличие в корневом каталоге не обязательно, а содержимое зависит от особенностей конкретной UNIX-подобной операционной системы.

/lib

Каталог для статических и динамических библиотек, необходимых для запуска программ, находящихся в каталогах /bin и /sbin.

/media

Стандартный каталог для временного монтирования файловых систем — например, гибких и флэш-дисков, компакт-дисков и т. п.

/root (необязательно)

Домашний каталог суперпользователя. Его наличие в корневом каталоге не обязательно.

/sbin

В этом каталоге находятся команды и утилиты для системного администратора. Примерами таких команд являются: route, halt, init и т. п. Для аналогичных целей применяются каталоги /usr/sbin и /usr/local/sbin.

/usr

Этот каталог повторяет структуру корневого каталога — содержит каталоги /usr/bin, /usr/lib, /usr/sbin, служащие для аналогичных целей.

Каталог /usr/include содержит заголовочные файлы языка C для всевозможных библиотек, расположенных в системе.

Каталог /usr/local — ещё один уровень, в котором можно полностью воспроизвести структуру данных, содержащуюся в корневом каталоге. Обычно этот каталог служит для размещения программ, установленных администратором в дополнение к стандартной поставке операционной системы.

Каталог /usr/share хранит неизменяющиеся данные для установленных программ. Особый интерес представляет каталог /usr/share/doc, в который добавляется документация ко всем установленным программам.

/var, /tmp

Используются для хранения временных данных системных (/var) и пользовательских (/tmp) процессов. Каталог /var обычно содержит часто изменяемые системные файлы, например в каталоге /var/log размещаются системные журналы.

Устройства и драйверы

Презентация 2-09: устройства в UNIX

Как говорилось в прошлой лекции, процессор взаимодействует с внешними устройствами через шины. Любое устройство, подключенное к системной шине (или к шине PCI, или USB), обладает определённым интерфейсом (заранее известными идентификаторами, номерами портов ввода и вывода и т. п.), через который производится обмен данными и сообщениями с устройством. Таким образом, в первую очередь операционная система должна иметь модули, осуществляющее управление шинами, прерываниями, DMA и т. п. Эти модули обычно загружаются при старте системы.

Сами внешние устройства по типу доступа к ним могут быть классифицированы несолькими способами:

  • символьные — чтение и запись данных производится побайтно (например, COM-порт);
  • блочные — чтение и запись данных производится блоками (например, секторами в жётском диске);

  • последовательного доступа — читать и записывать данные можно только последовательно (например, коммуникационные каналы);
  • произвольного доступа — возможно обращение к данным по индексу (диски);

  • синхронные — передают данные только по команде (например, принтер);
  • асинхронные — могут передавать данные без предварительного указания (например, сетевая карта).

Для работы с каждым из обозначенных видов устройств нужна сответствующая подпрограмма в ядре — только она знает, каким образом пользовательские данные конвертируются в сигналы шины и наоборот. Такая подпрограмма ядра (оформляемая обычно в виде модуля) называется драйвером. В UNIX можно выделить несколько групп устройств (и соответствующих драйверов), основные из них: блочные устройства (блочные, произвольного доступа), символьные устройства (символьные, последовательного доступа), сетевые устройства (блочные, последовательного доступа, асинхронные). Интересная особенность блочных состоит утройств в том, что при обращении к ним может использоваться буфер, в котором кэшируются данные последних запросов. Сетевые устройства представлены в системе в виде сетевых интерфейсов, которые будут рассмотрены в разделе «Сетевой интерфейс в UNIX».

В операционной системе UNIX большинство внешних устройств доступно пользовательским программам в виде специальных файлов. Эти файлы могут быть, соответственно, двух типов — символьные и блочные. Традиционно, все файлы устройств располагаются в каталоге /dev и имеют имена, соответствующие назначению устройства. Например, в операционной системе Linux устройства терминала обозначаются как /dev/tty0, /dev/tty2 и т. д. с увеличением порядкового номера, жёсткий диск — /dev/hda, а порт PS/2 — /dev/psaux. Названия однотипных устройств обычно отличаются целым числом. Программы могут открывать, читать и записывать данные в файлы устройств как в обычные файлы, при этом операционная система транслирует пользовательские запросы драйверу соответствующего устройства.

Рисунок 1.27. Взаимодействие с устройством через файл

Взаимодействие с устройством через файл


Таким образом, файл устройства является одним из интерфейсов взаимодействия процессов с устройствами. Каждый файл устройства имеет два номера — старший и младший. По этим номерам операционная система определяет, какой драйвер должен использоваться при обращении к этому файлу.

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

Помимо файлов, соответствующих внешним устройствам, в UNIX есть несколько стандартных файлов виртуальных устройств. Эти файлы могут передавать и принимать от пользовательских процессов специальные данные, например, из символьного устройства /dev/zero можно прочитать только нули, сколько бы процесс не читал данные из этого файла. Вот список наиболее распространённых виртуальных устройств:

/dev/console

устройство соответствует активной в данный момент термнальной линии (виртуальной консоли);

/dev/null

«чёрная дыра» — любая информация, записанная в этот файл, пропадает безвозвратно, обычно используется для поглощения ненужного вывода программ;

/dev/random и /dev/urandom

устройства, генерирующие соответственно случайные и псевдослучайные данные;

/dev/stdin, /dev/stdout и /dev/stderr

устройства, соответствующие трём стандартным потокам ввода-вывода для каждого из процессов системы;

/dev/zero

устройство генерирует нули — из этого устройства можно прочитать сколько угодно нулевых байт.

Резюме

Презентация 2-10: резюме

Во второй лекции была рассмотрена архитектура операционной системы UNIX.

Основными принципами операционной системы UNIX являются многозадачность и стандартизация. Пользователю приходиться работать с двумя основными объектами операционной системы: файлами и процессами.

Операционную систему UNIX можно представить в виде трёх уровней: монолитное ядро, системные утилиты и демоны, пользовательские программы. Первые два работают на уровне привилегий системы, третий — на уровне пользователя.

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

Для объединения файловых систем нескольких устройств используются виртуальная файловая система и механизм монтирования. Стандарт на файловую систему описывает основные каталоги иерархической файловой системы UNIX.

Работа с внешними устройствами в UNIX производится через специальные модули ядра — драйверы устройств. Пользовательские программы обращаются к большинству устройств через специальные файлы, расположенные в файловой ситсеме.

Ключевые термины: файл, процесс, двухуровневая модель системы, демон, файловая система, каталог, корневой каталог, имя файла, индексный узел, жёсткая ссылка, суперблок, файл устройства, именованый канал, символьная ссылка, сокет, виртуальная файловая система, монтирование, иерархия файловой системы, драйвер

Дополнительные материалы

  1. Бах Дж. М. Архитектура операционной системы UNIX. — http://www.opennet.ru/docs/RUS/unix/
  2. Курячий Г. В. Операционная система UNIX. — М.: Интуит.Ру, 2004. — 292 с.: ил.
  3. Робачевский А. М. Операционная система UNIX. — СПб.: БХВ-Петербург, 2002. — 528 с.: ил.
  4. Стандарт на файловую систему. — http://www.pathname.com/fhs/
  5. Максвелл С. Ядро Linux в комментариях. — К.: Издательство «Диа-Софт», 2000. — 488 с.: ил.

Вопросы

Презентация

Рисунок 1.28. Презентация 2-01: основные концепции UNIX

Презентация 2-01: основные концепции UNIX


Рисунок 1.29. Презентация 2-02: беглый взгляд на архитектуру UNIX

Презентация 2-02: беглый взгляд на архитектуру UNIX


Рисунок 1.30. Презентация 2-03: ядро UNIX

Презентация 2-03: ядро UNIX


Рисунок 1.31. Презентация 2-04: файловая система UNIX

Презентация 2-04: файловая система UNIX


Рисунок 1.32. Презентация 2-05: индексный узел

Презентация 2-05: индексный узел


Рисунок 1.33. Презентация 2-06: виртуальная файловая система

Презентация 2-06: виртуальная файловая система


Рисунок 1.34. Презентация 2-07: монтирование файловых систем

Презентация 2-07: монтирование файловых систем


Рисунок 1.35. Презентация 2-08: стандарт на файловую систему

Презентация 2-08: стандарт на файловую систему


Рисунок 1.36. Презентация 2-09: устройства в UNIX

Презентация 2-09: устройства в UNIX


Рисунок 1.37. Презентация 2-10: резюме

Презентация 2-10: резюме