Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 84
Текст из файла (страница 84)
Длятого чтобы обеспечить большую гибкость при использовании таких программ, желательно было иметь возможность вводить в них данные непосредственно из файлов или с выхода других программ и выводить их данные в файл или на вход других программ.Реализация этого механизма основывается на следующих свойствах операционных систем семейства UNIX. Во-первых, любой ввод-вывод трактуется как вводиз некоторого файла и вывод в некоторый файл.
Клавиатура и экран терминалатоже интерпретируются как файлы (первый можно только читать, а во второй можно только писать). Во-вторых, доступ к любому файлу производится через его дескриптор (положительное целое число). Фиксируются три значения дескрипторов файлов. Файл с дескриптором 1 называется файлом стандартного ввода (stdin),файл с дескриптором 2 — файлом стандартного вывода (stdout), и файл с дескриптором 3 — файлом стандартного вывода диагностических сообщений (stderr).
В-третьих, программа, запущенная в некотором процессе, «наследует» от породившегопроцесса все дескрипторы открытых файлов.Не путать с потоком выполнения, или тредом (thread).Семейство операционных систем UNIX323В головном процессе интерпретатора командного языка файлом стандартного вводаявляется клавиатура терминала пользователя, а файлами стандартного вывода ивывода диагностических сообщений — экран терминала.
Однако при запуске любой команды можно сообщить интерпретатору (средствами соответствующего командного языка), какой файл или выход какой программы должен служить файлом стандартного ввода для запускаемой программы, а также какой файл или входкакой программы должен служить для запускаемой программы файлом стандартного вывода или файлом вывода диагностических сообщений. Тогда интерпретатор перед выполнением системного вызова exec открывает указанные файлы, подменяя смысл дескрипторов 1, 2 и 3.То же самое может проделать и любая другая программа, запускающая третьюпрограмму в специально созданном процессе.
Следовательно, все, что требуетсядля нормального функционирования механизма перенаправления ввода-вывода, — это придерживаться при программировании соглашения об использованиидескрипторов stdin, stdout и stderr. Это не очень трудно, поскольку в наиболеераспространенных функциях библиотеки ввода-вывода printf, scant и error вообще не требуется указывать дескриптор файла. Функция printf неявно используетдескриптор stdout, функция scant — дескриптор stdin, функция error — дескриптор stderr.Файловая системаФайл в системе UNIX представляет собой множество символов с произвольнымдоступом.
В файле могут содержаться любые данные, помещенные туда пользователем, и файл не имеет никакой иной структуры, кроме той, какую создаст в немпользователь.Структура файловой системыЗдесь мы вкратце рассмотрим одну из первых реализаций файловой системы, поскольку основные ее идеи сохраняются до сих пор.Информация на дисках размещается блоками. В первой версии файловой системы размер блока был равен 512 байт. Во многих современных файловых системах,разработанных для конкретной версии UNIX-клона, размер блока больше.
Этопозволяет повысить быстродействие файловых операций. Например, в системе FFS(Fast File System — быстродействующая файловая система) размер блока равен8192 байт.В рассматриваемой версии файловой системы раздел диска разбивается на следующие области (рис. 10.1):Q неиспользуемый блок;0управляющий блок, или суперблок, в котором хранится размер логическогоДиска и границы других областей;аьсписок, состоящий из описаний файлов, называемых /-узлами;Q область для хранения содержимого файлов.324Глава 10.
Краткий обзор современных операционных системНеиспользуемый блокСуперблокi-узел 1i-узел 2i-узел З>i-узел пБлок с данными файлаБлок с данными файлаБлок с данными файлаСвободный блокФайлСвободный блокРис. 1 0 . 1 . Организация файловой системы в ОС UNIXКаждый г'-узел содержит:Q идентификатор владельца;Q идентификатор группы владельца;Q биты защиты;Q физические адреса на диске или ленте, где находится содержимое файла;Q размер файла;••время создания файла;время последнего изменения (modification time) файла;Семейство операционных систем UNIX•время последнего изменения атрибутов (change time) файла;•число связей-ссылок, указывающих на файл;325О индикатор типа файла (каталог, обычный файл или специальный файл).Следом за z'-списком идут блоки, предназначенные для хранения содержимогофайлов.
Пространство на диске, оставшееся свободным от файлов, образует связанный список свободных блоков.Таким образом, файловая система UNIX представляет собой структуру данных,размещенную на диске и содержащую управляющий суперблок с описанием файловой системы в целом, массив г-узлов, в котором определены все файлы в файловой системе, сами файлы и, наконец, совокупность свободных блоков. Выделениепространства под данные осуществляется блоками фиксированного размера.Каждый файл однозначно идентифицируется старшим номером устройства, младшим номером устройства и i-номером (индексом г-узла данного файла в массивег'-узлов). Когда вызывается драйвер устройства, по старшему номеру индексируется массив входных точек в драйверы. По младшему номеру драйвер выбираетодно устройство из группы идентичных физических устройств.Файл-каталог, в котором перечислены имена файлов, позволяет установить соответствие между именами и самими файлами.
Каталоги образуют древовиднуюструктуру. На каждый обычный файл или файл устройства могут иметься ссылкив различных узлах этой структуры. В непривилегированных программах записьв каталог не разрешена, но при наличии соответствующих разрешений они могутчитать их. Дополнительных связей между каталогами нет.Большое число системных каталогов UNIX использует для собственных нужд.Один из них, корневой каталог, является базой для всей структуры каталогов, и,«отталкиваясь» от него, можно найти все файлы. В других системных каталогахсодержатся программы и команды, предоставляемые пользователям, а также файлы устройств.Имена файлов задаются последовательностью имен каталогов, разделенных косой чертой (/) и приводящих к концевому узлу (листу) некоторого дерева. Еслиимя файла начинается с косой черты, то поиск по дереву начинается в корневомкаталоге.
Если же имя файла не имеет в начале косой черты, то поиск начинается стекущего каталога. Имена файлов, начинающиеся с символов ../ (две точки и косая черта), подразумевают начало поиска в каталоге, родительском по отношениюк текущему. Имя файла stuff (персонал) указывает на элемент stuff в текущем каталоге. Имя файла /work/alex/stuff приводит к поиску каталога work в корневомкаталоге, затем к поиску каталога aLex в каталоге work и, наконец, к поиску элемента stuff в каталоге aLex. Сама по себе косая черта (/) обозначает корневой каталог.В приведенном примере нашла отражение типичная иерархическая структура файловой системы, например work может обозначать диск (устанавливаемый при работе пользователя), alex может быть каталогом пользователя, a stuff может принадлежать a lex.Файл, не являющийся каталогом, может встречаться в различных каталогах, возможно, под разными именами.
Это называется связыванием. Элемент в каталоге,326Тлава 10. Краткий обзор современных операционных системотносящийся к одному файлу, называется связью. В UNIX-системах все такие связиимеют равный статус. Файлы не принадлежат каталогам. Скорее, файлы существуют независимо от элементов каталогов, а связи в каталогах указывают на реальные(физические) файлы.
Файл «исчезает», когда удаляется последняя связь, указывающая на него. Биты защиты, заданные в связях, могут отличаться от битов в исходном файле. Таким образом решается проблема избирательного ограничения надоступ к файлам.С каждым поддерживаемым системой устройством ассоциируется один или большее число специальных файлов. Операции ввода-вывода для специальных файлов осуществляются так же, как и для обычных дисковых файлов с той лишь разницей, что эти операции активизируют соответствующие устройства. Специальныефайлы обычно находятся в каталоге /dev. На специальные файлы могут указыватьсвязи точно так же, как на обычные файлы.От файловой системы не требуется, чтобы она целиком размещалась на том устройстве, где находится корень.