04.0 (Russian conspect)

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

Главный недостаток этого подхода:

1. Если мы перезапустим, то лишимся всех несинхронизированных файлов.

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

3. Вытекает из предыдущих: т.к. теперь уже все компоненты ОС, которые работали с диском теперь должны работать с диском через кэш, иначе будет не понятно то, что на диске содержится.

Кэширование – это отображение части данных медленного устройства на быстром и последующая их синхронизация.

Что такое скорость?

Говоря про скорость, мы подразумеваем два параметра: время отклика и пропускную способность.

Время отклика – представим, что мы позиционируем головку и ждем, пока прокрутиться диск. Время ожидания и есть время отклика.

Пропускная способность: предположим, что диск подключен к компьютеру с помощью какой-нибудь шины данных, которая обеспечивает пропускную способность 1 мб/с. Это означает, что даже если диск физически сам по себе будет быстрым и может операцию позиционирования делать быстро или, если диск обладает свойством читать всю дорожку, то пропуск всё равно будет 1 мб/с.

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

Почему кэш на быстрой памяти меньше, чем то устройств, которое мы кэшируем на медленной памяти?

1. Очевидное. Т.к. быстрое устройство дороже, чем медленное (либо деньгами, либо энергопотреблением)

2. Интересное. Чем больше объем памяти, чем оно медленнее.

Ещё раз: Кэширование – это отображение актуальной части данных медленных устройств на быстром устройстве.

Понятие актуальности:

1. Временная локальность – если мы обращаемся к какой-то ячейке, то скорее всего мы обратимся к ней снова (цикл)

2. Пространственная или адресная локальность – ситуация, когда мы обратились к ячейке, а. после обратились к следующей (код, массив для данных)

3. Равно удалённость – мы работаем по одному и тому же шагу смещения.

Природа устаревания данных зависит от самих данных, но есть простые стратегии:

1. Случайно выбрасываем данные (однако мы можем случайно выбросить нужное)

2. (Идеальная стратегия) Когда в кэше держим часто используемые, а выкидываем реже всего используемые.

3. Выбрасываем не те ячейки, к которым частота обращений наименьшая, а не к которым давно не обращались.

Cash hit – ситуация, когда мы обращаемся к памяти, а соответствующие данные закэшированны.

Cash miss - ситуация, когда мы обращаемся к памяти, а соответствующие данные

не закэшированны.

Строка кэша – это сколько-то там машинных слов, у которых есть какие-то метаданные и адрес.

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

Кусок памяти – line – некий кусок подряд идущих данных, который лежит по адресу как раз кратному tag’у + остальные нули.

Чем больше строка кэша, тем больше шанс, что мы закэшируем, то к чему мы обращаемся.

Тактики кэширования:

1.png

1. У нас есть 4 строки кэша и есть области кэширования строк, когда мы обращаемся к оперативной памяти, а адресу номер 8, то у нас он кэшируется в нулевой строке кэша и мы заполняем тэг. Это значит, что в строке номер 0 будет закэширован кусок памяти из блока номер 0. Если мы нарушим принцип пространственной локальности, то он будет работать плохо.

2. Более логичная идея: Ассоциативный кэш. Чтоб в каждой строке мог лежать любой кусочек из памяти от 0 до 15.

2.png

1. Нам нужно проверять и искать среди наших строчек лежит или не лежит наш тэг. То есть это кэш, который предусматривает процедуру поиска тэга. Чем больше строк, тем дольше идет поиск. Мы можем кэшировать любое место в памяти.

Объединяя прошлые два принципа – одновременно достаточно быстрый, чтобы хранить большое кол-во данных, а с другой стороны поддерживая несколько очагов локальности путём ассоциативности.

1.3.png

Кэш на запись способен увеличить быстродействие гораздо сильнее, чем кэш на чтение.

Если мы записываем в память, а не читаем из неё, то нужно ли то, что мы записываем в память кэшировать? Казалось бы, да.Т.к. скорее всего мы будем оттуда читать. В действительности мы теряем один из один cash hit, если мы будем записывать в кэш, а потом туда сходим. Проблема в том, что это сложно аппаратно обеспечить.

А есть write back – это ситуация, когда мы принудительно используем кэш для записи и только когда-нибудь потом синхронизируем его состояние с состоянием памяти.

Появляется понятие: горячий кэш – это ситуация, когда содержимое кэша не соответствует содержимому памяти.

HSE/ProgrammingOS/04_Cache/Conspect (последним исправлял пользователь Lecture_Uploads 2020-06-08 23:18:49)