Кэширование структур данных при работе с файлами
Поэлементная загрузка данных из файла хороша в том случае, когда речь идет об отдельной операции над файлом. В этом случае при минимальных затратах используемой памяти получается минимальная же скорость доступа к данным. Очевидно, что путем сохранения наиболее часто используемых данных в памяти программы можно значительно увеличить скорость доступа к файлу. Такой способ организации доступа к данным называется КЭШИРОВАНИЕМ.
прозрачная" память большего быстродействия и меньшего объема относительно основной памяти, сохраняющая наиболее часто используемые данные основной памяти.
Каждая из перечисленных характеристик имеет значение . Подробнее стоит остановиться на " прозрачности" . КЭШ-память не меняет систему адресации данных в основной памяти. То есть пользователь (программа), осуществляющий доступ к данным основной памяти через КЭШ, " не видят" последней. КЭШ-память исключена из системы адресации данных. Заметим, что кэширование применяется на самых разных уровнях как архитектуры компьютеров, так и программного обеспечения. Например :
- быстродействующая КЭШ-память процессора не меняет системы адресации процессором оперативной памяти процессора и используется для хранения наиболее часто используемых ячеек ;
- виртуальная память представляет собой виртуальное адресное пространство адресов, в которое отображаются данные из " файлов подкачки" и библиотек. В этом случае обычная оперативная память играет роль КЭШ-памяти по отношению к виртуальной ;
-PROXY- сервер Интернет играет роль КЭШ-памяти для наиболее часто используемых страниц и " прозрачен" по отношению к системе адресации, принятой в сети.
Рассмотрим, как будет выглядеть кэширование данных при работке с массивом указателей на строки. Прежде всего, отметим, что в памяти постоянно будут находиться массив файловых указателей на строки и массив указателей на строки в памяти. Сами же строки будут загружаться по требованию, при этом будет введено ограничение на количество одновременно находящихся в памяти строк.
Данный пример не производит обновление измененных строк в файле ввиду его простоты.
//------------------------------------------------------bk59-12.cpp
// Массив указателей - кэширование строк
char **pcash; // Массив указателей в памяти (кэш)
long *fcash; // и в файле
int size; // Размерность массива указателей
int nstr; // Количество загруженных строк
FILE *fd;
//---- Загрузка управляющих структур
void load(char *name)
{
int i,n;
if ((fd=fopen(name,"rb"))==NULL) return;
fread((void*)& size ,sizeof(int),1,fd); // Прочитать размерность
fcash=new long[size]; // Создать динамический массив
pcash=new char*[ size]; // файловых указателей и указателей
fread((void*)pp,sizeof(long), size ,fd); // на строки.
for (i=0; i<n; i++) pcash[i]=NULL;
nstr=0;
}
//---- Загрузка строки с кэшированием
char *load_cash(int n)
{
if (pcash[n]!=NULL) return pcash[n]; // Строка уже в кэш-памяти
if (nstr==MAX)
{ /* Вытеснение лишней строки из памяти * /
nstr--;
}
nstr++;
int sz;
fseek(fd,fcash[i],SEEK_SET); // Установиться по i-му файловому
fread((void*)&sz,sizeof(int),1,fd); // указателю и прочитать запись
p cash[n]=new char[sz]; // переменной длины - строку
fread((void*)p cash[n],sz,1,fd);
return pcash[n];
}
Термин " вытеснение" имеет отношение к случаю, когда в кэш-памяти нес свободного места для загрузки очередной порции данных. Алгоритмы выбора " кандидата" на удаление из кэш-памяти подробно исследованы в стратегиях вытеснения страниц в системах управления виртуальной памятью.