Файловые системы (1114721), страница 4
Текст из файла (страница 4)
Данный файлсодержит всю информацию, связанную со входом каждого пользователя всистему. Поля в файле паролей разделяются двоеточием и расположеныследующим образом:login-id: зашифрованныйначальный_каталог: shellпароль:uid:group-id:любаяинформация:5.Структура файловой системы с точки зрения пользователяСуществуетнаборфайловикаталоговсизвестными(предопределенными) именами. Ñистема знает, что в этих файлах находитсясоответствующая информация( рис.10)./UNIXBINETCTMPMNTDEVLIBSYSUSRINCLUDEBIN...........USER...........Рис.10.
Содержание корневого каталога./unix - файл загрузки ядра ОС. Выше говорилось, что при включении машиныаппаратный загрузчик запускает программный загрузчик в “ 0 “блоке, а тот всвою очередь запускает ядро./bin - файлы реализующие общедоступные команды системы. Необходимоотметить, что в ОС Unix нет набора команд системы. Пользователь это можетсделать сам. Это достигается за счет двух моментов.16 в ОС Unix запуск исполняемой программы осуществляется поимени файла (т.е.
набором имени файла). существует стандарт на прием и обработку параметров,заданных в командной строке вида :<имя файла> параметр1 параметр2 …,что обеспечивает доступ к строкам из С-программ./etc - файлы, используемые для управления системой (passwd, mount, unmount)./tmp - хранятся временные данные системы (до первой перезагрузки);/mnt - директория, к которой монтируется монтируемая ФС (см.ниже);/dev - каталог, содержащий файлы устройств;/usr - каталог, связанный с работой пользователя в системе:/usr/lib - системы программирования, редакторы и т.д.
Например, здесьнаходятся препроцессор С ( /lib/cpp), библиотека стандартных функций С(/lib/libc.a);/usr/bin - второй уровень команд системы (программы пользователя);/usr/user - домашние каталоги различных пользователей;/usr/include - файлы макроопределений С-программ;/usr/include/sys - системные файлы макроопределений С-программ;В частности, результатом команды ls / будет следующееunixbinetctmpmntdevusr1.6. Организация обмена данными с файлами1.6.1. Низкоуровневый ввод/вывод.Мы рассмотрим основные принципы организации, так называемого,низкоуровнего обмена с файлами. В операционной системе UNIX для этихцелей используются системные вызовы, осуществляющие непосредственноеобращение к средствам ОС и, в частности, к ядру (Рис.11).
Рассмотрим этовзаимодействие с точки зрения пользовательского интерфейса, а точнее наборафункций предоставляющего возможности организации этого взаимодействия.17Пользовательская программаСистемные вызовыФайловая системаБлок-ориентированные Байт-ориентированныелогические устройства логические устройстваДрайверы физических устройствФизические устройства ЭВМРис.11 Структура системы управления вводом/выводом1.6.2 Открытие/закрытие файла.Операционная система предоставляет процессу доступ к содержимомуфайла после того как он был открыт. Открытие файла - это своего родарегистрация процесса в операционной системе на доступ к содержимому фала.Для выполнения операции открытия существующего файла используетсяфункцияint open(char *name, int flag).Параметрами данной функции служат: name - указатель на строку, содержащую полное имя открываемогофайла; flag - значение, специфицирующее режим открытия файла (открытиефайла только на чтение или только на запись).Функция возвращает целое значение fd.
Если fd больше нуля, то считается, чтооткытие файла прошло успешно, а значение fd называется дескрипторомфайла. Если fd равно -1, это означает что запрос на открытие файла невыполнен (файл с указанным именем не существует или может бытьнедоступен для данного пользователя и т.д.). Следует отметить, что нумерациядескрипторов это атрибут процесса.Кроме возможности открытия существующего файла имеется функция,обращение к которой позволяет создать новый файл с заданным именем:int creat(char *name, int perms).Параметрами данной функции служат: name - указатель на строку, содержащую полное имя открываемогофайла; perms- значение, специфицирующее права доступа создаваемогофайла.Данный вызов возвращает дескриптор файла, если файл с указанным именемможно создать и -1 в противном случае.Завершение работы с файлом должно заканчиваться обращение кфункции:close(fd).Обращение к данной функции обеспечивает “закрытие” доступа к содержимомуфайла, ассоциированного в данном процессе с дескриптором fd.181.6.3 Чтение/запись данных.Чтение данных из файла осуществляется при помощи функции:nr=read(int fd, char * buf, int count)При обращении к функции count байтов из файла с дескриптором fd будутпомещены в область памяти, на которую указывает указатель buf.Запись в файл осуществляется при использовании функции:nw=write(int fd, char *buf, int count).count литер из области памяти на которую указывает buf будет записано вфайл с дескриптором fd.Рассмотрим системный подход к организации низкоуровнего обменаРис11.
Для этого определим наиболее характерные наборы данныхиспользуемые в операционной системе для целей организации низкоуровнегообмена. Эти данные можно подразделить на два класса. Первый - данныеассоциированные с операционной системой, они отражают ситуациювзаимодействия со всеми открытыми к данному моменту времени файлами.Второй - данные ассоциированные с каждымпроцессом, который ихобрабатывает в данный момент времени . Эти данные отражают состав исостояние взаимодействия всех файлов открытых в каждом отдельномпроцессе.Процесс 1Таблица открытыхфайлов (ТОФ1)i: NameТаблица файлов(ТФ)Таблица индексныхдескрипторов открытыхфайлов (ТИДОФ)2 NameFork()Процесс 2Таблица открытыхфайлов (ТОФ2)3 Name1 Namei: NameПроцесс 3Таблица открытыхфайлов (ТОФ3)Блоки файлаj: NameРис 12.
Логическая схема организации обмена.1.6.4. Данные ассоциированные с операционной системой.Таблица индексных дескрипторов открытых файлов (ТИДОФ). Этотаблица операционной системы, размещенная в оперативной памяти и19содержащая номера и копии индексных дескрипторов всех открытых к данномумоменту времени файлов. Кроме того, каждая запись содержит количествоссылок на нее из таблицы файлов(смотрите чуть ниже).
Соответственно, всеоперативные изменения содержимого индексного дескриптора хранятся вТИДОФ. Полная фиксация всех изменений индексного дескрипторапроисходит при закрытии файла (осуществляется запись в соответствующееместо файловой системы).Таблица файлов (ТФ). Каждая строка данной таблицы соответствуетоткрытому в каком-то процессе файлу, таким образом количество строк втаблице соответствует числу открытых во всей системе файлов. Этосоответствие является взаимнооднозначным, за исключением случаев открытиядоступа к файлам унаследованным от родительских процессов (об этомподробнее будет рассказано ниже). Каждая строка этой таблицы содержитинформацию о режимах открытия файла, о положении указателя чтения/записи,ссылку на строку ТИДОФ в которой размещена копия индексного дескриптораданного файла, а также счетчик “наследственности” - число процессов вкоторых этот файл передан посредством обращения к функции fork()(подробнее об этом будет рассказано ниже).1.6.5.
Данные ассоциированные с процессом.На уровне данных, ассоциируемых с процессом пользователя, имеется таблицаоткрытых файлов процесса(ТОФ). Номер строки таблицы - номер файловогодескриптора. Каждая строка таблицы имеет ссылку на соответствующую строкуТФ. Следует отметить, что при порождении процесса, интерпретатор команд,который его порождает, предопределяет первые три дескриптора:0 - стандартный файл ввода информации;1 - стандартный файл вывод информации;2 - стандартный файл вывод диагностик.Рассмотрим, схематично, последовательность действий происходящих ссодержимым вышерассмотренных таблиц при выполнении некоторыхсистемных вызовов.Обращение к функции fork() - формирование сыновнего процесса.
Какизвестно, после обращения к данной функции образуется копия исходногопроцесса. При этом система дублирует таблицу открытых файлов родителя ваналогичную таблицу сына, а также корректирует (увеличивает на единицу)счетчики наследственности в записях таблицы файлов соответствующихфайлам унаследованным сыном. Последнее приводит к тому, что и сын иродитель будут использовать один и тот же указатель чтения/записи внаследуемых файлах.При выполнении функции open (для простоты изложения считаем, чтозапрос на открытие файла корректный: файл с указанным именем существует инет конфликта с несоответствием прав доступа):1. по полному имени файла определяется каталог в котором онразмещен;2.
определяется номер индексного дескриптора файла;203. по номеру индексного дескриптора осуществляется поиск в ТИДОФ,если запись с заданным номером обнаружена, фиксируем номерсоответствующей строки ТИДОФ и переходим к пункту 5;4. происходит формирование новой строки соответствующей “новому”индексному дескриптору и фиксируется ее номер;5. корректируем счетчик ссылок на запись таблицы ТИДОФ из таблицыфайлов, формируем новую запись в таблице файлов, а такжесоответствующую запись в таблице открытых файлов процесса,определяется номер этой записи (номер строки) и он возвращается впроцесс в качестве файлового дескриптора.1.6.6.
Взаимодействие с устройствами.Как рассматривалось выше, система Unix подразделяет все логическиеустройства на два класса: байт-ориентированные устройства; блокориентированные устройства. Это подразделение во многом зависит от свойствреальных физических устройств и в подавляющем большинстве блокориентированное физическое устройство может быть таким же и логическимустройством (аналогично и для байт-ориентированных устройств). Вернемся крассмотрению Рис.9.
Взаимодействие с байт-ориентированными устройствамине представляет особого интереса, поэтому рассмотрим специфическиесвойства организации обмена с блок-ориентированными устройствами.Основной особенностью организации работы с блок-ориентированнымиустройствами является возможность использования буферизации при обменах среальными физическими устройствами. Суть организации буферизациизаключается в использовании пула буферов (размер каждого буфера один блок),каждый из которых может быть ассоциирован с драйвером одного изфизических устройств. Пул буферов размещается в оперативной памяти. Далее,выполнение заказа на обмен может происходить по следующим схемам.Чтение блока.