Принципы построения файловых систем семейства UNIX
Общие сведения о файловых системах семейства UNIX. Индексные дескрипторы, их недостатки и ограничения. Операции vnode и монтирование файловой системы. Блокирование доступа к файлу и внутренняя структура буферного кэша. Целостность файловой системы.
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Мы уже встречались с использованием системного вызова/сш1(2) для блокирования записей файла в главе 2. Там же была упомянута структура flock, служащая для описания блокирования.
Как следует из описания поля l_type структуры flock, существуют два типа блокирования записи: для чтения (f_ RDLCK) и для записи (f_wrlck). Правила блокирования таковы, что может быть установлено несколько блокирований для чтения на конкретный байт файла, при этом в установке блокирования для записи на этот байт будет отказано. Напротив, блокирование для записи на конкретный байт должно быть единственным, при этом в установке блокирования для чтения будет отказано.
Приведем фрагмент программы, использующей возможность блокирования записей:
struct flock lock;
/*Заполним описание lock с целью блокирования всего файла для записи*/
lock.l_type = F_WRLCK; lock.l_start = 0; lock.whence = SEEK_SET; lock.len = 0;
/*Заблокируем файл. Если блокирования, препятствующие данной операции, уже существуют -- ждем их снятия*/ fcntl(fd, SETLKW, &lock);
/*Запишем данные в файл -- нам никто не помешает*/ write(fd, record, sizeof(record)); /*Снимем блокирование*/ lock.l_type = F UNLCK; fcntl(fd, SETLKW, Slock);
В отличие от рекомендательного в UNIX существует обязательное блокирование (mandatory lock), при котором ограничение на доступ к записям файла накладывается самим ядром. Реализация обязательных блокировок может быть различной. Например, в SCO UNIX (SVR3) снятие бита х для группы и установка бита SGID для группы приводит к тому, что блокировки, установленные fcntl(2) или lockf(3C), станут обязательными. UNIX SVR4 поддерживает установку блокирования отдельно для записи и для чтения, обеспечивая тем самым доступ для чтения многим, а для записи -- только одному процессу. Эти установки также осуществляются с помощью системного вызоваfcntl(2). Следует иметь в виду, что использование обязательного блокирования таит потенциальную опасность. Например, если процесс блокирует доступ к жизненно важному системному файлу и по каким-либо причинам теряет контроль, это может привести к аварийному останову операционной системы.
1.16 Буферный кэш
Во введении отмечалось, что работа файловой подсистемы тесно связана с обменом данными с периферийными устройствами. Для обычных файлов и каталогов -- это устройство, на котором размещается соответствующая файловая система, для специальных файлов устройств -- это принтер, терминал, или сетевой адаптер. Не вдаваясь в подробности подсистемы ввода/вывода, рассмотрим, как во многих версиях UNIX организован обмен данными с дисковыми устройствами -- традиционным местом хранения подавляющего большинства файлов3.
На самом деле файловые системы могут располагаться на удаленных компьютерах. Хотя при работе с такими файловыми системами дисковый ввод/вывод отсутствует, тем не менее, и в этом случае кэширование блоков данных значительно повышает производительность.
Не секрет, что операции дискового ввода/вывода являются медленными по сравнению, например, с доступом к оперативной или сверхоперативной памяти. Время чтения данных с диска и копирования тех же данных в памяти может различаться в несколько тысяч раз. Поскольку основные данные хранятся на дисковых накопителях, дисковый ввод/вывод является узким местом операционной системы. Для повышения производительности дискового ввода/вывода и, соответственно, всей системы в целом, в UNIX используется кэширование дисковых блоков в памяти.
Рис. 12. Роль буферного кэша
Для этого используется выделенная область оперативной памяти, где кэ-шируются дисковые блоки файлов, к которым наиболее часто осуществляется доступ. Эта область памяти и связанный с ней процедурный интерфейс носят название буферного кэша, и через него проходит большинство операций файлового ввода/вывода.
1.17 Внутренняя структура буферного кэша
Буферный кэш состоит из буферов данных, размер которых достаточен для размещения одного дискового блока. С каждым блоком данных связан заголовок буфера, представленный структурой buf, с помощью которого ядро производит управление кэшем, включая идентификацию и поиск буферов, а также синхронизацию доступа. Заголовок также используется при обмене данными с драйвером устройства для выполнения фактической операции ввода/вывода. Когда возникает необходимость чтения или записи буфера на диск, ядро заносит параметры операции ввода/вывода в заголовок и передает его функции драйвера устройства. После завершения операции ввода/вывода заголовок содержит информацию о ее результатах.
Буферный кэш использует механизм отложенной записи (write-behind), при котором модификация буфера не вызывает немедленной записи на диск. Такие буферы отмечаются как "грязные", а синхронизация их содержимого с дисковыми данными происходит через определенные промежутки времени. Примерно одна треть операций дискового ввода/вывода приходится на запись, причем один и тот же буфер может на протяжении ограниченного промежутка времени модифицироваться несколько раз. Поэтому буферный кэш позволяет значительно уменьшить интенсивность записи на диск4 и реорганизовать последовательность записи отдельных буферов для повышения производительности ввода/вывода (например, уменьшая время поиска, группируя запись соседних дисковых блоков). Однако этот механизм имеет свои недостатки, поскольку может привести к нарушению целостности файловой системы в случае неожиданного останова или сбоя операционной системы.
Операции ввода/вывода
На рис. 13 представлена схема выполнения операций ввода/вывода с использованием буферного кэша. Важной особенностью этой подсистемы является то, что она обеспечивает независимое выполнение операций чтения или записи данных процессом как результат соответствующих системных вызовов, а также фактический обмен данными с периферийным устройством.
Когда процессу требуется прочитать или записать данные он использует системные вызовы read(2) или write(2), направляя тем самым запрос файловой подсистеме. В свою очередь файловая подсистема транслирует этот запрос в запрос на чтение или запись соответствующих дисковых блоков файла и направляет его в буферный кэш. Прежде всего, кэш просматривается на предмет наличия требуемого блока в памяти. Если соответствующий буфер найден, его содержимое копируется в адресное пространство процесса в случае чтения и наоборот при записи, и операция завершается. Если блок в кэше не найден, ядро размещает буфер, связывает его с дисковым блоком с помощью заголовка buf и направляет запрос на чтение драйверу устройства. Обычно используется схема чтения вперед (read-ahead), когда считываются не только запрашиваемые блоки, но и блоки, которые с высокой вероятностью могут потребоваться в ближайшее время (рис. 13). Таким образом, последующие вызовы read(2) скорее всего не потребуют дискового ввода/вывода, а будут включать лишь копирование данных из буферов в память процесса, -- операция, которая, как отмечалось, обладает на несколько порядков большей производительностью (рис. 13). При запросе на модификацию блока изменения также затрагивают только буфер кэша. При этом ядро помечает буфер как "грязный" в заголовке buf (рис. 13). Перед освобождением такого буфера для повторного использования, его содержимое должно быть предварительно сохранено на диске (рис. 13).
Перед фактическим использованием буфера, например при чтении или записи буфера процессом, или при операции дискового ввода/вывода, доступ к нему для других процессов должен быть заблокирован. При обращении к уже заблокированному буферу процесс переходит в состояние сна, пока данный ресурс не станет доступным.
Использование буферного кэша позволяет избежать 95% операций чтения с диска и 85% операций записи на диск для типичной конфигурации операционной системы.
Не заблокированные буферы помечаются как свободные и помещаются в специальный список. Буферы в этом списке располагаются в порядке наименее частого использования (Least Recently Used, LRU). Таким образом, когда ядру необходим буфер, оно выбирает тот, к которому не было обращений в течение наиболее продолжительного промежутка времени. После того как работа с буфером завершена, он помещается в конец списка и является наименее вероятным кандидатом на освобождение и повторное использование. Поэтому, если процесс вскоре опять обратится к тому же блоку данных, операция ввода/вывода по-прежнему будет происходить с буфером кэша. С течением времени буфер перемещается в направлении начала очереди, но при каждом последующем обращении к нему, будет помещен в ее конец.
Рис. 13. Схема работы буферного КЭШа
Основной проблемой, связанной с буферным кэшем, является "старение" информации, хранящейся в дисковых блоках, образы которых находятся в буферном кэше. Как следует из схемы работы кэша, большинство изменений затрагивают только данные в соответствующих буферах, в то время, как дисковые блоки хранят уже устаревшую информацию. Разумеется в нормально работающей системе проблемы как таковой не возникает, поскольку в операциях ввода/вывода всегда используются свежие данные буферного кэша. Однако при аварийном останове системы, это может привести к потере изменений данных файлов, сделанных процессами непосредственно перед остановом.
Для уменьшения вероятности таких потерь в UNIX имеется несколько возможностей:
Во-первых, может использоваться системный вызов sync(2), который обновляет все дисковые блоки, соответствующие "грязным" буферам. Необходимо отметить, что sync(2) не ожидает завершения операции ввода/вывода, таким образом, после возврата из функции не гарантируется, что все "грязные" буферы сохранены на диске5.
Во-вторых, процесс может открыть файл в синхронном режиме (указав флаг О SYNC в системном вызове ореп(2)). При этом все изменения в файле будут немедленно сохраняться на диске.
Наконец, через регулярные промежутки времени в системе пробуждается специальный системный процесс -- диспетчер буферного кэша (в различных версиях UNIX его названия отличаются, чаще всего используется fsflush или bdflush). Этот процесс освобождает
В распоряжении администратора имеется командный интерфейс к системному вызову -- утилита sync(1M). Поскольку выполнение команды еще не свидетельствует о фактическом завершении ввода/вывода, администраторы практикуют вызов sync(lM) несколько раз. Повторные вызовы повышают вероятность того, что ввод/вывод будет завершен прежде, чем будет введена другая команда или остановлена система, поскольку набор команды занимает определенное время. Тот же эффект может быть достигнут просто ожиданием нескольких секунд после ввода sync(lM),но набор команды позволяет "скрасить ожидание".
1.18 Кэширование в SVR4
Центральной концепцией в архитектуре виртуальной памяти SVR4 является отображение файлов. При этом подходе все адресное пространство может быть представлено набором отображений различных файлов в память. Действительно, в страницы памяти, содержащие кодовые сегменты, отображаются соответствующие секции исполняемых файлов. Процесс может задать отображение с помощью системного вызова ттар(2), при этом страницам памяти будут соответствовать определенные участки отображаемого файла. Даже области памяти, содержимое которых изменяется и не связано ни с каким файлом файловой системы, т. н. анонимные страницы, можно отобразить на определенные участки специального файла устройства, отвечающего за область свопинга (именно там сохраняются анонимные объекты памяти). При этом фактический обмен данными между памятью и устройствами их хранения, инициируется возникновением страничной ошибки. Такая архитектура позволяет унифицировать операции ввода/вывода практически для всех случаев.
При этом подходе, когда процесс выполняет вызовы read(2) или write(2), ядро устанавливает отображение части файла, адресованного этими вызовами, в собственное адресное пространство. Затем эта область копируется в адресное пространство процесса. При копировании возникают страничные ошибки, приводящие в фактическому считыванию дисковых блоков файла в память. Поскольку все операции кэширования данных в этом случае обслуживаются подсистемой управления памятью, необходимость в буферном кэше, как отдельной подсистеме, отпадает.
1.19 Целостность файловой системы
Значительная часть файловой системы находится в оперативной памяти. А именно, в оперативной памяти расположены суперблок примонтиро-ванной системы, метаданные активных файлов (в виде системно-зависимых inode и соответствующих им vnode) и даже отдельные блоки хранения данных файлов, временно находящиеся в буферном кэше.
Работа диспетчера буферного кэша зависит от версии UNIX и конкретных настроек ядра системы. Например, в SCO UNIX для этого используются несколько параметров. Параметр BDFLDSHR задает интервал между последовательными пробуждениями bdflush, его значение по умолчанию составляет 30 секунд. Параметр NAUTOUP задает промежуток времени, который буфер должен оставаться "грязным", прежде чем bdflush сохранит его на диске.
Для операционной системы рассогласование между буферным кэшем и блоками хранения данных отдельных файлов, не приведет к катастрофическим последствиям даже в случае внезапного останова системы, хотя с точки зрения пользователя все может выглядеть иначе. Содержимое отдельных файлов не вносит существенных нарушений в целостность файловой системы.
Другое дело, когда подобные несоответствия затрагивают метаданные файла или другую управляющую информацию файловой системы, например, суперблок. Многие файловые операции затрагивают сразу несколько объектов файловой системы, и если на диске будут сохранены изменения только для части этих объектов, целостность файловой системы может быть существенно нарушена.
Рассмотрим пример создания жесткой связи для файла. Для этого файловой подсистеме необходимо выполнить следующие операции:
1. Создать новую запись в необходимом каталоге, указывающую на inode файла.
2. Увеличить счетчик связей в inode.
Предположим, что аварийный останов системы произошел между первой и второй операциями. В этом случае после запуска в файловой системе будут существовать два имени файла (две записи каталогов), адресующие inode со счетчиком связей di_nlinks, равным 1. Эта ситуация показана на рис. 4.15 (а). Если теперь будет удалено одно из имен, это приведет к удалению файла как такового, т.е. к освобождению блоков хранения данных и inode, поскольку счетчик связей di_nlinks станет равным 0. Оставшаяся запись каталога будет указывать на неразмещенный индексный дескриптор, или inode, адресующий уже другой файл.
Порядок операций с метаданными может иметь существенное влияние на целостность файловой системы. Рассмотрим, например, предыдущий пример. Допустим, порядок операций был изменен и, как и прежде, останов произошел между первой и второй операциями. После запуска системы файл будет иметь лишнюю жесткую связь, но существующая запись каталога останется правильной. Тем не менее при удалении имени файла фактически файл удален не будет, поскольку число связей останется равным 1 (рис. 14). Хотя это также является ошибкой, результатом которой является засорение дискового пространства, ее последствия все же менее катастрофичны, чем в первом случае.
Ядро выбирает порядок совершения операций с метаданными таким образом, чтобы вред от ошибок в случае аварии был минимальным. Однако проблема нарушения этого порядка все же остается, т.к. драйвер может изменять очередность выполнения запросов для оптимизации ввода/вывода. Единственной возможностью сохранить выбранный порядок является синхронизация операций со стороны файловой подсистемы.
В нашем примере файловая подсистема будет ожидать, пока на диск не будет записано содержимое индексного дескриптора, и только после этого произведет изменения каталога.
Отсутствие синхронизации между образом файловой системы в памяти и ее данными на диске в случае аварийного останова может привести к появлению следующих ошибок:
Один блок адресуется несколькими mode (принадлежит нескольким файлам).
Блок помечен как свободный, но в то же время занят (на него ссылается inode).
Блок помечен как занятый, но в то же время свободен (ни один inode на него не ссылается).
Неправильное число ссылок в inode (недостаток или избыток ссылающихся записей в каталогах).
Несовпадение между размером файла и суммарным размером адресуемых inode блоков.
Недопустимые адресуемые блоки (например, расположенные за пределами файловой системы).
"Потерянные" файлы (правильные inode, на которые не ссылаются записи каталогов).
Недопустимые или неразмещенные номера inode в записях каталогов.
Рис. 14. Возможные ошибки файловой системы
Заключение
Если нарушение все же произошло, на помощь может прийти утилита fsck(lM), производящая исправление файловой системы. Запуск этой утилиты может производиться автоматически каждый раз при запуске системы, или администратором, с помощью команды:
fsck [options] filesystem
где filesystem -- специальный файл устройства, на котором находится файловая система.
Проверка и исправление должны производиться только на размонтированной файловой системе. Это связано с необходимостью исключения синхронизации таблиц в памяти (ошибочных) с их дисковыми эквивалентами (исправленными). Исключение составляет корневая файловая система, которая не может быть размонтирована. Для ее исправления необходимо использовать опцию -Ь, обеспечивающую немедленный перезапуск системы после проведения проверки.
Описана организация файловой подсистемы UNIX. Начав разговор с обсуждения архитектуры традиционных файловых систем UNIX, мы остановились на анализе т.н. виртуальной файловой системы, обеспечивающей единый интерфейс доступа к различным типам физических файловых систем.
Мы также рассмотрели, каким образом происходит доступ процесса к данным, хранящимся в файлах, вплотную подошли к разговору о подсистеме ввода/вывода, который и продолжим в следующей главе.
Размещено на Allbest.ru
...
Подобные документы
История развития ОС UNIX, ее достоинства. Управление компьютером под управлением UNIX. Интерпретация командной строки и структура файловой системы. Команды управления процессами. Средства системного администрирования и учетные записи пользователей.
презентация [78,1 K], добавлен 12.05.2014
Иерархическая структура файловой системы Unix. Согласованная обработка массивов данных, возможность создания и удаления файлов, буферный кэш. Защита информации, трактовка периферийных устройств как файлов. Внутренняя структура файловой системы Unix.
реферат [102,2 K], добавлен 23.03.2010
Описание файловой системы Unix. Работа основных команд ls, cmp, comm, их ключей. Разработка программного продукта, работающего в среде Windows и представляющего собой эмулятора командного процессора операционной системы Unix. Выбор средств реализации.
курсовая работа [183,0 K], добавлен 29.04.2015
Права доступа к файлам и управление ими и другими атрибутами. Значения прав доступа для файлов и директорий. Набор файловых флагов. Команды управления процессами в операционной системе UNIX. Опции и значения программ архивации и сжатия - tar и gzip.
контрольная работа [234,4 K], добавлен 16.01.2014
Изучение основных правил проектирования операционных систем. Структура файловой системы. Компоненты, обеспечивающие способы организации, поиска и управления информацией. Краткий обзор специальных и обыкновенных файлов. Основные команды системы UNIX.
методичка [36,4 K], добавлен 02.12.2009
Понятие файла, его сущность и особенности, общие сведения и характеристика файловых систем. Классификация файлов, их разновидности и отличительные черты. Содержание и структура файловой системы FAT, ее элементы и предназначение. Особенности FAT32.
реферат [276,4 K], добавлен 04.04.2009
Принципы построения, модель сетевой файловой системы. Интерфейс сетевой файловой службы. Контроль и единица доступа. Размещение клиентов и серверов по компьютерам. Место расположения кэша. Способы распространения модификаций. Прозрачность репликации.
реферат [2,3 M], добавлен 29.04.2014
История развития и отличительные признаки UNIX-системы. Основы информационной безопасности и особенности настройки исследуемой операционной системы, ее достоинства, недостатки и базовые права доступа. Общая характеристика безопасности ядра UNIX.
реферат [599,5 K], добавлен 18.09.2013
Переход от коротких имен файлов к длинным. Особенности кэширования диска. Логическая организация файла. Его физическая организация. Права доступа к файлу. Общая модель файловой системы. Отображаемые в память файлы. Современные архитектуры файловых систем.
презентация [85,4 K], добавлен 18.02.2010
Организация хранения информации на накопителях. Цели и задачи файловой системы, ее физическая организация и адресация файла. Виды файловых систем. Проектирование символов для матричных принтеров. Приемы управления работой печатающих устройств в MS-DOS.
курсовая работа [1,7 M], добавлен 22.06.2011
Анализ программы "Проводник". Понятие операционной системы (ОС). Достоинства и недостатки файловых систем. Исследование методов запуска программы "Проводник", работа с файловой структурой в программе "Проводник" ОС Windows. Приемы работы с объектами.
курсовая работа [32,7 K], добавлен 13.09.2009
Порядок, определяющий организацию, хранения и именования данных на носителях информации в компьютерах. Классификация файловых систем. Основные функции файловой системы Linux. Нарушения целостности файловой системы при некорректном завершении работы.
презентация [405,2 K], добавлен 10.10.2011
История появления операционной системы Unix. Перекомпиляция Unix в коды любой аппаратной платформы, ее многозадачность и многотерминальность. Основные отличия Unix от других операционных систем. Использование Unix в качестве сервера и рабочей станции.
реферат [28,1 K], добавлен 05.04.2010
Особенности и принцип действия файловой системы NTFS - одной из самых сложных и удачных из существующих на данный момент файловых систем. Функции файловой системы NTFS: разреженные файлы, журнал изменений, компрессия файлов и каталогов, жесткие связи.
реферат [17,4 K], добавлен 24.12.2010
Основные классификации операционных систем. Операционные системы семейства OS/2, UNIX, Linux и Windows. Разграничение прав доступа и многопользовательский режим работы. Пользовательский интерфейс и сетевые операции. Управление оперативной памятью.
реферат [22,8 K], добавлен 11.05.2011
Использование номеров индексных дескрипторов для обозначения файлов в программах для системных администраторов в операционной системе UNIX. Описание индексного дескриптора в POSIX. Адрес индексного дескриптора в записи директории, относящейся к файлу.
контрольная работа [31,7 K], добавлен 18.06.2014
Правила монтирования и демонтирования файловых систем на диске. Описание полей файла /etc/fstab. Создание суперблока, таблицы индексного дескриптора, совокупности блоков данных. Строение и структура описания группы блоков. Система адресации данных.
презентация [143,1 K], добавлен 20.12.2013
Основное назначение файловой системы как эффективное решение задачи. История создания и общая характеристика файловой системы FAT. Характеристика файловых систем FAT16 и FAT32 и их сравнение. Альтернативная файловая система NTFS и её сравнение с FAT32.
реферат [27,2 K], добавлен 01.12.2014
Предназначение дисковых накопителей, схема устройства жесткого диска. Критерии эффективности физической организации файлов. Схема адресации кластеров файла, используемая в стандартной на сегодняшний день для UNIX файловой системе ufs. Функции флэш-памяти.
реферат [4,0 M], добавлен 09.12.2009
Основные защитные механизмы операционной системы семейства Unix, недостатки ее защитных механизмов. Идентификаторы пользователя и группы пользователей. Защита файлов, контроль доступа, уязвимость паролей. Проектирование символов для матричных принтеров.
курсовая работа [488,8 K], добавлен 22.06.2011