Информатика и технология программирования

         

Кэширование структур данных при работе с файлами


Поэлементная загрузка данных из файла хороша в том случае, когда речь идет об отдельной операции над файлом. В этом случае при минимальных затратах используемой памяти получается минимальная же скорость доступа к данным. Очевидно, что путем сохранения наиболее часто используемых данных в памяти программы можно значительно увеличить скорость доступа к файлу. Такой способ организации доступа к данным называется КЭШИРОВАНИЕМ.

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

Каждая из перечисленных характеристик имеет значение . Подробнее стоит остановиться на " прозрачности" . КЭШ-память не меняет систему адресации данных в основной памяти. То есть пользователь (программа), осуществляющий доступ к данным основной памяти через КЭШ, " не видят" последней. КЭШ-память исключена из системы адресации данных. Заметим, что кэширование применяется на самых разных уровнях как архитектуры компьютеров, так и программного обеспечения. Например :



- быстродействующая КЭШ-память процессора не меняет системы адресации процессором оперативной памяти процессора и используется для хранения наиболее часто используемых ячеек ;



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



-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*)&#38 size ,sizeof(int),1,fd); // Прочитать размерность

fcash=new long[size]; // Создать динамический массив

pcash=new char*[ size]; // файловых указателей и указателей

fread((void*)pp,sizeof(long), size ,fd); // на строки.

for (i=0; i&#60n; 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*)&#38sz,sizeof(int),1,fd); // указателю и прочитать запись

p cash[n]=new char[sz]; // переменной длины - строку

fread((void*)p cash[n],sz,1,fd);
return pcash[n];
}

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


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