#факты | Как работает кэширование?

Олег Довбня

Что такое кэш-память мы уже знаем. Настала пора рассмотреть принцип технологии кэширования. Многие пользователи полагают, что смотрят веб-страницы непосредственно «где-то там» в далеком и загадочном Интернете. На самом деле, каждая открываемая вами страница сначала сохраняется на жесткий диск вашего компьютера. Как может маленькая кэш-память ускорять работу оперативной памяти, которая значительно больше? Дело в том, что даже огромнейшее из приложений состоит из отдельных байтов. И лишь немногие из них используются одновременно.

Технология кэширования

Как работает кэширование в браузере?

Технология кэширования

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

Когда вы в первый раз запрашиваете веб-страницу, браузер находит ее по указанному вами адресу и сохраняет ее копию на жесткий диск. При следующем обращении браузер проверяет обновилась ли эта страница на удаленном сервере по сравнению с ее кэшированной копией. Если данные не изменились, браузер открывает запрошенную вами страницу с жесткого диска и не загружает ее повторно из Интернета. В этой ситуации жесткий диск вашего компьютера выступает в роли меньшей по размеру, но сравнительно быстрой памяти. Разумеется, по отношению к бескрайнему Интернету, поскольку в сравнении с другими модулями памяти локального компьютера жесткий диск работает крайне медленно. При этом его объем больше, чем, например, у оперативной памяти (ОЗУ, RAM).

Кэш встраивается также в периферийные устройства. Современные жесткие диски оборудованы дополнительной быстрой памятью. Она невелика и может составлять 8 или 16 мегабайт. Еще несколько лет назад кэш-память жесткого диска составляла всего 512 килобайт. Компьютер не может напрямую использовать эту память. Работать с ней умеет только контроллер жесткого диска. С точки зрения компьютера эти чипы памяти и являются диском.

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

Если у вас еще сохранился флоппи-дисковод, то можете сами посмотреть, как работает кэширование. Откройте сравнительно большой файл, например 300-килобайтный текстовый файл. Сначала индикатор флоппи-привода замигает. Этот старинный дисковод крайне медлителен и вам придется секунд двадцать подождать первой загрузки такого файла. Теперь закройте текстовый файл и откройте его вновь. Только не ждите слишком долго, сразу и открывайте.

Операционная система проверит свой кэш памяти, зарезервированный для флоппи-дисковода, и найдет там нужный вам файл. В итоге вам не придется ждать целые двадцать секунд. Найденные в подсистеме памяти данные будут загружены намного быстрее. Дело в том, что один цикл доступа к флоппи-диску занимает 120 тысячных долей секунды (120 миллисекунд), а на обращение к оперативной памяти уходит примерно 60 миллиардных долей секунды (60 наносекунд). Даже если не проводить сложных математических подсчетов, можно сразу заметить, что системная память намного быстрее флоппи-дисковода. Так же обстоят дела и с жестким диском, но на нем задержка загрузки менее заметна, поскольку этот накопитель работает с большей скоростью, чем привод для магнитных дискет.

Хотя с иерархией компьютерной памяти мы уже знакомы, имеет смысл вновь рассмотреть те ее ступени, которые имеют непосредственное отношение к нашему сегодняшнему повествованию. Кэш первого уровня (L1) меньше, но быстрее кэша второго уровня (L2), который меньше, но быстрее системной оперативной памяти. Она, в свою очередь, уступает объемом жесткому диску, но превосходит его по скорости. А жесткий диск — даже самый огромный — способен хранить намного меньше данных, чем гигантская Глобальная сеть.

Технология кэширования

Технология кэширования

У многих сразу возникает вопрос: «А почему бы не оборудовать компьютер самой скоростной памятью, такой, которая используется в кэше первого уровня? Ведь тогда кэширование станет ненужным!» С технической точки зрения это возможно, но стоило бы невероятно дорого. Идея кэширования как раз и состоит в использовании небольшого модуля сравнительно дорогой памяти для того, чтобы ускорить работу более дешевого, но менее быстрого хранилища данных.

В качестве примеров будем использовать устаревшие компьютеры, чьи технические характеристики менее сложны для подсчетов. Перед конструкторами, работающими над созданием компьютеров, стоит задача обеспечения работы процессора на его максимальной скорости при минимизации затрат. 500-мегагерцовый процессор способен за одну секунду совершать 500 миллионов циклов. На один цикл такого (сильно устаревшего) процессора уходит всего две наносекунды. Без кэш-памяти первого и второго уровней, на доступ к оперативной памяти уйдет 60 наносекунд, то есть будут потеряны примерно 30 циклов обращения к памяти.

При этом даже незначительного размера модуль скоростной памяти способен увеличить производительность взаимодействия процессора с оперативной памятью. 256-килобайтного кэша второго уровня (L2) достаточно для кэширования 64-мегабайтной оперативной памяти. То есть ~256 тысяч байт способны эффективно кэшировать 64 миллиона байт. Как это вообще может работать?

В компьютерных науках существует такая теоретическая концепция, как локальность ссылки (locality of reference). Это означает, что лишь небольшая часть большой программы используется в один и тот же момент времени. По крайней мере, именно так обстоят дела в большинстве случаев. Принцип локальности ссылки распространяется на подавляющее большинство программ. Если исполняемый файл программы занимает 10 мегабайт, лишь считанные байты используются в один момент времени. И крайне редко возникает такая ситуация, при которой это число сильно возрастает. Концепция локальности ссылки заслуживает того, чтобы рассмотреть ее несколько подробнее, поскольку именно на ней базируется кэширование в целом.

Принцип локальности ссылок

Технология кэширования

Посмотрим, как работает концепция локальности ссылок на примере простого псевдокода:


Output to screen « Enter a number between 1 and 100 »
Read input from user
Put value from user in variable X
Put value 100 in variable Y
Put value 1 in variable Z
Loop Y number of time
Divide Z by X
If the remainder of the division = 0
then output « Z is a multiple of X »
Add 1 to Z
Return to loop
End

Эта маленькая программка просит пользователя ввести число между 1 и 100. Она считывает его значение. Затем программа делит каждое число все числа между 1 и 100 на введенный пользователем делитель. Программа проверяет, не является ли число нулем (на который, как известно из школьного курса математики, деление невозможно). После всего этого программа завершает свою работу.

Строки от седьмой до девятой являются циклом, которые выполняется сто раз. Все остальные строки выполняются только единожды. Благодаря кэшированию, строки с седьмой по девятую выполняются значительно быстрее.

Эта программа очень мала и поместится даже в самом маленьком кэше первого уровня. Но давайте представим себе, что перед нами гигантская программа. Большая часть действий программ производится внутри циклов. Текстовый редактор проводит 95 % времени в ожидании ввода данных пользователем и занимается в это время выводом их на экран. И эта часть работы текстового редактора происходит в кэше.

Это приблизительное соотношение 95 % к 5 % и является тем, что мы называем локальностью ссылки. Благодаря такому порядку вещей кэш работает эффективно. Это ответ на вопрос о том, как маленький кэш оптимизирует работу большой памяти. Поэтому в создании очень дорогого компьютера со сверхбыстрой памятью нет никакого смысла. Современный пользователь и так получает 95 % эффективности этого фантастического чудо-компьютера, причем за сравнительно умеренную цену.

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

По материалам computer.howstuffworks.com