HPFS

HPFS (аббр. от ) — файловая система, разработанная специалистами Microsoft и IBM на основе опыта IBM по созданию файловых систем MVS, VM и виртуального метода доступа. Со стороны Microsoft проектом руководил опытный системный программист .

Впервые поддержка HPFS появилась в операционной системе OS/2 версии 1.2. С тех пор штатная поддержка HPFS присутствует во всех версиях OS/2. В Windows NT поддержка HPFS существовала до версии 3.51 включительно (хотя есть успешные прецеденты использования старого драйвера HPFS в Windows NT 4.0 и Windows 2000). Впоследствии Microsoft отказалась от HPFS в пользу собственной файловой системы NTFS, при разработке которой был учтён опыт создания HPFS.

В OS/2 существует серверный вариант драйвера для HPFS, называемый HPFS386, который обладает некоторыми дополнительными возможностями.

Структура 
Диск в HPFS делится на секторы фиксированного размера (512 байт в текущей реализации, при этом номер сектора или их количество кодируются во внутренних структурах как 4-байтовое беззнаковое целое, что позволяет адресовать диски размером до 232 * 512 = 2 терабайта).

В начале диска расположены несколько управляющих блоков:
 Загрузочный сектор DOS-овского вида.
 SuperBlock содержит информацию о геометрии диска, указатели на битовые карты (т. н. битмапы, от ) свободного пространства, указатель на корневой каталог, размер дисковой полосы, номер полосы с каталогами, указатель на список сбойных блоков и т. п. SuperBlock также содержит дату последнего запуска CHKDSK. Обычно изменяют SuperBlock только программы CHKDSK и FORMAT.
 SpareBlock содержит указатели на пул HOTFIX-areas, пул Fault-Tolerance областей (только HPFS386 использует Fault-Tolerance), пул блоков для операций на почти заполненном диске и другие указатели, флаги и дескрипторы.
 Область начальной загрузки.
 Область секторов, используемых (временно) для выполнения операций, требующих дополнительной дисковой памяти. Эта область например, иногда задействуется при переименовании файла на заполненном диске.
 Другие области.

Для определения того, свободен сектор или занят, HPFS использует битовые карты, в которых каждый бит соответствует одному сектору. Если бит содержит 1, это означает, что сектор занят, иначе он свободен. Если бы на весь диск была только одна битовая карта, то для её подкачки приходилось бы перемещать головки чтения/записи в среднем через половину диска. Чтобы избежать этого, HPFS разбивает диск на «полосы» (или группы, от ) длиной по 8 мегабайт и хранит битмапы свободных секторов в начале или конце каждой полосы. При этом битмапы соседних полос располагаются рядом:
  ±----------- 16 MB -----------+    *** — Use/Free sector bitmap.
 |                             |
 ±-|-------------±----------±--|--±-------------±--------------+
 |***  Полоса 0  | Полоса 1 ***|***   Полоса 2  | Полоса 3  ***|
 ±---------------±-------------±----------------±--------------+
 0 MB           8 MB          16 MB            24 MB          32 MB
 
Расстояние между двумя битмапами равно 16 MB. Размер полосы (8 MB) может быть изменён в следующих версиях HPFS, так как на него нет прямых завязок. HPFS определяет размер полосы при чтении управляющих блоков с диска во время выполнения операции FSHelperAttach.

Размер битмапа равен 2 K (8 MB/512/8 = 2 K).

Полоса, находящаяся в центре диска, используется для хранения каталогов. Эта полоса называется Directory Band. Однако, если она будет полностью заполнена, HPFS начнёт располагать каталоги файлов в других полосах.

Файлы и каталоги в HPFS базируются на фундаментальном объекте, называемом FNode. Каждая FNode занимает один сектор и в HPFS всегда располагается поблизости от своего файла или каталога (обычно непосредственно перед файлом или каталогом). FNode содержит длину и первые 15 символов имени файла, статистику по доступу к файлу, внутреннюю информацию, расширенные атрибуты и ACL (или только часть, если они очень большие), ассоциативную информацию о расположении и подчинении файла и т. д.

Длины имён файлов и каталогов при полной подстановке (от корня) не должны превышать 260 символов, при этом каждая компонента пути не должна быть длиннее 255 символов. В именах файлов недопустимы следующие символы:

 0h-1Fh, 7Fh, /, |, \, *, ?, ", <, >

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

Примеры имен:
 «FILE.ASM»
 «Злобный Файл. ASM.OBJ.EXE»
 «Ещё более злобный файл . TXT»

С точки зрения размещения, файлы, каталоги и их расширенные атрибуты (если они не помещаются в FNode) рассматриваются HPFS как наборы экстентов. Экстент — это часть файла, лежащая в последовательных секторах. Каждый экстент описывается двумя числами: номером первого сектора и длиной (в секторах). Два последовательных экстента всегда объединяются HPFS в один. Минимальный размер экстента — один сектор. Так как расстояние между соседними битмапами свободных секторов равно 16 МБ, то и размер максимального экстента равен 16 МБ. Если файл состоит из восьми или менее экстентов, то его описание целиком хранится в FNode.

Если файл состоит более чем из восьми экстентов, то его описание может занимать несколько секторов, расположенных поближе к файлу, при этом эти сектора содержат не список, а прошитое сбалансированное B+-дерево экстентов. Дерево построено так, что его разбалансировка никогда не превышает 1/3 по объёму, и оно не отличается от оптимального более чем на один уровень. Корень дерева находится в FNode, причём может содержать до 12 элементов. Каждый дополнительный сектор, представляющий собой ветку дерева, содержит до 60 элементов, а лист — 40 элементов. Таким образом, если файл состоит из экстентов по одному сектору (этого никогда не будет!) и имеет размер 2 GB, для его описания потребуется дерево следующей структуры: 12*60*60*60*40=53 MB листьев и 1,7 MB веток. Для случайного доступа к любой части файла при этом потребуется (в худшем случае) 5 операций чтения управляющих структур.

Реальные файлы состоят из 1-3 экстентов.

Максимальный размер файла в HPFS сейчас 2 ГБ, однако он обусловлен только размером поля под размер файла и файловым указателем (4 байта) в самой OS/2 и её API. Это не предел HPFS. Следует помнить, что в HPFS отсутствует понятие кластера, файл может занимать 1, 2, 3, 4 или любое другое количество секторов.

При создании/расширении файлов HPFS пытается минимизировать количество экстентов, используя для этого статистику, битовые карты свободных секторов и другую информацию. Например, HPFS старается условно резервировать хотя бы 4 килобайта места в конце файлов, которые растут. Другой приём: расположение конкурентно растущих файлов или файлов, открытых разными цепочками или процессами, в разных полосах диска.

Каталоги в HPFS, как и в FAT, образуют древовидную структуру. Но при этом внутри каталога HPFS строит сбалансированное B*-дерево на основе имён файлов для быстрого поиска файла по имени внутри каталога. Например, если каталог содержит 4096 файлов, FAT будет читать в среднем 64 сектора для поиска файла внутри каталога, а HPFS считает 2-4 сектора и найдёт файл.

Размер блока, в терминах которых выделяются каталоги, равен 2 KB в текущей версии HPFS. Размер записи, описывающей файл, зависит от размера имени файла. Если имя занимает 13 байт (8.3), то 2-килобайтовый блок вмещает 41 описатель файлов. Блоки прошиты списком (как и описатели экстентов) для облегчения последовательного обхода.

HPFS не имеет FAT'овских проблем «утекания» дискового пространства при удалении большого количества файлов в каталоге.

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

Расширенные атрибуты и их разновидность ACL HPFS хранит в FNode. Если они не влезают в FNode, HPFS хранит их почти как файл, построив для этого B±Tree. Имена расширенных атрибутов до HPFS386 не выстраивались в B-Tree.

HPFS386 

HPFS386 — драйвер для файловой системы HPFS, который предназначен для серверных систем с большой нагрузкой на дисковые операции. Драйвер HPFS386 поставляется с LAN Server для OS/2.

Основные отличия HPFS386 от штатного HPFS-драйвера в OS/2:

 32-битный код
 отсутствие ограничений на размер кэша (кэш ограничен лишь размером оперативной памяти)
 поддержка списков контроля доступа ACL.

Литература 

 Горявский Ю. А. Кое-что об HPFS.

Файловые системы
OS/2