Прогон программы, иллюстрирующей функционирование кэша
#include <windows.h>
#include <stdio.h>
void main(void) {
HANDLE hFile, hHeap;
int iRet = 0;
void *pMem;
long FileSize = 0, FilePos = 0;
DWORD iRead = 0, iWrite = 0;
char * String;
hFile = CreateFile("MYFILE.TXT", GENERIC_READ| GENERIC_WRITE,0,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL |0, NULL);
if (hFile == INVALID_HANDLE_VALUE) printf("Could not open file \n");
FileSize = GetFileSize(hFile, NULL);
printf("FileSize = %d\n",FileSize);
hHeap = GetProcessHeap();
pMem = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, FileSize + 2);
String = (char *)pMem;
ReadFile(hFile, pMem, FileSize, &iRead, NULL);
printf("Read %d bytes \n", iRead);
for(FilePos = 0; FilePos < FileSize; FilePos++)
String[FilePos] = '1';
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
getchar();
WriteFile(hFile, pMem, FileSize, &iWrite, NULL);
printf("Write %d bytes \n", iWrite);
iRet = FlushFileBuffers(hFile);
if(iRet == 0) printf("FlushFileBuffer Error\n");
HeapFree(hHeap, 0, pMem);
CloseHandle(hFile);
}
Приведенная программа считывает большой файл (рекомендуемый размер - несколько мегабайт) в буфер памяти. Затем она меняет содержимое буфера и записывает его на диск. При этом программа пытается сбросить содержимое кэша с помощью функции FlushFileBuffers.
За результатами работы программы можно наблюдать с помощью счетчика "сбросов данных" кэша. Счетчик ведет себя в соответствии с рисунком, где максимальный пик появляется вслед за нажатием клавиши "Enter".
Рис. 12.10. Поведение счетчика "сбросов данных" кэша
Рекомендуется модифицировать данную программу и проанализировать поведение системы отложенного сброса кэша при помощи соответствующих счетчиков производительности.
Оптимальное размещение информации на диске
Кэширование - не единственный способ увеличения производительности системы. Другая важная техника - сокращение количества движений считывающей головки диска за счет разумной стратегии размещения информации. Для этого целесообразно периодически осуществлять дефрагментацию диска (сборку мусора). Дефрагментацию можно выполнить с помощью соответствующей вкладки на административной консоли панели управления.
Hадежность файловой системы
Поскольку разрушение файловой системы зачастую более опасно, чем разрушение компьютера, файловые системы должны разрабатываться с учетом подобной возможности. Сохранность информации может быть обеспечена за счет:
- избыточности (резервное копирование,
-зеркалирования, образования RAID массивов.
Восстанавливаемая файловая система NTFS
Как правило, файловая операция затрагивает сразу несколько объектов файловой системы. Например, запись в файл предполагает выделение ему блоков диска, модификацию MFT-записей о занятом пространстве, файле и каталоге, содержащем файл и т.д. В течение короткого периода времени между этими шагами информация в файловой системе оказывается несогласованной. И, если вследствие непредсказуемого останова системы на диске будут сохранены изменения только для части этих объектов (нарушена атомарность файловой операции), файловая система на диске может быть оставлена в противоречивом состоянии. В современных ОС предусмотрены меры, которые позволяют свести к минимуму ущерб от порчи файловой системы и затем полностью или частично восстановить ее целостность.
Для обозначения совокупности действий, выполняемых файловой операцией, используется термин транзакция. Очевидно, что для сохранения целостности файловой системы транзакция должна выполняться целиком или не выполняться вообще.
Одним из средств поддержки целостности FS является журналирование. Последовательность действий с объектами во время транзакции протоколируется, и, если произошел останов системы, то, имея в наличии протокол, можно осуществить откат системы назад в исходное целостное состояние, в котором она пребывала до начала транзакции.