Многие периферийные устройства хранения данных используют кэш для ускорения работы, в частности, жёсткие диски используют кэш-память от 1 до 64 Мбайт, устройства чтения CD/DVD/BD-дисков также кэшируют прочитанную информацию для ускорения повторного обращения. Операционная система также использует часть оперативной памяти в качестве кэша дисковых операций (в том числе для внешних устройств, не обладающих собственной кэш-памятью, в том числе жёстких дисков, flash-памяти и гибких дисков).
Применение кэширования внешних накопителей обусловлено следующими факторами:
1. скорость доступа процессора к оперативной памяти во много раз больше, чем к памяти внешних накопителей;
2. некоторые блоки памяти внешних накопителей используются несколькими процессами одновременно и имеет смысл прочитать блок один раз, затем хранить одну копию блока в оперативной памяти для всех процессов;
3. доступ к некоторым блокам оперативной памяти происходит гораздо чаще, чем к другим, поэтому использование кэширования для таких блоков в целом увеличивает производительность системы;
4. для некоторых блоков памяти внешних накопителей не требуется непосредственной записи после модификации, и использование кэша для таких блоков оптимизирует использование ввода-вывода. [5]
Кэширование, выполняемое операционной системой
Кэш оперативной памяти состоит из следующих элементов:
1. набор страниц оперативной памяти, разделённых на буферы, равные по длине блоку данных соответствующего устройства внешней памяти;
2. набор заголовков буферов, описывающих состояние соответствующего буфера;
3. хеш-таблицы, содержащей соответствие номера блока заголовку;
4. списки свободных буферов.
Алгоритм работы кэша с отложенной записью
Изначально все заголовки буферов помещаются в список свободных буферов. Если процесс намеревается прочитать или модифицировать блок, то он выполняет следующий алгоритм:
1. пытается найти в хеш-таблице заголовок буфера с заданным номером;
2. в случае, если полученный буфер занят, ждёт его освобождения;
3. в случае, если буфер не найден в хеш-таблице, берёт первый буфер из хвоста списка свободных;
4. в случае, если список свободных буферов пуст, то выполняется алгоритм вытеснения (см. ниже);
5. в случае, если полученный буфер помечен как «измененный», выполняет асинхронную запись содержимого буфера во внешнюю память.
6. удаляет буфер из хеш-таблицы, если он был помещён в неё;
7. помещает буфер в хеш-таблицу с новым номером.
Процесс читает данные в полученный буфер и освобождает его. В случае модификации процесс перед освобождением помечает буфер как «грязный». При освобождении буфер помещается в голову списка свободных буферов.
Таким образом:
1. если процесс прочитал некоторый блок в буфер, то велика вероятность, что другой процесс при чтении этого блока найдёт буфер в оперативной памяти;
2. запись данных во внешнюю память выполняется только тогда, когда не хватает «чистых» буферов, либо по запросу.
Алгоритм вытеснения
При возникновении промаха, контроллер кэш-памяти должен выбрать подлежащий замещению блок. Польза от использования организации с прямым отображением заключается в том, что аппаратные решения здесь наиболее простые. Выбирать просто нечего: на попадание проверяется только один блок и только этот блок может быть замещен. При полностью ассоциативной или множественно-ассоциативной организации кэш-памяти имеются несколько блоков, из которых надо выбрать кандидата в случае промаха. Если список свободных буферов пуст, то выполняется алгоритм вытеснения буфера. Алгоритм вытеснения существенно влияет на производительность кэша. Существуют следующие алгоритмы:
1. LRU (Least Recently Used) — вытесняется буфер, неиспользованный дольше всех;
2. MRU (Most Recently Used) — вытесняется последний использованный буфер;
3. LFU (Least Frequently Used) — вытесняется буфер, использованный реже всех;
4. ARC (Adaptive Replacement Cache) — алгоритм вытеснения, комбинирующий LRU и LFU, запатентованный IBM.
Применение того или иного алгоритма зависит от стратегии кэширования данных. LRU наиболее эффективен, если данные гарантированно будут повторно использованы в ближайшее время. MRU наиболее эффективен, если данные гарантированно не будут повторно использованы в ближайшее время. В случае, если приложение явно указывает стратегию кэширования для некоторого набора данных, то кэш будет функционировать наиболее эффективно. [5]
2. ПРАКТИЧЕСКАЯ ЧАСТЬ