6 что такое иерархическая файловая система. Типы имен файлов. Типы файлов. Иерархическая структура файловой системы

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

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

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

Файловая система – это система управления данными.

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

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

Файловая система (назначение):

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

Файловая структура

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

Используется древовидная структура каталогов – дерево каталогов . Заимствована у Unix. Иерархическая структура – структура системы, части (компоненты) которой связаны отношениями включения или подчинения.

Иерархическая структура изображается ориентированным деревом, в котором вершины соответствуют компонентам, а дуги – связям.

дерево каталогов диска G

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

Деревья используются при описании и проектировании иерархических структур.

Корень – начальная позиция, листья – заключительная позиция.

Разделы

Любой жесткий или магнитооптический диск в процессе форматирования можно разделить на несколько частей и работать с ними как с отдельными (самостоятельными) дисками. Эти части называются разделами или логическими дисками . Разбиение диска на несколько логических дисков может быть необходимо из-за того, что ОС не могут работать с дисками, размер которых превышает определенную величину. Очень удобно хранить данные и пользовательские программы отдельно от системных программ (ОС), ведь ОС может «слететь с компьютера».

Раздел – область диска. Под логическим диском(разделом) в компьютере понимается любой носитель информации, с которым операционная система работает как с единым целым объектом.

Имя диска – обозначение логического диска; запись в корневом каталоге.

Логические диски (разделы) обозначаются латинскими буквами A, B, C, D, E, … (32 буквы от A до Z).

Буквы A, B зарезервированы для обозначения дискет.

С – жесткий диск, обычно с которого производится загрузка ОС.

Остальные буквы – логические диски, компакт-диски и т.д. Максимальное количество логических дисков для ОС Windows – бесконечное.

В таблице разделов указывается расположение начала и конца этого раздела и число секторов в этом разделе (место и размер).

Файловая структура логического диска

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

Элементы файловой структуры:

    стартовый сектор (начальной загрузки, Boot-сектор);

    таблица размещения файлов (FAT – File Allocation Table);

    корневой каталог (Root Directory);

    область данных (оставшееся свободным дисковое пространство).

Boot -сектор

Boot -сектор – первый (начальный) сектор диска. Находится на 0- стороне, 0-дорожке.

Boot-сектор содержит служебную информацию:

    размер кластера диска (кластер – блок, объединяющий в группу несколько секторов для сокращения размера FAT-таблицы);

    местоположение FAT-таблицы (в вoot-секторе находится указатель на то, где расположена FAT-таблица);

    размер FAT-таблицы;

    количество FAT-таблиц (всегда есть как минимум 2 копии таблицы для обеспечения надежности и безопасности, т.к. разрушение FAT ведет к потере информации и трудно восстанавливается);

    адрес начала корневой директории и ее максимальный размер.

В вoot-секторе находится блок начальной загрузки (загрузчик) – загрузочная запись Boot Record.

Загрузчик – обслуживающая программа, которая помещает выполняемую программу в оперативную память и приводит ее в состояние готовности к исполнению.

FAT (таблица размещения файлов)

FAT (File Allocation Table) – таблица размещения файлов. В ней определено, какие участки диска относятся к каждому файлу.Область данных диска представлена в ОС как последовательность пронумерованных кластеров.

FAT – это массив элементов, адресующих кластеры области данных диска. Каждому кластеру области данных соответствует один элемент FAT. Элементы FAT служат в качестве цепочки ссылок на кластеры файла в области данных.

Структура таблицы размещения файлов:

FAT состоит из элементов длиной 16 /32/64 бита. Всего в таблице может быть до 65520 таких элементов, каждый из них (кроме первых двух) соответствует кластеру диска. Кластер является той единицей, в которой распределяется пространство в области данных на диске для файлов и каталогов. Первые два элемента таблицы (с номерами 0 и 1) зарезервированы, а каждый из остальных элементов таблицы описывает состояние кластера диска с тем же номером. Элемент может указывать, что кластер свободен, что кластер дефектный, что кластер принадлежит файлу и является последним кластером в файле. Если кластер принадлежит файлу и не является его последним кластером, то элемент таблицы содержит номер следующего кластера в этом файле.

FAT – крайне важный элемент файловой структуры. Нарушения в FAT могут привести к полной или частичной потери информации на всем логическом диске. Именно поэтому, на диске хранится две копии FAT. Существуют специальные программы, которые контролируют состояние FAT и исправляют нарушения.

Для разных ОС необходимы разные версии FAT

Windows 95 FAT 16, FAT 32

Windows NT (XP) NTFS

Novell Netware TurboFAT

UNIX NFS,ReiserFS

Логическая структура носителя информации

Типы файлов. Иерархическая структура файловой системы

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

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

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

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

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

Рис. 6. 1. Иерархия файловых систем

Граф, описывающий иерархию каталогов, может быть деревом или сетью. Каталоги образуют дерево, если файлу разрешено входить только в один каталог (рис. 6. 1, б), и сеть - если файл может входить сразу в несколько каталогов (рис. 6. 1, в). Например, в MS-DOS и Windows каталоги образуют древовидную структуру, а в UNIX - сетевую. В древовидной структуре каждый файл является листом. Каталог самого верхнего уровня называется корневым каталогом или корнем (root).

Частным случаем иерархической структуры является одноуровневая организация, когда все файлы входят в один каталог (рис. 6. 1, а).

Основной функцией любой файловой системы является распределение дискового пространства на именованные участки - файлы. Файловая система extX организована чрезвычайно просто, ее файлы представляют собой просто последовательности байтов. К ним обращаются как к текстовым или двоичным данным, но различаются они лишь содержимым, а не структурой и методом доступа. Эта система универсальна тем, что в ней не делается никаких предположений о внутренней структуре данных файла, и доступ к любому внешнему устройству, а также к другому процессу осуществляется как к обычному файлу. Временные характеристики файловой системы во многом определяются быстродействием накопителей на жестком диске, а использование методов кэширования, в сочетании с опережающим чтением незатребованных блоков файлов, и использование отложенной записи, позволяют обрабатывать файлы достаточно эффективно. Иерархия файловой системы строится в виде дерева (рис. 1 ), в ней сняты все ограничения на длину имени файла и постфикса. Доступ к обычным дисковым файлам, каталогам, специальным файлам - идентичен.

Рис. 1 . Иерархия файловой системы extX построенная в виде дерева.

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

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

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

Например, для выборки файла «client .c » (рис. 1 ) , находящегося в каталоге «с», который находится в каталоге «tcp », который, в свою очередь, находится в каталоге «usr » и соответственно в каталоге «root » (рис. 1), служит следующая символьная строка: /usr /tcp /c /client .c . Если символьная строка начинается со знака (/), то поиск начинается с корневого каталога всей файловой системы. Имя маршрута, которое не начинается со знака (/), заставляет ОС начать поиск с текущего каталога.

Система всегда связывает каждого пользователя с определенным каталогом. Когда вы логически включаетесь в систему по команде login , вы автоматически оказываетесь в каталоге (директории) с именем home . Этот каталог назначается администратором системы при регистрации вас как пользователя. Если ваше username , к примеру, inter , то после команды login inter и введения пароля в ответ на запрос password , вы войдете в систему и автоматически перейдете в каталог /home /inter . Разумеется, после этого вы можете по команде cd (Change Directory ) сменить ваш текущий каталог на какой угодно.

В системе ввода/вывода все внешние устройства рассматриваются как файлы , над которыми допускается производить обычные файловые операции. Конечно, существуют и драйверы устройств, но интерфейс с ними оформлен для пользователя как обращение к специальному файлу. Специальные файлы являются средством унификации системы ввода/вывода.

Каждому подключенному устройству (терминалу, дискам, принтеру, и т. д.), соответствует как минимум один специальный файл . Большая часть этих специальных файлов хранится в каталоге /dev (рис. 1) :

$ cd /dev

$ ls -l

console пульт управления системы

dsk порции на диске

fd 0 флоппи-диск 1

mem память

l р принтер

l р0 параллельный порт 0

root порция на диске для корневой файловой системы

swap своп-порция

syscon альтернативное имя пульта

systty еще одно имя для системной консоли

term директория для терминалов

ttyS 0 серийный порт 0 (COM 1)

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

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

Типы файлов. Иерархическая структура файловой системы

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

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

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

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

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

Рис. 6. 1. Иерархия файловых систем

Граф, описывающий иерархию каталогов, может быть деревом или сетью. Каталоги образуют дерево, если файлу разрешено входить только в один каталог (рис. 6. 1, б), и сеть - если файл может входить сразу в несколько каталогов (рис. 6. 1, в). Например, в MS-DOS и Windows каталоги образуют древовидную структуру, а в UNIX - сетевую. В древовидной структуре каждый файл является листом. Каталог самого верхнего уровня называется корневым каталогом или корнем (root).


^ Иерархическая файловая система.

Все файлы файловой структуры строятся в дерево. Корнем дерева является так называемый корень файловой системы. Если узел дерева является листом, то это файл, который может содержать либо данные, либо являться каталогом. Узлы, отличные от листьев являются каталогами. Соответственно, именование в такой системе может происходить разными способами. Первый - именование фала относительно ближайшего каталога. Если мы посмотрим файлы, которые являются ближайшими для каталога F0 - это файл F1 (он тоже является каталогом) и файл F2. То есть если мы каким-то образом подразумеваем (системным образом), что работаем в каталоге F0, то можем обращаться к файлам в данном каталоге только по их именам (F1 и F2). Соответственно, на одном уровне имена должны быть уникальны (в пределах одного каталога). Так как мы имеем структуру дерева, то можно говорить о полном имени файла, которое составляет путь от корня дерева, до файла. Например, путь к файлу F3 будет выглядеть, как “/F0/F1/F3”. В одно и то же время мы можем работать как с полным, так и с коротким именем файла. А так как по свойству дерева путь к каждому листу однозначен, то мы сразу решаем проблему унификации имен.

Первой такая организация появилась в ОС Multics, которая разрабатывалась в университете Беркли в конце 60х годов. Это было давно, но такое хорошее и красивое решение с тех пор стало появляться во многих ОС.

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

Защита данных в ОС

^ Идентификация - возможность ОС распознать определенного пользователя и выполнять в зависимости от определения нужные действия по защите данных и т.п. Например, MS DOS - однопользовательская ОС. Существуют системы, которые позволяют регистрировать пользователей, но эти пользователи никак между собой не связаны (примером могут являться некоторые ОС фирмы IBM для мейнфреймов), а значит их нельзя организовать в группы. Но было бы удобно выделить в отдельную группу - лабораторию, кафедру, учебную группу студентов и т.п.

В иерархической организации пользователей есть понятие группы. А в группе есть реальные пользователи.

При регистрации конкретного пользователя его следует отнести к какой-либо группе.

Раз пользователи разделены на группе, то по аналогии с разделением между конкретными пользователями, можно разделять ресурсы с группой (то есть пользователь может сделать свои файлы доступными для всех членов какой-то группы.

И такое деление на группы может быть также многоуровневым с соответствующим распределением прав и возможностей.

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

Вот, наверное, и все, что следовало бы сказать о свойствах и функциях ОС. Естественно, мы рассмотрели далеко не все функции ОС. Что-то было специально упущено, так как мы рассматриваем ОС в упрощенной модели. Ибо наша цель - не изучение конкретной ОС, а научиться классифицировать ОС, с каких точек зрения следует на нее смотреть и сравнивать различные типы ОС.

Лекция 7

ОС Unix

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

В середине 60х годов в Bell лаборатории фирмы AT&T проводились исследования и разработка одной из первых ОС в современном ее понимании - ОС Multics. Это ОС разделения времени, многопользовательская, а также в этой системе были предложены фактически решения по организации файловых систем. В частности, была предложена иерархическая древообразная файловая система. Это, ориентировочно, 1965 год. От этой разработки через некоторое время получила начало ОС Unix. Одна из предысторий говорит, что на фирме был ненужный компьютер PDP8 с очень малоразвитым программным обеспечением. А требовалась машина, которая бы позволяла организовывать удобную работу пользователя, в частности, удобный ввод информации. И известная группа людей - Томпсон и Ритчи занялись разработкой на этой машине новой ОС. Другой вариант был таков, что они занимались реализацией новой игры, а те средства, которые имелись были недоступны или неудобны, и они решили поиграться с этой машиной. Результатом стало появление ОС Unix. Особенностью этой системой являлось то, что она являлась первой системной программой написанной на языке, отличном от языка ассемблера. Дляцели написания этого системного программного обеспечения, в частности, ОС Unix, также параллельно проводились работы, которые начинались от языка BCPL, из него был образован язык B, который оперировал с машинными словами, далее абстракция машинных слов - BN и, наконец, язык “C”. И после 1973 года ОС Unix была переписана окончательно на язык “С”. В результате появилась ОС, 90% кода которой было написано на языке высокого уровня, языке, не зависящем от архитектуры машины и системы команд, а 10% было написанона ассемблере, в эти 10% входят наиболее критичные к реализации по времени части ядра ОС.

Многих программистов в то время это немного шокировало, мало кто верил, что такая ОС способна жить, поскольку всегда язык высокого уровня ассоциировался с большой неэффективностью. Но язык “С” тем не менее был сконструирован таким образом, что позволял писать эффективные программы и транслировать их в также достаточно эффективный машинный код.

Из таких конструктивных свойств следует отметить то, что “С” сильно построен на работе с указателями. Когда мы пишем программу на ассемблере, то очень часто для достижения требуемого результата нам нужно манипулировать с адресами. Возможность оперировать указателями - первое свойство “С”, которое позволяет эффективно транслировать программу на этом языке в машинный код.

Если мы посмотрим на нормальную программу на ассемблере, то заметим следующее - при программировании каких-то блоков мы часто используем побочный эффект (например, во время вычисления выражения мы можем получать и куда-то откладывать промежуточные результаты), также можно поступать и в языке “С”. Таким образом, понятие выражения в “С” было гораздо шире, чем в других языках того времени. И в выражениях, кроме новых операций, таких как работа с указателем, смещения сдвиги и т.п., появилась принципиально новая операция - операция присваивания. Почему она новая? Потому что во многих языках до “С”, а также и после него не было операции присваивания - был оператор присваивания. Разница в одном - если мы имеем оператор присваивания, во-первых, требуется, чтобы в правой части такой операции уже не было (мы не можем использовать побочный эффект), и второе - левая часть оператора присваивания - это некоторая ссылка на единичную область памяти. Внесение оператора присваивания внутрь выражения позволило решать проблему побочных эффектов (значения подвыражений, которые могут быть использованы во вне - а они в свою очередь сокращают число обменов с ОЗУ), а это средство эффективности.

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

И свойствам таких языков относится следующее:


    1. Жесткий контроль типов. То есть если мы попробуем умножить целочисленную переменную на плавающую, то язык выдаст ошибку. Все преобразования типов по умолчанию недопустимы.

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

    3. Контроль за взаимодействием модулей. Суть этого свойства в том, что много ошибок появляется в том случае, что если функция продекларировала один набор параметров, а обращение к ней идет с другим набором, причем различие может быть как в количестве, так и в типах. Язык “С”, несмотря даже на версию ANSI C, которая пыталась отчасти решить эту проблему - всегда остается возможность обмануть функцию и передать ей параметр другого типа, вместо шести параметров можно передать один параметр.
Вот по этим трем позициям язык “С” является нехорошим языком. Но тем не менее это “менталитет” программистов, который заключается в том, что почему-то наиболее живучими языками являются концептуально плохие языки, к таким языкам помимо “С” можно добавить еще Фортран.

Итак, 1973 год. Появление ОС Unix, причем она уже была написана на языке “С”. Какими основными свойствами уже тогда обладала эта ОС. Первое свойство - концепция файлов, основным объектом, которым оперирует ОС - это файл. Файл - это набор данных, файл с точки зрения Unix - это внешнее устройство, файл - это каталог, который содержит информацию о принадлежащих ему файлах и т.д. На сегодняшний день стратегия файлов распространена в Unix’е практически на все. Второе свойство, которое является продолжением или следствием первого, это то, что ОС построена очень интересно. В отличии от предыдущих ОС, где каждая команда была зашита внутрь, и эту команду нельзя было модифицировать, убрать из системы, создать новую команду - вUnix’е проблемы команд пользователя решены очень элегантно за счет двух моментов. Первый - Unix декларирует стандартный интерфейс передачи параметров извне внутрь процесса. Второй - все команды реализованы в виде файлов, это означает, что можно свободно добавлять новые команды в систему, которые будут доступны либо мне, либо группе пользователей, либо всем, а можно удалять команды.

Давайте начнем рассмотрение конкретных свойств ОС Unix. Первое, что мы будем рассматривать, это файловая система, организация работы с файлами.

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

Файловая система Unix, это иерархическая, многопользовательская файловая система. Ее можно представить в виде дерева:

В корне дерева находится “корневой каталог”, узлами, отличными от листьев дерева являются каталоги. Листьями могут являться: файлы (в традиционном понимании - именованные наборы данных), пустые каталоги (каталоги, с которыми не ассоциировано ни одного файла). В системе определено понятие имени файла - это имя, которое ассоциировано с набором данных в рамках каталога, которому принадлежит этот файл. Например, каталогу D1 принадлежат файлы: N1, N2, N3; каталогу D0 принадлежат: N4, N5 и D1, последний тоже является файлом, но специальный. Итак, имя - это имя, которое ассоциировано снабором данных в контексте принадлежности каталогу. Кроме того, есть понятие полного имени. Полное имя - это уникальный путь от корня файловой системы до конкретного файла. Первый символ имени - это корневой каталог “/”, а далее через наклонную черту перечислены все каталоги, пока не дойдет до нужного файла. Например, файл N3 имеет полное имя “/D0/D1/N3”. За счет того, что такой путь для каждого файла в любом каталоге уникален, то мы можем именовать одинаковыми именами файлы в различных каталогах. Например, имя N4 присутствует в каталогах D0 и D4, но это разные файлы, так как полные пути к ним различны (/D4/N4, /D0/N4).

Замечание. На самом деле файловая система Unix не является древообразной. Все то, что говорилось выше - правильно, но в системе имеется возможность нарушения красивой и удобной иерархии в виде дерева, так как имеется возможность ассоциировать несколько имен с одним и тем же содержимым файла. И могут возникать такие ситуации, когда, например, “/D4/N3” и “/D0/D1/N1” являются, по сути дела, одним файлом с двумя именами.

Еще одно замечание. В ОС Unix используется трехуровневая иерархия пользователей:

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

1) Владелец файла. Этот атрибут связан с одним конкретным пользователем, который автоматически назначается системой владельцем файла. Владельцем можно стать по умолчанию, создав файл, а также есть команда, которая позволяет менять владельца файла.

2) Защита доступа к файлу. Доступ к каждому файлу (от файла ядра системы до обыкновенного текстового файла) лимитируется по трем категориям:

Права владельца (что может делать владелец с этим файлом, в общем случае - не обязательно все, что угодно);

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

Все остальные пользователи системы;

По этим трем категориям регламентируются три действия: чтение из файла, запись в файл и исполнение файла (в мнемонике системы R,W,X, соответственно). В каждом файле по этим трем категориям определено - какой пользователь может читать, какой писать, а кто может запускать его в качестве процесса.

Это некоторые предварительные данные по файловой системе. Теперь давайте рассмотрим структуру файловой системы на диске.

Сначала определим некоторые понятия:

Для любой вычислительной системы определено понятие системного внешнего запоминающего устройства (ВЗУ). Это устройство, к которому осуществляет доступ аппаратный загрузчик системы с целью запуска ОС . Суть заключается в следующем - практически любая вычислительная система имеет диапазон адресного пространства оперативной памяти, размещенной в ПЗУ. В ПЗУ размещается небольшая программа (хотя понятие размера относительно, но она действительно небольшая), которая при включении вычислительной машины обращается к фиксированному блоку ВЗУ, считывает его в память и передает управление на фиксированный адрес, относящийся к считанному блоку данных.

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

В любой системе принято разбиение пространства ВЗУ на некоторые области данных, которые называются блоками. Размер блока (логического блока в ОС) является фиксированным атрибутом. В ОС Unix в различных ее вариациях размер блока был параметром меняющимся в зависимости от варианта ОС. Для простоты и единообразия мы будем считать, что логический блок ВЗУ равен 512 байт.

Итак, рассмотрим структуру файловой системы. Представим адресное пространство системного ВЗУ в виде последовательности блоков.

Будем считать, что этих блоков N+M-1.

Первый блок - это блок начальной загрузки. Размещение этого блока в нулевом блоке системного устройства определяется аппаратурой, так как аппаратной загрузчик всегда обращается к конкретному блоку системного устройства (к нулевому блоку). Это последний компонент файловой системы, который зависит от аппаратуры.

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


    • количестве индексных дескрипторов (ИД) в файловой системе;

    • размере файловой системы;

    • свободных блоках файлов;

    • свободных ИД;

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


    • код привилегии/защиты;


    • длина файла;


Далее идут блоки файлов. Это пространство ВЗУ, в котором размещается вся информация, находящаяся в файлах и о файлах, которая не поместилась в уже перечисленных блоках.

Последняя область данных (она в разных системах размещается по-разному), но для простоты изложения мы будем считать, что эта область находится сразу за блоками файлов - это область сохранения.

Это концептуальная схема структуры файловой системы. Теперь давайте вернемся и рассмотрим некоторые ее части более детально.

Прежде всего интерес вызывают области свободных блоков файлов и свободных ИД. В Unix видно влияние двух факторов: первый - это то, что файловая система разрабатывалась тогда, когда ВЗУ объемом 5-10Мб считалось очень большим и в реализации алгоритмов по работе с системой видны старания автором по оптимизации этого процесса; и второй - это свойства файловой системы по оптимизации доступа, критерием которого является количество обменов, которые файловая система производит для своих нужд, не связанных с чтением или записью информации файлов.

Суперблок содержит список свободных блоков файлов, он состоит из 50 элементов. Суть работы с этим списком заключается в следующем - в буфере, состоящем из 50 элементов (при условии того, что блок - 512 байт, 1 блок - 16 битное слово), в них записаны номера свободных блоков пространства блоков файлов с 2 до 49. В 0 элементе содержится указатель на продолжение массива, а в последнем элементе содержится указатель на свободный элемент в массиве.

Если какому-то процессу для расширения файла требуется свободный блок, то система по указателю N/B (номер блока) выбирает элемент массива, и этот блок предоставляется файлу. Если происходит сокращение файла, то высвободившиеся номера добавляются в массив свободных блоков и корректируется указатель N/B.

Так как размер массива - 50 элементов, то возможны две критические ситуации:


    1. Когда мы освобождаем блоки файлов, а они не могут поместиться в этом массиве. В этом случае из файловой системы выбирается один свободный блок и заполненный полностью массив свободных блоков копируется в этот блок, после этого значение указателя N/B обнуляется, а в нулевой элемент массива, который находится в суперблоке, записывается номер блока, который мы выбрали для копирования содержимого массива. Таким образом, если мы постоянно освобождаем блоки, то образуется список, в котором будут размещены все свободные блоки файловой системы.

    2. Когда мы выбрали все свободные блоки и содержимое элементов массива свободных блоков исчерпалось. Если нулевой элемент массива равен нулю, то это означает, что исчерпано все пространство файловой системы. Если этот элемент нулю не равен, то это означает, что существует продолжение массива. Это продолжение считывается в копию суперблока в оперативной памяти.
Для получения свободного блока и его освобождения в большинстве случаев не требуется дополнительного обмена. Дополнительный обмен требуется тогда, когда исчерпается содержимое 49 блоков. У нас получается хорошая буферизация, которая сокращает накладные расходы ОС.

Список свободных ИД. Это буфер, состоящий из 100 элементов. В нем находится информация о 100 номерах ИД, которые свободны в данный момент. Соответственно, когда нужен новый ИД, то его номер берется из списка свободных ИД, если номер освобождается, то заносится в этот массив. Если же массив переполнен, а освобождается 101 элемент, то это никуда не записывается. Если список ИД переполняется, то система “пробегает” по списку и формирует содержимое этого буфера заново.

В ситуации, когда нужно создать файл и нужен новый ИД, а в массиве нет ни одного элемента - запускается процесс поиска нового ИД, и он ничего не находит. Тогда возможны две ситуации:


    1. Больше нет свободных блоков для файлов;

    2. Нет больше новых ИД.
Вот информация о суперблоке. Какие можно сделать выводы и замечания?

    • суперблок всегда находится в ОЗУ;

    • все операции по освобождению блоков, занятию блоков файлов, по занятию и освобождению ИД происходят в ОЗУ (минимизация обменов с диском). Если же содержимое суперблока не записать на диск и выключить питание, то возникнут проблемы (несоответствие реального состояния файловой системы и содержимого суперблока). Но это уже требование к надежности аппаратуры системы.

Лекция 8

Индексные Дескрипторы

Рассмотрим подробнее Индексные Дескрипторы. ^ ИД - это объект Unix, который ставится во взаимнооднозначное соответствие с содержимым файла. То есть для каждого ИД существует только одно содержимое и наоборот, за исключением лишь той ситуации, когда файл ассоциирован с каким-либо внешним устройством. Напомним содержимое ИД:


    • поле, определяющее тип файла (каталоги и все остальные файлы);

    • код привилегии/защиты;

    • количество ссылок к данному ИД из всевозможных каталогов файловой системы;

    • (нулевое значение означает свободу ИД)

    • длина файла в байтах;

    • даты и времена (время последней записи, дата создания и т.д.);

    • поле адресации блоков файла.
Как видно - в ИД нет имени файла. Давайте посмотрим, как организована адресация блоков, в которых размещается файл.

В поле адресации находятся номера первых десяти блоков файла, то есть если файл небольшой, то вся информация о размещении данных файла находится непосредственно в ИД. Если файл превышает десять блоков, то начинает работать некая списочная структура, а именно, 11й элемент поля адресации содержит номер блока из пространства блоков файлов, в которых размещены 128 ссылок на блоки данного файла. В том случае, если файл еще больше - то используется 12й элемент поля адресации. Сутьего в следующем - он содержит номер блока, в котором содержится 128 записей о номерах блоках, где каждый блок содержит 128 номеров блоков файловой системы. А если файл еще больше, то используется 13 элемент - где глубина вложенности списка увеличена еще на единицу.

Таким образом мы можем получить файл размером (10+128+128 2 +128 3)*512.

Если мы зададим вопрос - зачем все это надо (таблицы свободных блоков, ИД и т.д.), то вспомним, что мы рассматриваем взаимосвязь между аппаратными и программными средствами вычислительной системы, а в данном случае подобное устройство файловой системы позволяет сильно сократить количество реальных обменов с ВЗУ, причем эшелонированная буферизация в ОС Unix делает число этих обменов еще меньше.

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

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

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

Элементы файловой системы:

Каталоги

Мы говорили, что вся информация в Unix размещается в файлах. Нету каких-то специальных таблиц, которые размещены вне файловой системы и используются системой, за исключением тех таблиц, которые создает ОС во время работы в пространстве оперативной памяти.

^ Каталог с точки зрения ОС - это файл, обычный файл, в котором размещены данные о всех файлах, которые принадлежат каталогу.

Мы говорим, что в каталоге “А” содержатся файлы: “B”, “C” и “D” - из которых “В” и “С” могут быть как файлами, так и каталогами, а “D” - заведомо каталог.

Каталог имеет следующую структуру. Он состоит из элементов, объединяющих в себе два поля - номер ИД и имя файла:

Каталог = { {ИД, Имя}, {ИД,Имя}, ..., {ИД, Имя}}

Что есть номер ИД? - это порядковый номер элемента в списке индексных дескрипторов. Так, первый элемент этого списка - ИД#1 принадлежит корневому каталогу “.”.

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

{ИД_самого_каталога, “.”} и {ИД_родительского_каталога, “..”}

Так на картинке файл “А” имеет ИД#7, “D” - ИД#5, “F” - ИД#10, “G” - ИД#101. В этом случае файл-каталог D будет иметь следующее содержимое:

{{ 5, “.” },

(Для корневого каталога родитель ссылается на него же самого.)

Чем отличается файл-каталог от обычного файла? Он отличается полем типа в индексном дескрипторе.

Давайте посмотрим, как схематично могут использоваться полные имена и ссылки на каталоги. В системе в каждый момент времени определен для пользователя текущий каталог. То есть каталог, полное имя которого подставляется ко всем файлам, имя которых не начинается с символа “/”. Если текущий каталог “D”, то можно говорить просто о файле “F” или файле “G”, если же текущий каталог “D”, а требуется добраться до файла “B”, то оперировать просто с именем“B” нельзя, так как он не принадлежит каталогу “D”, файл “B” можно достать, указав его полное имя от корня, либо использовать специальный файл “..”, в этом случае файл “B” будет иметь имя: “../B”. Если при открытии мы ссылаемся на “..”

Для того, чтобы в этом случае открыть файл “B”, придется выполнить ряд косвенных операций - взять ИД родитель, и по нему выбирается содержимое файла-каталога “А”, в “А” мы выбираем строку с именем “B” и определяем его ИД. Эта процедура достаточно трудоемка, но так как открытие и закрытие файлов происходит достаточно редко, то “криминала” в этом никакого нету.

За счет такой организации каталогов у нас содержимое файла разорвано с его именем. Имя может быть определено неоднозначно.

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

Файлы устройств

Эта разновидность файлов характеризуется типом и их интерпретация происходит следующим образом. В принципе, содержимого у файлов устройств нету, то есть это лишь ИД и имя, которое с ним ассоциировано. В ИД указывается информация о том, какой тип устройства ассоциирован с этим файлом, соответственно, система Unix все устройства подразделяет на два типа: байт- и блок-ориентированные. Байт-ориентированные устройства - это те устройства, обмен с которыми происходит по байтам (например, клавиатура), блок-ориентированные - это такие устройства, обмен с которыми происходит блоками. В ИД имеется поле, указывающее эту характеристику, там же имеется поле, определяющее номер драйвера, связанного с этим устройством. В системе каждый драйвер связан с конкретным одним устройством, но у устройства может быть несколько драйверов. Это поле, определяющее номер драйвера, на самом деле есть номер в таблице драйверов соответствующего класса устройств (имеются две таблицы - для блок- и байт- устройств). Также в ИД существует некоторый цифровой параметр, который может быть передан драйверу в качестве параметра, уточняющего информацию о работе.

Это то, что можно сказать о специальных файлах, связанных с внешними устройствами.

Обмен данными с файлами

Следующее из системной организации файловой системы - это организация обменом данными с файлом. Определим понятия, связанные с низкоуровневым вводом/выводом. В Unix определены специальные функции, которые называются системными вызовами. Эти вызовы осуществляют непосредственное обращение к ОС, они выполняют некоторые системные функции. По употреблению они практически не отличаются от использования библиотечных функций, тогда как по реализации и действии их отличие достаточно существенное. Библиотечная функция будет загружена в тело процесса, а системный вызов сразу передает управление ОС, и последняя выполняет заказанное действие. В Unix для обеспечения низкоуровневого (путем системных вызовов) ввода-вывода имеется набор этих функций:

open(...) - для работы с содержимым файла процесс должен зарегистрировать в системе этот факт, параметрами этой функции являются строка, содержащая имя файла и атрибуты на режим работы с файлом (только чтение, чтение-запись и т.п.), а возвращает эта функция некоторое число, которое называется файловым дескриптором (ФД). В теле процесса пользователя, а также данных, ассоциированных с этим процессом, размещается некая служебная информация. В частности, размещается таблица файловых дескрипторов. Она, как и все таблицы в Unix - позиционна, то есть номер строки в таблице соответствует ФД с этим номером. С ФД ассоциировано имя файла и прочие атрибуты. Нумерация ФД - прерогатива процесса, то есть ФД уникальны в пределах одного процесса.

Количество одновременно открытых файлов (точнее, максимальное количество ФД, ассоциированных с файлами) для процесса регламентируется системой.

Итак, функция open(...) - открытие существующего файла.

creat(...) - это функция открытия нового файла, ее параметрами служат: имя файла и некоторые параметры открытия, также как и у open.

read(...)/write(...) - их параметрами являются номер ФД и некоторые параметры доступа. Эти функции служат для чтение/записи из или в файл.

close(...) - завершение работы с файлом. После выполнения этой функции ФД этого файла освобождается.

Все это системные вызовы. Также в Unix можно осуществлять ввод-вывод через библиотечные функции (например, fopen, fread, fwrite, fclose, ...).

Рассмотрим организацию обмена с системной точки зрения в Unix.

При организации обмена система подразделяет все данные на две категории - первая, это данные, ассоциированные с процессом пользователя, и данные, ассоциированные с ОС.

Первая таблица данных, связанных с ОС - это таблица индексных дескрипторов открытых файлов (ТИДОФ), эта таблица содержит записи, каждая из которых содержит копию ИД для каждого открытого в системе файла. Через копию ИД мы осуществляем доступ к блокам файла. Каждая из этих записей содержитполе, характеризующее количество открытых файлов в системе, использующих данные ИД. То есть, если мы открываем один и тот же файлов от имени двух процессов, то запись в ТИДОФ создается одна, но каждое открытие этого ИД увеличивает счетчик на единицу.

Следующее. Таблица файлов - эта таблица содержит информацию об имени открытого файла и имеет ссылку на ИД данного файла в ТИДОФ.

Подробнее эта схема будет рассмотрена на следующей