От редакции PC Magazine/Russian Edition
Данный материал представляет собой "компиляцию" двух статей Д. Просиса в журнале PC Magazine. Вызвано это тем, что приведенная в первой из них утилита CHKDRIVE содержала недочеты и даже ошибки, повлекшие за собой искажение результатов ее работы. Вторая же стать фактом своего появления во многом обязана стремлению автора исправить эти ошибки.
Вы только что принесли домой новый жесткий диск объемом 1 Гбайт и установили его в ваш ПК. Вы запускаете старую добрую FDISK - утилиту разбиени жесткого диска на разделы системы DOS - и готовитесь приступить к созданию разделов на диске. Вы должны сразу же принять решение: будете ли конфигурировать весь диск как один большой раздел или разбивать его на два или более логических накопителя DOS?
К этому решению следует отнестись серьезно. Ведь размер раздела (или разделов), выбранный вами, может оказать существенное влияние на общую эффективность использования пространства вашего жесткого диска.
Чтобы понять это, вначале кратко рассмотрим соотношение между размером кластера и эффективностью хранения данных. При записи на диск файла для его хранения выделяются один или несколько кластеров. Кластер представляет собой группу из одного или нескольких последовательных секторов на диске и является наименьшей единицей, которую может выделять файловая система; отсюда его другое, более формальное название - выделяемый блок (allocation unit). Дл разделов жесткого диска, имеющих емкость более 16 Мбайт, обычно используется 4, 8, 16, 32 или 64 сектора на кластер. (Сектор - наименьшая единица пространства на диске, которую аппаратные средства могут считывать или записывать, и его длина составляет 512 байт.)
Для регистрации размещения файла на диске файлова система заносит одну или несколько записей в хранящуюс на том же диске структуру данных, называемую таблицей размещения файлов (File Allocation Table - FAT). Она содержит по одной записи на каждый кластер на диске. В каждой из относящихся к файлу записей таблицы FAT хранится адрес следующего кластера в цепочке выделенных на диске участков, так что если известен номер начального кластера, то файловая система может считать весь файл независимо от того, где именно на диске расположены все остальные кластеры. Номер первого кластера записывается отдельно в 32-байтовой записи каталога вместе с именем файла и другой информацией.
Поскольку файловая система FAT, используемая DOS, распределяет дисковое пространство кластерами установленного размера, часть пространства на каждом диске расходуется напрасно. В накопителе с кластерами размером 2 Кбайт для хранения файла длиной 1 байт требуется 2 Кбайт дискового пространства; тот же файл займет 4 Кбайт в накопителе с кластерами размером 4 Кбайт и т. д. Неиспользуемое пространство между концом файла и концом кластера, в котором расположена последняя часть файла, называется остаточной избыточностью кластера (cluster overhang). Чем больше совокупная остаточная избыточность кластеров (суммарна остаточная избыточность всех файлов), тем больше размер непроизводительно расходуемого пространства в накопителе. Это не создает проблем, пока размер кластера остается достаточно малым. Величину потерь пространства на диске C: можно оценить следующим способом:
Какую роль играет размер раздела? Когда вы форматируете накопитель с помощью команды FORMAT системы DOS, эта команда выбирает наименьший возможный размер кластера исходя из емкости логического накопителя. Поскольку элементы FAT имеют длину лишь 16 бит, это означает, что в накопителе не может быть более 65 536 кластеров. Размер кластера 2 Кбайт ограничивает емкость накопителя величиной 128 Мбайт. Команда FORMAT увеличивает размер кластера по мере возрастания емкости накопителя, чтобы уложиться в ограничение, накладываемое файловой системой.
Таким образом, чем больше величина раздела, тем больше размер кластера - как показано в таблице 1. Размер кластера в накопителе емкостью 520 Мбайт (16 Кбайт) в восемь раз больше, чем в 120-Мбайт накопителе (2 Кбайт). Это означает, что в среднем вы теряете 8 Кбайт дискового пространства на каждый файл в 520-Мбайт накопителе и только 1 Кбайт - в 120-Мбайт. Если на диске записано большое число файлов произвольного размера, то средняя остаточная избыточность равна примерно половине размера кластера, потому что объем данных в последнем кластере файла может изменяться от 1 байта до полного размера кластера; половина разницы очень близка к половине размера кластера.
Таб. 1. Эта таблица показывает зависимость размера кластера в файловых системах FAT и VFAT от емкости устройства.
Емкость устройства Размер кластера 16 - 128 Мбайт 2 Кбайт 128 - 256 Мбайт 4 Кбайт 256 - 512 Мбайт 8 Кбайт 512 - 1 Гбайт 16 Кбайт 1 - 2 Гбайт 32 Кбайт 2 - 4 Гбайт 64 Кбайт
Формально из этого следует, что, чем меньше размер кластера, тем лучше. Но нужно учитывать дополнительные факторы. Теоретически некоторая часть потерь в результате использования кластеров большего размера компенсируется за счет уменьшения числа элементов в таблице FAT, требующихся для хранения информации о размещении больших файлов. Возьмите, например, файл объемом 2053 Кбайт. В накопителе с 2-Кбайт кластерами для хранения этого файла потребуется 1027 кластеров и, следовательно, 1027 элементов FAT. Так как элемент FAT занимает 2 байта для любого накопителя с емкостью, превышающей 16 Мбайт, то файл объемом 2053 Кбайт требует 2054 байт пространства в FAT. Поэтому в дополнение к 1 Кбайт пространства, потерянного в связи с остаточной избыточностью кластера, вы теряете еще 2 Кбайт для хранения элементов FAT.
В накопителе с 8-Кбайт кластерами остаточна избыточность кластера составляет для нашего файла 3 Кбайт, но число требуемых элементов FAT падает до 257, что уменьшает область FAT, отводимую файлу, до 514 байт. Экономия пространства FAT почти компенсирует потери из-за остаточной избыточности кластеров. Если на вашем жестком диске хранятся в основном большие файлы, то очевидно, что использование кластеров крупных размеров также дает некоторые преимущества.
Следует понимать, что пространство FAT никогда в действительности не "теряется". Когда накопитель форматируется, FAT имеет фиксированный размер. И пространство, отведенное под таблицу FAT, не может быть использовано для хранения файлов, даже если она пуста. Однако при оценке эффективности хранения файлов, возможно, следует принимать во внимание размер дискового пространства, требуемого не только дл хранения содержимого файла, но и для записи информации о размещении файла. Это особенно важно при оценке эффективности использования дискового пространства файловой системой FAT по сравнению с другими файловыми системами, поскольку многие из них - включая NTFS и HPFS (операционных систем Windows NT и OS/2 соответственно) - не резервируют пространства фиксированного размера для записи информации о размещении файлов.
Все эти соображения приводят нас к главному вопросу: каков оптимальный размер кластера при имеющемс сочетании больших и маленьких файлов на типичном жестком диске? Когда вы разбиваете жесткий диск на разделы, то каким образом можно заранее определить размеры логических накопителей, обеспечивающие максимальную эффективность использования дискового пространства? Я заинтересовался этим вопросом, исследу в одной из своих последних статей (PC Magazine/RE, 9/95, c. 170. - Прим. ред.) сравнительные достоинства файловых систем VFAT и NTFS (операционных систем Microsoft Windows 95 и Windows NT соответственно). NTFS устанавливает размер кластера 4 Кбайт независимо от емкости накопителя. VFAT использует ту же самую схему распределения дискового пространства, что и файлова система FAT, поэтому размер кластера определяетс величиной раздела. Вместо того чтобы ограничитьс общими рассуждениями, я решил раз и навсегда выявить зависимость между размером кластера и эффективностью использования дискового пространства на типичном жестком диске. Результат оказался несколько неожиданным для меня.
Первый шаг при оценке влияния размера кластера на эффективность использования дискового пространства в накопителе - определение смысла термина "эффективность использования дискового пространства". Хотя, безусловно, можно спорить о том, как количественно ее оценить, я остановился на простой формуле:
Eff = [Size/(Size + Overhang)] x 100%,
где Eff - эффективность использования дискового пространства, выраженная в процентах от 0 до 100; Size - суммарный размер всех файлов в накопителе; Overhang - суммарная остаточная избыточность кластеров. Сумма величин Size и Overhang дает общий объем кластеров, занятых всеми файлами в накопителе (Первоначально автор добавлял к этой сумме размер пространства, требуемого для отображения файлов в FAT, но впоследствии отказался от такой идеи. - Прим. ред.). Данная формула вычисляет отношение объявленного размера файлов к физически занимаемому ими дисковому пространству, не считая элементы каталогов, каждый из которых имеет длину 32 байт независимо от размера кластера. Чем выше отношение, тем более эффективно используется дисковое пространство.
Второй необходимой мне вещью был инструмент дл сбора информации о каждом файле на диске и обработки ее с помощью этой формулы. Могут потребоваться дни, чтобы выполнить такую операцию вручную, поэтому я составил короткую Си-программу, названную CHKDRIVE, текст которой приведен в лист. 1. CHKDRIVE начинает свою работу с корневого каталога накопителя и для прохода по всем имеющимся подкаталогам использует рекурсию (метод, при котором функция или подпрограмма вызывает самое себя).
Для того чтобы перебрать все файлы, содержащиеся в каталоге, CHKDRIVE на каждом проходе обращается к DOS-функциям FINDFIRST и FINDNEXT. Программа отслеживает текущую сумму размеров файлов и остаточную избыточность кластеров. Так как последняя зависит от размера кластера, то CHKDRIVE вычисляет эти величины для 2-, 4-, 8-, 16-, 32- и 64-Кбайт кластеров и накапливает текущие суммы для каждого варианта по отдельности. Размер кластера накопителя не повлияет на результат, так как CHKDRIVE проводит анализ, пользуясь предполагаемыми размерами кластеров.
После того как каждый файл в накопителе будет проанализирован подобным образом, CHKDRIVE сообщает число исследованных файлов и каталогов, совокупный размер файлов, действительный размер кластера, общую остаточную избыточность и результирующую величину, характеризующую эффективность использования дискового пространства для каждого размера кластера. За несколько секунд CHKDRIVE проанализирует накопитель, содержащий тысячи файлов, и сообщит эффективность использовани дискового пространства, которую вы получите, если эти же самые файлы будут храниться в накопителе с 2-, 4-, 8-, 16-, 32- и 64-Кбайт кластерами.
Новая версия CHKDRIVE включает в расчет также файлы в скрытых подкаталогах, тогда как исходная версия этого не делала. Выражаю благодарность Нилу Рубенкингу, Грегу Уокингу и многим читателям, которые по сети PC MagNet прислали мне свои предложения и сообщения об ошибках.
Один источник неэффективности, который CHKDRIVE не принимает в расчет, это то, что большой размер кластеров влияет на размер областей, занимаемыми подкаталогами. Каждый подкаталог размещается в особым образом маркированном файле, содержащем 32-байтовые элементы каталога, соответствующие файлам и вложенным подкаталогам. Эти специальные файлы также подвержены потерям, связанным с размером кластеров, так что на большом диске с парой сотен подкаталогов обычно теряется на неиспользуемое пространство на несколько мегабайтов больше, чем сообщает CHKDRIVE.
Таб. 2 и 3 показывают результаты выполнени программы CHKDRIVE. Обратите внимание на резкое снижение эффективности использования дискового пространства с увеличением размера кластеров. Дл 64-Кбайт кластеров эффективность едва превышает 50%, т. е. на каждый 1 байт данных, хранимых на диске, 1 байт места на диске теряется на остаточную избыточность. Если этот диск заполнить файлами, аналогичными тем почти 7000 файлов, которые уже находятся на нем, то диск будет иметь только половину своей паспортной емкости. Однако это вина не производителя диска, а файловой системы. Скопируйте те же файлы на диск с системой HPFS или NTFS, и файлы потребуют значительно меньше физического пространства на диске.
Результаты оказались, без всякого преувеличения, интересными. Я ожидал увидеть лишь небольшие отличия в эффективности хранения информации, думая, что присутствие нескольких очень больших файлов (некоторые из них превышали 2 Мбайт) поможет компенсировать неэффективность, присущую системам с кластерами крупных размеров. Я ошибался. Как вы можете видеть, эффективность использования дискового пространства снижалась с увеличением размера кластера очень быстро. Если предположить, что этот жесткий диск - типичный представитель тех, что используются в домах и офисах во всем мире, то результаты программы ясно показывают, что, чем меньше размер кластера, тем лучше.
Вряд ли это исследование можно назвать строго научным, но я серьезно сомневаюсь в том, что существует значительное число дисков, на которых так много больших файлов и так мало маленьких, что увеличение размера кластера приведет к повышению эффективности хранени информации. Не удивительно, что современные файловые системы, такие, как NTFS и HPFS, ограничивают размер кластера. Файловая система FAT была хороша во времена 360-Кбайт гибких дисков и 10-Мбайт жестких дисков, но сегодня она превратилась в анахронизм.
Для запуска CHKDRIVE нужно просто ввести в командной строке CHKDRIVE и буквенный символ накопителя:
CHKDRIVE C:
Если опустить обозначение диска, то, по умолчанию, анализируется текущий диск. С помощью оператора перенаправления вывода можно направить вывод в файл:
CHKDRIVE C: >RESULTS.TXT
Можно также вместо RESULTS.TXT подставить имя порта принтера (например, LPT1:) и направить результаты на принтер. Обратите внимание, что CHKDRIVE был рассчитан на использование на обычных, "несжатых" накопителях; результаты, которые он выдает для уплотненного диска, неточны. По существу, "сжатие" накопителя - лучший способ преодоления ограничения эффективности, связанного с системами FAT и VFAT. Объяснение этого приведено в следующем разделе.
Лист. 1. Эта Си-программа анализирует все файлы логического накопителя и вычисляет показатель эффективности использования дискового пространства исходя из размера файлов и совокупной остаточной избыточности кластеров.
#include <stdio.h>
#include <direct.h>
#include <ctype.h>
#include <dos.h>
void ScanDirectory (char *);
void ProcessFile (struct _find_t *);
unsigned long GetClusterSize (void);
int Convert (unsigned long, char *);
unsigned long bytecount = 0;
unsigned long filecount = 0;
unsigned long dircount = 0;
unsigned long overhang[6] = { 0, 0, 0, 0, 0, 0 };
int main (int argc, char *argv[])
{
int drive, i;
char directory[80];
char buffer1[32], buffer2[32];
float efficiency;
unsigned long csize;
//Сохранить имя текущего накопителя и каталога
drive = _getdrive ();
_getcwd (directory, sizeof (directory));
//Изменить имя накопителя, если в командной строке
//была указана буква, обозначающая накопитель
if (argc > 1) {
if (_chdrive (toupper ((int) argv[1][0]) -
0x40) == -1) {
printf ("Накопитель указан неверно\n");
return 1;
}
}
//Собрать статистические данные для накопителей
csize = GetClusterSize ();
ScanDirectory ("\\");
//Вывод результатов на экран
Convert (filecount, buffer1);
Convert (dircount, buffer2);
printf ("Выполнено сканирование %s файлов "\
"в %s каталогах на накопителе %c:\n",
buffer1, buffer2, _getdrive () + 0x40);
Convert (bytecount, buffer1);
printf ("Совокупная длина всех файлов %s байт\n",
byffer1);
Convert (csize, buffer1);
printf ("Размер кластера %s байт (%luK) \n\n", buffer1,
csize >> 10);
printf ("Размер кластера (Кбайт)"\
" Остаточная избыточность (байт) Эффективность\n");
for (i = 0; i < 6; i++) {
efficiency = ((float) (bytecount) /
(float) (bytecount + overhang[i])) * 100.0;
strcpy (buffer2, csize == ((unsigned long) 2 <<
(10 + i)) ? "<--" : "");
Convert (overhang[i], buffer1);
printf (" %2.0dK %14s %6.1f%% %s\n",
2 << i, buffer1, efficiency, buffer2);
}
//Восстановить имя накопителя и каталога, затем выйти
_chdrive (drive);
_chdir (directory);
return 0;
}
void ScanDirectory (char *directory)
{
struct _find_t fileinfo;
dircount++;
_chdir (directory);
if (_dos_findfirst ("*.", _A_HIDDEN | _A_SYSTEM | _A_RDONLY,
&fileinfo) == 0) {
ProcessFile (&fileinfo);
while (_dos_findnext (&fileinfo) == 0)
ProcessFile (&fileinfo);
}
if (_dos_findfirst ("*.", _A_SUBDIR, &fileinfo) == 0)
{
if ((fileinfo.attrib & _A_SUBDIR) &&
(fileinfo.name[0] != 0x2E))
ScanDirectory(fileinfo.name);
while (_dos_findnext (&fileinfo) == 0) {
if ((fileinfo.attrib & _A_SUBDIR) &&
(fileinfo.name[0] != 0x2E))
ScanDirectory(fileinfo.name);
}
}
_chdir ("..");
}
void ProcessFile (struct _find_t *fileinfo)
{
int i;
unsigned long csize;
filecount++;
bytecount += fileinfo->size;
for (i=0; i<6; i++) {
csize = (unsigned long) 2048 << i;
overhang[i] += (csize - (fileinfo->size % csize));
}
}
unsigned long GetClusterSize (void)
{
unsigned char far *dpb;
_asm {
push ds
mov ah,32h
mov dl,0
int 21h
mov dx,ds
pop ds
mov word ptr dpb+2,dx
mov word ptr dpb,bx
}
return (unsigned long) 512 * (1 << dpb[0x05]);
}
int Convert (unsigned long num, char *buffer)
{
int count, i;
char temp[32];
if (num == 0) { //специальный случай (num == 0)
buffer[0] = 0x30;
buffer[1] = 0;
return 1;
}
count = 0;
temp[31] = 0;
while (num > 0) {
if (((count +1) % 4) == 0)
temp[30 - count++] = 0x2C;
temp[30 - count++] = (char) (num % 10) + 0x30;
num /= 10;
}
for (i=0; i<=count; i++)
buffer[i] = temp[31 - count + 1];
return count;
}
Таб. 2. Эти статистические данные были получены в результате исследования с помощью программы CHKDRIVE жесткого диска. Заметьте, что с увеличением размера кластеров эффективность использования дискового пространства снижается.Выполнено сканирование 6862 файлов в 510 каталогах накопителя C:
Совокупная длина всех файлов 396,372,203 байт
Размер кластера 8,192 байт (8К)
Размер кластера (Кбайт) Остаточная избыточность (байт) Эффективность 2 7,829,269 98.1 % 4 16,975,637 95.9 % 8 36,853,525 91.5 % 16 79,812,373 83.2 % 32 173,004,565 69.6 % 64 371,971,861 51.6 %
Таб. 3. Эффективность хранения типичной смеси больших и малых файлов существенно падает по мере того, как размер кластера увеличивается для работы с большими разделами.
Эффективность хранения данных и размер кластера Размер кластера, К 2 4 8 16 32 64 Эффективность, % 99 96 92 82 70 52
Одним из путей преодоления трудностей, связанных с размером кластера, является разделение большого диска на несколько меньших логических накопителей. Если диск - новый и не содержит данных, разбиение не составляет труда: вы запускаете утилиту FDISK и разделяете его в соответствии со своими желаниями. Но если диск содержит данные, вы должны сначала создать полный его дубликат, поскольку FDISK уничтожает все хранящиеся на нем данные.
Более хорошим решением является использование одной из программ динамического сжатия диска. В принципе все подобные программы уменьшают или исключают остаточную избыточность путем отслеживания размещения файла на уровне байта или сектора. Например, утилита DriveSpace системы MS-DOS 6.22 (в MS-DOS 6.0 она называлась DoubleSpace) собирает "сжатые" файлы в скрытый файл, называемый файлом "сжатого" тома (compressed volume file - CVF). Внутри CVF размещение производится на уровне секторов независимо от размеров сжатого тома.
"Несжатый" 500-Мбайт диск содержит 8-Кбайт кластеры, так что в каждом файле может остаться неиспользуемое пространство вплоть до 8191 байт. Если тот же самый диск сжать с помощью DriveSpace, то максимальна остаточная избыточность на файл сокращается до 511 байт, т. е. на один байт меньше, чем длина сектора. В результате простое сжатие диска выводит эффективность хранения данных за отметку 90%. На эту выгоду от применения программ сжатия часто не обращают внимания, но, помимо увеличения вместимости диска, повышается и эффективность использования пространства на диске.
Как DriveSpace из MS-DOS 6.22, так и DriveSpace из Windows 95 ограничивают размер CVF величиной 512 Мбайт, а это значит, что жесткие диски объемом более 256 Мбайт перед сжатием должны разбиваться на два или более раздела. К счастью, программа инсталляции DriveSpace позволяет легко произвести это разбиение "несжатого" раздела на два или несколько "сжатых". Так, диск на 1,2 Гбайт можно разделить на три одинаковых диска по 400 Мбайт, чтобы каждый обеспечивал эквивалент диска на 700 - 800 Мбайт. Если вы работаете в Windows 95, то можете также воспользоваться пакетом DriveSpace3, входящим в комплекс Microsoft Plus!. DriveSpace3 упаковывает данные более плотно, чем DriveSpace (дава лучшие коэффициенты сжатия), и может работать со "сжатыми" разделами емкостью до 2 Гбайт.
Встреченная с горячим одобрением версия 4.0 программы сжатия дисков Stacker фирмы Stac Electronics превосходит утилиту DriveSpace при использовании дл уменьшения остаточной избыточности. Вместо выделени места блоками по 512 байт Stacker упаковывает "сжатые" файлы по границам байтов и вообще исключает потери на неиспользуемое пространство. Это одна из особенностей программы, которая позволяет достичь более высоких общих коэффициентов сжатия, чем в DriveSpace. И, подобно DriveSpace3, Stacker 4.0 может создавать "сжатые" диски размером до 2 Гбайт. Отрицательной стороной использования Stacker с Windows 95 являетс снижение производительности вследствие того, что программа создана для реального режима. Фирма Stac предполагает выпустить продукт под названием Stacker Compatibility Pack for Windows 95, который должен восстановить большую часть потерь в скорости.
Чтобы у вас не возникло неверное впечатление, заметим, что эти утилиты сжатия дисков не лишены недостатков. Некоторые прикладные программы не позволяют устанавливать их на "сжатые" диски, а если по какой-то причине вы не можете запустить систему с жесткого диска, то рискуете потерять все данные, хранящиеся в "сжатом" томе CVF. Однако такие проблемы встречаются очень редко. Я пользуюсь версией DriveSpace, входящей в пакет Microsoft Plus for Windows 95, и не встретил ни одного затруднения.
Для тех, кому интересно знать, у кластеров больших размеров есть и некоторые преимущества. Например, большие кластеры уменьшают фрагментацию файлов и поэтому положительно влияют на производительность системы. Однако недостатки больших кластеров далеко перевешивают их выгоды. Если вы работаете с DOS, Windows 3.x или Windows 95 и в вашей машине стоит жесткий диск большой емкости, снижайте остаточную избыточность и неэффективность хранения данных, разбивая ваш диск на несколько разделов емкостью немного меньше 256 или 512 Мбайт или применяя сжатие диска.
Может быть, однажды в Windows появится современна файловая система, подобная используемым в OS/2 или Windows NT. А до тех пор делайте то, что возможно, дл преодоления ограничений существующей системы.
Так какую же пользу принесут вам полученные сведения, когда придет время разбивать диск на разделы? Вот несколько важных выводов, которые стоит принять во внимание:
Если вы пожелаете, то можете переписать программу CHKDRIVE из библиотеки форума Utilities/Tips сети ZiffNet службы CompuServe (GO ZNT:TIPS) и посмотреть, что она сообщит о ваших накопителях. Вы можете также получить ее через Internet в нашем абонентском пункте, использующем протокол FTP, ftp.pcmag.ziff.com, в архивном файле этого номера журнала v14n12.ZIP.
Кто знает, может быть, вы имеете один из тех редких накопителей, которые выиграют при использовании кластеров большого размера. Если это так, пошлите мне сообщение по сети PC MagNet с результатами работы программы CHKDRIVE. Мне хочется узнать, что она сообщает.