Кэширование и буферизация
У меня с институтских времен осталась незалеченная психологическая травма. Преподаватель по курсу «Проектирование операционных систем«, человек во всех отношениях уважаемый и компетентный, однажды высказал утверждение: «Кэширование и буферизация — это одно и то же, только кэширование относится к физическому хранению данных, а буферизация — к логическому«. Интуиция моя возопила, я чувствовал, что где-то тут подвох, но не смог привести убедительные аргументы против. В том числе и на экзамене (за что и получил единственную четверку в диплом). Попробую реабилитироваться и прояснить ситуацию. Все что я написал ниже — мое личное мнение. Но это не значит, что я все это высосал из пальца, некоторую работу по изучению вопроса я все же провел. Итак.
Кэширование — это способ ускорения доступа (чтения и записи) к медленной памяти за счет использования более скоростной (обычно существенно меньшего объема). Используемая часть быстрой памяти носит название кэша. Фрагменты содержимого медленной памяти, к которым наиболее часто происходит обращение, сохраняются в кэше. При чтении или записи этих фрагментов нет необходимости обращаться к медленной памяти — можно получить нужные данные из кэша или, напротив, записать в кэш. В последнем случае потребуется дальнейшая синхронизация кэша с медленной памятью.
Примеры использования кэширования:
- кэширование отображения виртуальных адресов в физические; медленная память — таблицы преобразования в оперативной памяти, быстрая — кэш TLB;
- кэширование обмена данными с жестким диском; медленная память — диск, быстрая — оперативная память;
- кэширование веб-страниц (кэш браузера); медленная память — соединение с Интернетом, быстрая — жесткий диск.
Как можно видеть, один и тот же вид памяти может в разных случаях выступать и в роли кэша, и в роли медленной памяти.
Буферизация — это такая организация обмена данными, при которой используется промежуточное временное хранилище (буфер), в котором накапливаются данные, если по какой-то причине прямой обмен нежелателен или невозможен. Причиной, по которой следует избегать прямого обмена, может являться, например:
- временная неготовность устройства; при прожиге болванок наверняка все видели волшебный Progress Bar «Уровень буфера», это как раз то самое;
- невозможность принять поток данных с требуемой скоростью; например, для этих целей существует исходящая очередь сетевых пакетов — приложения могут клепать данные быстрее, чем сетевая карта успеет их передавать;
- гранулярность обмена; в этом случае буферизация служит средством группировки данных; яркий пример — жесткий диск, обмен с которым возможен только блоками размером с сектор (512 байт обычно), а лучше даже целыми дорожками (много секторов); это также пример того, как одна и та же структура данных может использоваться и для кэширования, и для буферизации (см. выше пример про кэширование жесткого диска).
Буферизация бывает прозрачной и непрозрачной. Прозрачная — когда обменивающиеся данными стороны в курсе, что буфер существует (clipboard, message queue). Непрозрачная буферизация — когда буферизация незаметна (сокеты).
Резюме. Основная задача кэширования — ускорить, а лучше вообще устранить чтение из медленной памяти. Основная задача буферизации — повысить эффективность записи.
Контрольный вопрос. Что такое буферный кэш?


(6 голосов, средний: 4,67 из 5)