
Правильно ли говорить, что кэш — это особый вид буфера? Они оба выполняют схожие функции, но есть ли какие-то глубинные различия, которые я упускаю?
решение1
Из статьи Википедии обуферы данных:
буфер — это область физической памяти, используемая для временного хранения данных во время их перемещения из одного места в другое.
АбуферВ итоге циклически проходит и удерживает каждый фрагмент данных, который передается из одного места хранения в другое (например, при использовании кольцевого буфера в обработке звука). Буфер позволяет именно это — «буфер» данных до и после вашей текущей позиции в потоке данных.
Действительно, есть некоторые общие аспекты буфера и кэша. Однако кэш в общепринятом смысле обычно ненетсохранять все данные при их перемещении с места на место (т. е. кэш ЦП).
Целькэшзаключается в том, чтобы хранить данные прозрачным образом, так что кэшируется ровно столько данных, чтобы оставшиеся данные можно было передавать без потери производительности. В этом контексте кэш «предварительно выбирает» только небольшой объем данных (в зависимости от скорости передачи, размера кэша и т. д.).
Главное отличие в том, что буфер в конечном итоге будет содержать все данные. И наоборот, кэш может содержать все, некоторые или вообще не содержать данные (в зависимости от конструкции). Однако доступ к кэшу осуществляется так, как если бы вы изначально обращались к данным напрямую — то, что именно кэшируется, прозрачно для «пользователя» кэша.
Разница в том,интерфейс. Когда вы используете кэш для доступа к источнику данных, вы используете его так, как будто кэшявляетсяисточник данных - вы можете получить доступ к любой части источника данных через кэш, и кэш определит, откуда берутся данные (сам кэш или источник). Сам кэш определяет, какие части данных предварительно загрузить (обычно только начало, но иногда все), в то время какалгоритм замены кэшав использовании определяет, что/когда вещи удаляются из кэша. Лучшим примером этого является система, помимоКэш процессорасам по себе, являетсяпредварительная выборка/читать вперед. Оба загружают в память те части данных, которые, по их мнению, вы будете использовать чаще всего, и возвращаются на жесткий диск, если что-то не кэшировано.
И наоборот, буфер не может быть использован для мгновенного перемещения вашего местоположения в потоке данных, если только новая часть уже не была перемещена в буфер. Для этого потребуется переместить буфер (учитывая, что новое местоположение превышает длину буфера), что фактически потребует от вас «перезапустить» буфер с нового местоположения. Лучшим примером этого является перемещение ползунка в видео на Youtube.
Еще один хороший пример буфера — воспроизведение звука в Winamp. Поскольку аудиофайлы должны быть декодированы центральным процессором, между считыванием песни, обработкой звука и отправкой на звуковую карту проходит некоторое время. Winamp буферизует часть аудиоданных, чтобы было достаточно обработанных аудиоданных, чтобы избежать «зависаний» (т. е. центральный процессор всегда готовит звук, который вы услышите через несколько сотен миллисекунд, это никогда не происходит в реальном времени; то, что вы слышите, поступает из буфера, который центральный процессор подготовил в прошлом).
решение2
Точнее было бы сказать, что кэш — это определенная схема использования буфера, которая подразумевает многократное использование одних и тех же данных. Большинство случаев использования «буфера» подразумевают, что данные будут очищены или удалены после однократного использования (хотя это не обязательно так), тогда как «кэш» подразумевает, что данные будут повторно использованы несколько раз. Кэширование также часто подразумевает, что данные хранятся, поскольку они также одновременно используются, хотя это не обязательно так (как в случае предварительной выборки и т. п.), тогда как буферизация подразумевает, что данные сохраняются для последующего использования.
Однако, безусловно, существует большое совпадение в реализации и использовании.
решение3
Одно важное различие между кэшем и буфером заключается в следующем:
Буфер является частью первичной памяти. Это структуры, присутствующие и доступные из первичной памяти (ОЗУ).
С другой стороны, кэш — это отдельная физическая память в иерархии памяти компьютера.
Буфер также иногда называют - Буферный кэш. Это название подчеркивает тот факт, что использование буфера похоже на использование кэша, т.е. для хранения данных. в то время как разница заключается в контексте его использования.
Буферы используются для временного хранения данных, пока данные перемещаются из одного объекта в другой. НАПРИМЕР: когда видео перемещается из Интернета на наш ПК для отображения, буферы используются для хранения кадров видео, которые будут отображаться следующими. (ЭТО УВЕЛИЧИВАЕТ QoS, ТАК КАК ВИДЕО БУДЕТ ПЛАВНО ВОСПОЛЬЗОВАТЬСЯ ПОСЛЕ УСПЕШНОГО ПРОЦЕССА БУФЕРИЗАЦИИ.) НАПРИМЕР: еще один пример — сценарий, когда мы записываем данные в наши файлы. Недавно записанные данные не копируются во вторичную память мгновенно. Внесенные изменения сохраняются в буфере, а затем в соответствии с разработанной политикой изменения отражаются обратно в файл во вторичной памяти (жесткий диск).
С другой стороны, кэши используются между основной памятью и процессорами, чтобы сократить разрыв между скоростью выполнения ОЗУ и процессором. Также наиболее часто используемые данные хранятся в кэше, чтобы уменьшить доступ к ОЗУ.
решение4
Общее: оба являются промежуточными компонентами хранения данных (программными или аппаратными) между вычислениями и «основным» хранилищем.
Для меня разница заключается в следующем:
Буфер:
- Ручкипоследовательныйдоступ к данным (например, чтение/запись данных из файла или сокета)
- Позволяетинтерфейс между вычислениями и основным хранилищем,адаптируетсядруг другу различные схемы передачи данных производителя и потребителя данных. Например, вычисление записывает небольшие фрагменты данных, но диск может принимать только фрагменты данных определенного размера. Поэтому буфер накапливает небольшие фрагменты в качестве входных данных и перегруппировывает их в более крупные фрагменты выходных данных.
- Так что это какАдаптершаблон проектирования. Он объединяет два взаимодействующих компонента, которые не могут взаимодействовать напрямую.
- Примеры: дисковый буфер, BufferedReader в языке Java, duffering в компьютерной графике.
Кэш:
- Ручкислучайныйдоступ к данным (например, кэш ЦП кэширует строки памяти, которые расположены необязательно последовательно).
- Оптимизируетдоступ к основному хранилищу, ускоряет его. Например, кэш ЦП избегает доступа к памяти, тем самым ускоряя команды ЦП.
- Это какДекораторшаблон проектирования. Он объединяет (часто прозрачно) два взаимодействующих компонента, которые в принципе могли бы взаимодействовать напрямую, но делает взаимодействие более быстрым.
- Примеры: кэш ЦП, кэш страниц, веб-прокси, кэш браузера.