Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Сравнение структуры логического диска FAT32 и тома NTFS . Функции win32 API для работы с файлами



Сравнение структуры логического диска Fat32 и тома NTFS. Варианты организации асинхронной работы с файлами.

7.1 Файловая система NTFS vs. FAT.

Поиск данных файла:

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

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

В системе FAT16, где максимальный размер области FAT составляет 128 Кбайт, это не составит проблемы – вся область FAT просто хранится в памяти, или же считывается с диска целиком за один проход и буферизируется. FAT32 же, напротив, имеет типичный размер области FAT порядка сотен килобайт, а на больших дисках – даже несколько мегабайт.

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

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

Вывод: Абсолютный лидер - FAT16, он никогда не заставит систему делать лишние дисковые операции для данной цели. Затем идет NTFS - эта система также не требует чтения лишней информации, по крайней мере, до того момента, пока файл имеет разумное число фрагментов. FAT32 испытывает огромные трудности, вплоть до чтения лишних сотен килобайт из области FAT, если файл разбросан по разным областям диска. Работа с внушительными по размеру файлами на FAT32 в любом случае сопряжена с огромными трудностями - понять, в каком месте на диске расположен тот или иной фрагмент файла, можно лишь изучив всю последовательность кластеров файла с самого начала, обрабатывая за один раз один кластер (через каждые 4 Кбайт файла в типичной системе). Стоит отметить, что если файл фрагментирован, но лежит компактной кучей фрагментов - FAT32 всё же не испытывает больших трудностей, так как физический доступ к области FAT будет также компактен и буферизован.

Поиск свободного места:

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

NTFS имеет битовую карту свободного места, одному кластеру соответствует 1 бит. Для поиска свободного места на диске приходится оценивать объемы в десятки раз меньшие, чем в системах FAT и FAT32.

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

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

Вывод: NTFS имеет наиболее эффективную систему нахождения свободного места. Стоит отметить, что действовать "в лоб" на FAT16 или FAT32 очень медленно, поэтому для нахождения свободного места в этих системах применяются различные методы оптимизации, в результате чего и там достигается приемлемая скорость. (Одно можно сказать наверняка - поиск свободного места при работе в DOS на FAT32 - катастрофический по скорости процесс, поскольку никакая оптимизация невозможна без поддержки хоть сколь серьезной операционной системы).

Работа с каталогами и файлами:

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

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

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

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

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

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

Итоги

Параметр Лидер Аутсайдер
Поиск данных файла FAT16, NTFS FAT32
Поиск свободного места NTFS FAT32
Работа с каталогами и файлами NTFS(*) 䦋㌌㏒㧀좈໱琰茞ᓀ㵂Ü

(*) Для больших каталогов

Тома FAT32 могут теоретически быть больше 2 ТБ, но операционные системы Windows Server 2003, Windows 2000 и Windows XP могут форматировать диски объемом только до 32 ГБ. (Windows Server 2003, Windows 2000 и Windows XP Professional могут читать и записывать на большие по объему тома FAT32, отформатированные другими операционными системами).

Тома NTFS могут теоретически быть объемом до 16 эксабайт (ЭБ), но практический предел составляет 2 ТБ.

Пользователь может определить размер кластера при форматировании тома NTFS. Однако NTFS-сжатие не поддерживается для кластеров, размер которых больше 4 КБ.

7.2 Функции win32 API для работы с файлами.

Соответствие Win32 API и UNIX:

Win32 API UNIX Описание
CreateFile open создать новый файл или открыть существующий
DeleteFile unlink удалить существующий файл
CloseHandle close закрыть файл
ReadFile read прочитать данные из файла
WriteFile write записать данные в файл
SetFilePointer Iseek установить указатель работы с файлом
GetFileAttributes stat вернуть аттритбуты файла
LockFile fcntl заблокировать регион файла для решения взаимного исключения
UnlockFile fcntl разблокировать регион файла
CreateDirectory mkdir создать новый каталог
RemoveDirectory rmdir удалить пустой каталог
FindFirstFile opendir выполнить инициализацию для начала чтения записей каталога
FindNextFile readdir прочитать следующую запись каталога
MoveFile rename перенести файл из одного каталога в другой
SetCurrentDirectory chdir изменить текущий каталог

Работа с каталогами и файлами:

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

GetCurrentDirectory Получение текущего каталога
SetCurrentDirectory Смена текущего каталога
GetSystemDirectory Получение системного каталога
GetWindowsDirectory Получение основного каталога системы
CreateDirectory Создание каталога
RemoveDirectory Удаление каталога
CopyFile Копирование файла
MoveFile MoveFileEx Перемещение или переименование файла
DeleteFile Удаление файла

Работа с томами:

Для выяснения того, какие логические диски существуют в системе, используется функция DWORD GetLogicalDrives(void)

Каждый установленный бит возвращаемого значения соответствует существующему в системе логическому устройству. Например, если в системе существуют диски A:, C: и D:, то возвращаемое функцией значение равно 13(десятичное).

Функция DWORD GetLogicalDrivesStrings(DWORD cchBuffer, LPTSTR lpszBuffer) заполняет lpszBuffer информацией о корневом каталоге каждого логического диска в системе. В приведенном выше примере буфер будет заполнен символами: A:\<null>C:\<null>D:\<null><null>

Параметр cchBuffer определяет длину буфера. Функция возвращает реальную длину буфера, необходимую для размещения всей информации.

Для определения типа диска предназначена функция: UINT GetDriveType(LPTSTR lpszRootPathName)

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

Идентификатор Описание
  Тип устройства определить нельзя
  Корневой каталог не существует
DRIVE_REMOVABLE Гибкий диск
DRIVE_FIXED Жесткий диск
DRIVE_REMOTE Сетевой диск
DRIVE_CDROM Компакт диск
DRIVE_RAMDISK RAM диск

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

Функция GetDiskFreeSpace сообщает информацию о размерах сектора и кластера и о наличии свободных кластеров.

Создание и открытие файла:

HANDLE CreateFile (

LPCTSTR lpFileName, // pointer to name of the file

DWORD dwDesiredAccess, // access (read-write) mode

DWORD dwShareMode, // share mode

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security descriptor

DWORD dwCreationDistribution, // how to create

DWORD dwFlagsAndAttributes, // file attributes

HANDLE hTemplateFile // handle to file with attributes to copy

);

В случае удачи функция CreateFile возвращает описатель открытого файла как объекта ядра. Существенно, что в противном случае она возвращает не NULL, а INVALID_HANDLE_VALUE.

Параметры CreateFile ():

Параметр dwDesiredAccess задает тип доступа к файлу. Можно определить флаги GENERIC_READ и GENERIC_WRITE а так же их комбинацию для разрешения чтения или записи в файл.

Параметр dwShareMode определяет режим совместного использования файла различными процессами. Если этот параметр равен нулю, то никакой другой поток не сможет открыть этот же файл. Флаги FILE_SHARE_READ и FILE_SHARE_WRITE а так же их комбинация разрешают другим потокам осуществлять доступ к файлу для чтения или записи.

Параметр dwCreationDistribution определяет действия функции в зависимости от того, существует ли уже файл с указанным именем.

- CREATE_NEW - Создает файл, если файл существует, то ошибка.

- CREATE_ALWAYS - Создает файл, если файл существует, то старый файл удаляется и новый создается.

- OPEN_EXISTING - Открывает существующий файл.

- OPEN_ALWAYS - Создает файл, если файл не существует, то создается новый файл.

- TRUNCATE_EXISTING - Открывает файл и урезает его до нулевой длины

Параметр dwFlagsAndAttributes определяет атрибуты файла, если он создается и задает режим работы с файлом.

- FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_SYSTEM, FILE_ATTRIBUTE_TEMPORARY

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

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

FILE_FLAG_NO_BUFFERING - Не осуществлять кэширование и опережающее чтение

- FILE_FLAG_RANDOM_ACCESS - Кэшировать как файл произвольного доступа

- FILE_FLAG_SEQUENTIAL_SCAN - Кэшировать как файл последовательного доступа

- FILE_FLAG_WRITE_TROUGH - Не буферизовать операцию записи. Производить запись на диск немедленно.

- FILE_FLAG_DELETE_ON_CLOSE - Уничтожить файл при закрытии. Полезно комбинировать с атрибутом FILE_ATTRIBUTE_TEMPORARY.

- FILE_FLAG_OVERLAPPED - Работа с файлом будет осуществляться асинхронно.

Синхронный и асинхронный ввод/вывод:

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

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

Функции файлового ввод-вывода:

BOOL ReadFile(

HANDLE hFile, // handle of file to read

LPVOID lpBuffer, // address of buffer that receives data

DWORD nNumberOfBytesToRead, // number of bytes to read

LPDWORD lpNumberOfBytesRead, // address of number of bytes read

LPOVERLAPPED lpOverlapped // address of structure needed for overlapped I/O

);

BOOL WriteFile(

HANDLE hFile, // handle to file to write to

LPCVOID lpBuffer, // pointer to data to write to file

DWORD nNumberOfBytesToWrite, // number of bytes to write

LPDWORD lpNumberOfBytesRead, // pointer to number of bytes written

LPOVERLAPPED lpOverlapped // address of structure needed for overlapped I/O

);

Параметры функция файлового ввода-вывода:

Параметры функции ReadFile () имеют следующее предназначение:

- hFile – описатель объекта ядра “файл”, полученный в результате вызова функции CreateFile

- LpBuffer – адрес буфера, в который будет производиться чтение

- nNumberOfBytesToRead – количество байт, которые необходимо прочитать

- lpNumberOfBytesRead – адрес переменной, в которой будет размещено количество реально прочитанных байт. Существенно, что сразу после выполнения функции ReadFile, этот параметр не может быть установлен, так как операция чтения только началась.

- lpOverlapped – указатель на структуру OVERLAPPED, управляющую асинхронным вводом выводом.

Параметры функции WriteFile () аналогичны параметрам функции ReadFile ().

Пример синхронного копирования файла:

/* Open files for input and output. */

inhandle = CreateFile("data", GENERIC_READ, 0, NULL, OPEN_EXlSTING, 0, NULL);

outhandle = CreateFile ("newf", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

/* Copy the file. */

do {

s = ReadFile(inhandle, buffer, BUF_SIZE, &count, NULL);

if (s && count > 0) WriteFile(outhandle, buffer, count, Socnt, NULL);

} while (s>0 && count>0);

/* Close the files. */

CloseHandle (inhandle):

CloseHandle (outhandle);

Асинхронный ввод-вывод:

Для организации асинхронной работы с файлами необходимо при вызове функции CreateFile () установить флаг FILE_FLAG_OVERLAPPED в параметре dwFlagsAndAttributes.

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

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

typedef struct _OVERLAPPED {

DWORD Internal; //Используется операционной системой. Хранит статус завершения операции.

DWORD InternalHigh; //Используется ОС. Хранит количество переданных байт.

DWORD Offset; //Позиция в файле, начиная с которой необходимо

производить операцию чтения (записи).

DWORD OffsetHigh; //Количество байт для передачи.

HANDLE hEvent; //Описатель события, которое произойдет при завершении операции чтения (записи).

} OVERLAPPED;

Вариант 1 организации асинхронного ввода-вывода:

Перед запуском операции создается объект ядра “событие” и его описатель передается в функцию ReadFile () или WriteFile () в качестве элемента hEvent параметра lpOverlapped.

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

Выполнение программы при этом приостанавливается до завершения операции ввода-вывода.

Вариант 2 организации асинхронного ввода-вывода:

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

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

Вариант 3 организации асинхронного ввода-вывода:

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

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





Дата публикования: 2014-11-19; Прочитано: 1249 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.029 с)...