Privacy Policy Cookie Policy Terms and Conditions HPFS — Википедия

HPFS

Материал из Википедии — свободной энциклопедии

HPFS — High Perfomance File System, файловая система разработанная специалистами Microsoft и IBM на основе опыта IBM по созданию файловых систем MVS, VM/CMS и виртуального метода доступа. Со стороны Microsoft проектом руководил опытный системный программист Gordon Letwin.

Впервые поддержка 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

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


В начале диска расположены несколько управляющих блоков:

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

Для определения свободен сектор или занят HPFS использует битмапы, в которых каждый бит соответствует одному сектору. Если бит содержит 1 то это означает что сектор занят, иначе он свободен. Если бы на весь диск был бы только один битмап, то для его подкачки приходилось бы перемещать головки чтения/записи в среднем через половину диска. Чтобы избежать этого, HPFS разбивает диск на «полосы» (bands) длиной по 8 мегабайт и хранит битмапы свободных секторов в начале или конце каждой полосы. При этом битмапы соседних полос располагаются рядом:

±-------- 16MB --------+    *** — Use/Free sector bitmap.
|                       |
±-|-----------±----------|--±-------------±-------------+
|***  Полоса 0 | Полоса 1  ***|***  Полоса 2 | Полоса 3  ***|
±-------------±-------------±-------------±-------------+
0MB           8MB           16MB           24MB           32MB

Расстояние между двумя битмапами равно 16MB. Размер полосы (8MB) может быть изменён в следующих версиях HPFS, так как на него нет прямых завязок. HPFS определяет размер полосы при чтении управляющих блоков с диска во время выполнения операции FSHelperAttach.

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

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


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

Имена файлов и каталогов при полной подстановке (от корня) не должны превышать 260 символов, при этом каждая компонента пути не должна быть длиннее 255 символов. В именах файлов недопустимы символы: 0h-31h, 7Fh, "/", "|", "\", "*", "?", '"', "<", ">". Последовательности конечных пробелов игнорируются, если на конце файла стоит точка, то она тоже игнорируется (для программной совместимости). Внутри имени файла точка — такой же символ как и остальные. С русскими буквами проблем нет. При создании файла HPFS запоминает написание его имени, хотя и не различает регистров в дальнейших операциях, кроме тех, что возвращают информацию о файле.

Примеры имен:

  1. "FILE.ASM"
  2. "Злобный Файл.ASM.OBJ.EXE"
  3. "Ещё более злобный файл . TXT"

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


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

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


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


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


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

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

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

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


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

[править] Использованная и рекомендуемая литература

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

О B*/B±деревьях: Кнут, Д. Искусство программирования.

 
THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu