Тайны и секреты компьютера

       

Проблемы кластерной организации


Потери

Кластерная организация данных на жестком диске, обеспечивая возможность многократного удаления и создания файлов, приводит к двум большим проблемам. Первая - это потери дискового пространства. Так как в подавляющем большинстве случаев размер файлов не кратен размерам кластеров, то последний кластер, помеченный в FAT как принадлежащий какому-либо файлу, оказывается заполненным не полностью. Это место уже не может стать частью другого файла, и поэтому не может быть использовано. Если файлов много, то общее количество такого "потерянного" места становится немалым. Особенно такая потеря проявляется при размещении на жестком диске большого количества мелких файлов, размер которых меньше размера кластера. Так, при размере кластера в 32 килобайта 10 файлов по 3 килобайта займут на жестком диске не 30 килобайт, как могло бы показаться, а 320. В самом крайнем случае для сохранения файла размером один байт операционная система выделит на диске один кластер размером 32 килобайта.

Рис.8.8. Информация программы ScanDisk.

">Стоит запомнить, что так как один кластер занимает фиксированный обьем диска (чаще всего это 16 или 32 килобайта) и может содержать не более одного файла, то неизбежны потери пространства диска. Если размер файла меньшеразмера кластера или просто не кратен ему, то в кластере, содержащем этот файл (или окончание файла) останется незанятое пространство.

Информацию о размере кластера и количестве их на диске можно получить, используя программу Scandisk для Windows 95/98 (рис.8.8).

Фрагментация

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


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

Пути решения

Путь решения проблемы потерь дискового пространства напрашивается сразу - уменьшить размер кластера. В самом деле, если кластер имеет размер 4 кб, а не 32, то пустого места в нем может остаться в 8 раз меньше, чем при использовании кластеров в 32 кб. Используя FAT16, для этого надо уменьшить размер логического диска (в самом деле, на диске в 1 гигабайт минимальный размер кластера будет 1024*1024/65536=16 килобайт, а на диске в 512 мегабайт - 1024*512/65536=8 килобайт). В FAT32 размер кластера в 4 кб является вполне нормальным и может использоваться на логических дисках размером до 16 гигабайт.

Но даже в пределах имеющейся файловой системы FAT16 можно уменьшить потери дискового пространства. Например, делать файлы большого обьема или, если это невозможно, хранить их в архивах, либо извлекая по мере необходимости, либо используя специальные программы, делающие архивы "прозрачными" для операционной системы, вроде ZipFolders или ZipMagic. Тогда кластеров, не до конца заполненных данными, будет мало. Также можно использовать сжатие дисков (при этом все содержимое диска фактически хранится в одном файле), но это очень опасно в плане надежности хранения.



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


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

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

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



Рис.8.9. Не правда ли, странно? Как будто капли дождя на стекле.

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



 

Проблема выбора

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

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

Также имеется вопрос - а какая файловая система лучше, FAT16 или FAT32? Тут необходимо оценить, что важнее. FAT32 позволяет установить меньший размер кластера и разбивать винчестер на логические диски больших размеров - больше 2 гигабайт. Но при этом сама 32-разрядная таблица FAT занимает больше места на диске, труднее кэшируется, а файлы, записанные на диске с малым размером кластера, сильнее фрагментируются, что может привести к меньшему быстродействию FAT32 по сравнению с FAT16. Кроме того, с FAT32 не могут работать ни MS DOS, ни Windows NT.


Что здесь выбрать - решать вам.

Стоит запомнить:

При установке размера кластера приходится делать выбор между быстротой с надежностью и экономичностью. Большой размер кластера - не так плохо, как кажется. Чем больше размер кластера, тем больше потери дискового пространства из-за того, что в кластерах остается незанятое место - но и тем меньше фрагментация файлов, ведь количество фрагментов-кластеров, на которые может быть разбит файл, меньше, чем при меньшем размере кластера! Так что тут стоит выбирать - либо согласиться с потерями свободного места (и бороться с ними путем использования ZipFolders и других программ - архиваторов "на лету"), либо терпеть неизбежную фрагментацию файлов (и регулярно запускать программу дефрагментации).

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

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

Бороться с фрагментацией файлов при малом размере кластера можно только регулярной дефрагментацией диска.


Содержание раздела