Московский физико-технический институт
Опубликован: 12.12.2007 | Доступ: свободный | Студентов: 5489 / 1826 | Оценка: 4.34 / 4.14 | Длительность: 13:57:00
ISBN: 978-5-94774-827-7
Лекция 11:

Интерфейс файловой системы

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Аннотация: В настоящей лекции рассматриваются основные функции и интерфейс файловой системы NTFS. Файловая система решает задачи именования и типизации файлов, организации доступа к файлам, защиты, поиска файлов и ряд других. В системе на каждом разделе диска поддерживается иерархическая система каталогов. Для эффективного доступа к файлам могут быть организованы асинхронные чтение и запись

Введение

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

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

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

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

Основные функции для работы с файлами

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

Прогон программы чтения и записи в файл

Следующая программа открывает существующий файл, считывает из него 10 байтов с начала файла и записывает в файл фразу "some bytes to write", начиная с 11-й позиции. Для буфера выделяется память из стандартной кучи процесса (см. "Введение. Виртуальное адресное пространство процесса" ).

Варианты использования различных комбинаций параметров функций CreateFile, ReadFile и WriteFile подробно описаны в MSDN. К счастью, большинство из них имеет вполне отчетливую мнемонику и не вызывает затруднений, см., например, текст программы. Назначение некоторых параметров будет уточняться в последующих разделах. Важным является то, что в случае успешного завершения функции CreateFile в системе создается объект "открытый файл", который управляет операциями, связанными с файлом, контролирует совместный доступ к файлу и содержит информацию, специфичную для данного объекта, например, указатель текущей позиции.

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

Именование файлов

Имя любого абстрактного объекта - одна из его важнейших характеристик. Когда процесс создает файл, он дает ему имя. После завершения процесса файл продолжает существовать и через свое имя может быть доступен другим процессам. Для создания файла и присвоения ему имени в ОС Windows используют Win32-функцию CreateFile.

Имя файла задается параметром lpFileName - указателем на строку, заканчивающуюся нулем. В соответствии со стандартом POSIX ОС Windows оперирует длинными (до 255 символов) именами. Если быть более точным, максимальная длина полного имени файла при создании файла равна MAX_PATH. Значение MAX_PATH определено как 260, но система позволяет преодолеть это ограничение и использовать имена файлов длиной до 32000 символов в формате Unicode.

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

Типы файлов

ОС Windows поддерживает типизацию файлов. Основные типы файлов: регулярные (обычные) файлы и директории (справочники, каталоги).

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

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

Далее речь пойдет, главным образом, об обычных файлах.

Прикладные программы, работающие с файлами, как правило, распознают тип файла по его имени в соответствии с общепринятыми соглашениями. Например, файлы с расширениями .c, .pas - текстовые файлы, хранящие программы на Си и Паскале, а файлы с расширениями .exe - исполняемые, и т.д. Связь имен с обрабатывающими программами реализована в реестре.

Атрибуты файлов

Кроме имени ОС часто связывает с каждым файлом и другую информацию, например, дату модификации, размер и т.д. Эти другие характеристики файлов называются атрибутами. В ОС Windows понятие атрибута трактуется шире. Считается, что файл - это не просто последовательность байтов, а совокупность атрибутов, и данные файла являются лишь одним из атрибутов - так называемый неименованный поток данных. Есть и другие (именованные) потоки данных, которые нужно указывать через двоеточие. Именованные потоки данных можно "увидеть" при помощи таких команд, как echo и more. Например, если выполнить следующие интерактивные команды

>Echo  содержимое файла > MyFile:Stream1
>more <  MyFile:Stream1

то на экране должны появиться слова "содержимое файла".

Вот далеко не полный перечень атрибутов файла в NTFS:

  • Стандартная информация - флаговые биты (только чтение, архивный), временные штампы и т.д.
  • Имя файла. Имя файла хранится в кодировке Unicode. Имена файлов могут повторяться в формате MS-DOS.
  • Описатель защиты.
  • Данные. Неименованный и именованные потоки данных.
  • Список атрибутов - расположение дополнительных записей MFT, если одной записи о файле оказалось недостаточно.
  • Идентификатор объекта - 64-разрядный идентификатор файла, уникальный для данного тома. Файл может быть открыт не по имени, а по этому идентификатору.
  • Информация о точке повторного разбора (см. следующую лекцию), которая используется для символьных ссылок и монтирования устройств.
  • Информация о томе.
  • Информация об индексировании, используемая для каталогов.
  • Данные EFS (Encryption File System), используемые для шифрования.

Имя файла тоже является одним из атрибутов. Атрибуты хранятся в виде пары: <наименование атрибута, значение атрибута> в записи о файле в главной файловой таблице MFT (см. следующую лекцию).

Часть атрибутов файла можно определить при его создании (через параметры функции CreateFile ) или позже при помощи SetFileAttributes, сославшись на файл по имени. Можно также специфицировать атрибуты защиты файла при помощи параметра lpSecurityAttributes. Если же значение lpSecurityAttributes равно NULL, то соответствующие атрибуты файла будут содержать параметры так называемой стандартной защиты (подробнее об этом часть V).

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

Прогон программы получения атрибутов файла

#include <windows.h>
#include <stdio.h>

void main(void) {

DWORD dwFileAttributes;

dwFileAttributes = GetFileAttributes("tmp");
if(dwFileAttributes == -1) printf(" GetFileAttributes Error\n");

if (dwFileAttributes & FILE_ATTRIBUTE_NORMAL) 
 printf("This file is normal\n");
if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
 printf("This file is directory\n");
if (dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) 
 printf("This file is reparse point\n");
}

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

Рекомендуется самостоятельно написать программу, где применяется функция SetFileAttributes, например, устанавливается флаг "FILE_ATTRIBUTE_READONLY" для атрибутов указанного файла.

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

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

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

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

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Ирина Оленина
Ирина Оленина
Николай Сергеев
Николай Сергеев

Здравствуйте! Интересует следующий момент. Как осуществляется контроль доступа по тому или иному адресу с точки зрения обработки процессом кода процесса. Насколько я понял, есть два способа: задание через атрибуты сегмента (чтение, запись, исполнение), либо через атрибуты PDE/PTE (чтение, запись). Но как следует из многочисленных источников, эти механизмы в ОС Windows почти не задействованы. Там ключевую роль играет менеджер памяти, задающий регионы, назначающий им атрибуты (PAGE_READWRITE, PAGE_READONLY, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_NOACCESS, PAGE_GUARD: их гораздо больше, чем можно было бы задать для сегмента памяти) и контролирующий доступ к этим регионам. Непонятно, на каком этапе может включаться в работу этот менеджер памяти? Поскольку процессор может встретить инструкцию: записать такие данные по такому адресу (даже, если этот адрес относится к региону, выделенному менеджером памяти с атрибутом, например, PAGE_READONLY) и ничего не мешает ему это выполнить. Таким образом, менеджер памяти остается в стороне не участвует в процессе...