Участник:Vlad SG — различия между версиями
Vlad SG (обсуждение | вклад) |
Vlad SG (обсуждение | вклад) |
||
Строка 9: | Строка 9: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | '''Кэш промах''' (англ. ''cache miss'') {{---}} результат обрабатываемого запроса отсутствует в кэше и чтобы его получить необходимо обращаться к внешней памяти. При получении ответа мы | + | '''Кэш промах''' (англ. ''cache miss'') {{---}} результат обрабатываемого запроса отсутствует в кэше и чтобы его получить необходимо обращаться к внешней памяти. При получении ответа мы можем сохранить новое значение в кэш, вытеснив(удалив) некоторое старое. |
}} | }} | ||
{{Определение | {{Определение | ||
Строка 15: | Строка 15: | ||
'''Временем работы алгоритма кэширования''' будем называть количество кэш промахов случившихся при обработке всех запросов. | '''Временем работы алгоритма кэширования''' будем называть количество кэш промахов случившихся при обработке всех запросов. | ||
}} | }} | ||
− | При анализе случайных алгоритмов будем | + | При анализе случайных алгоритмов под временем работы будем подразумевать матожидание количества кэш промахов при всех возможных случайных выборах, но для фиксированной последовательности запросов. |
{{Определение | {{Определение | ||
|definition= | |definition= | ||
Строка 27: | Строка 27: | ||
|id=def_a-opt | |id=def_a-opt | ||
|definition= | |definition= | ||
− | '''<tex>\alpha</tex>-оптимальность''' {{---}} свойство онлайн алгоритма, означающее что время работы этого алгоритма на любых входных данных не более чем в <tex>\alpha</tex> раз больше, чем у | + | '''<tex>\alpha</tex>-оптимальность''' {{---}} свойство онлайн алгоритма, означающее что время работы этого алгоритма на любых входных данных не более чем в <tex>\alpha</tex> раз больше, чем у оптимального оффлайнового алгоритма, с точностью до аддитивной константы. |
}} | }} | ||
Строка 40: | Строка 40: | ||
Теперь построим <tex>\sigma_n</tex>. В последовательности будем использовать только <tex>k + 1</tex> различных запросов. Первыми <tex>k</tex> запросами возьмём любые различные, а дальше, каждым следующим запросом поставим тот, результата которого нет в данный момент в кэше детерминированного алгоритма. Это хоть и не явное, но корректное задание последовательности, потому что имея алгоритм, мы можем вычислить каждый запрос в <tex>\sigma_n</tex> на основе предыдущих. Очевидно, что <tex>T_\text{det}(\sigma_n) = n</tex>. | Теперь построим <tex>\sigma_n</tex>. В последовательности будем использовать только <tex>k + 1</tex> различных запросов. Первыми <tex>k</tex> запросами возьмём любые различные, а дальше, каждым следующим запросом поставим тот, результата которого нет в данный момент в кэше детерминированного алгоритма. Это хоть и не явное, но корректное задание последовательности, потому что имея алгоритм, мы можем вычислить каждый запрос в <tex>\sigma_n</tex> на основе предыдущих. Очевидно, что <tex>T_\text{det}(\sigma_n) = n</tex>. | ||
− | Посмотрим как на <tex>\sigma_n</tex> будет работать следующий, возможно оптимальный оффлайн алгоритм (индекс mopt). Первые k элементов алгоритм добавит в кэш, так как они все различные. Когда случается промах, алгоритм среди значений в кэше и только что обработанного запроса вытесняет то, которое в последующих запросах встречается первый раз как можно позже или не встречается совсем. При таком выборе, следующий кэш промах случится не менее чем через <tex>k</tex> запросов. Предположим, что это не так, и кэш промах случился через <tex>m < k</tex> запросов. Так как количество различных запросов на 1 больше размера кэша, то этот промах произошёл на запросе, который мы вытеснили из кэша в предыдущий раз. Из <tex>m < k</tex> следует, что есть запросы, которые мы не встретили среди первых <tex>m</tex>, а значит их первое вхождение будет после того значения, которое мы вытеснили. Получили противоречие, а значит предположение не верно. Оценим время работы возможно оптимального оффлайн алгоритма <tex>T_\text{mopt} \leqslant k + \lceil\frac{n-k}{k+1}\rceil \leqslant \frac{n}{k}</tex>. Последнее неравенство выполнено, т.к. <tex>n \gg k</tex>. Очевидно <tex>T_\text{opt}(\sigma_n) \leqslant T_\text{mopt}(\sigma_n)</tex>, откуда <tex>T_\text{opt}(\sigma_n) \leqslant \frac{n}{k}</tex> | + | Посмотрим как на входе <tex>\sigma_n</tex> будет работать следующий, возможно оптимальный оффлайн алгоритм (индекс mopt). Первые k элементов алгоритм добавит в кэш, так как они все различные. Когда случается промах, алгоритм среди значений в кэше и только что обработанного запроса вытесняет то, которое в последующих запросах встречается первый раз как можно позже или не встречается совсем. При таком выборе, следующий кэш промах случится не менее чем через <tex>k</tex> запросов. Предположим, что это не так, и кэш промах случился через <tex>m < k</tex> запросов. Так как количество различных запросов на 1 больше размера кэша, то этот промах произошёл на запросе, который мы вытеснили из кэша в предыдущий раз. Из <tex>m < k</tex> следует, что есть запросы, которые мы не встретили среди первых <tex>m</tex>, а значит их первое вхождение будет после того значения, которое мы вытеснили. Получили противоречие, а значит предположение не верно. Оценим время работы возможно оптимального оффлайн алгоритма <tex>T_\text{mopt} \leqslant k + \lceil\frac{n-k}{k+1}\rceil \leqslant \frac{n}{k}</tex>. Последнее неравенство выполнено, т.к. <tex>n \gg k</tex>. Очевидно <tex>T_\text{opt}(\sigma_n) \leqslant T_\text{mopt}(\sigma_n)</tex>, откуда <tex>T_\text{opt}(\sigma_n) \leqslant \frac{n}{k}</tex> |
<tex>T_\text{det}(\sigma_n) = n = k \cdot \frac{n}{k} \geqslant k \cdot T_\text{opt}(\sigma_n) \Rightarrow T_\text{det}(\sigma_n) \geqslant k \cdot T_\text{opt}(\sigma_n) + 0</tex> | <tex>T_\text{det}(\sigma_n) = n = k \cdot \frac{n}{k} \geqslant k \cdot T_\text{opt}(\sigma_n) \Rightarrow T_\text{det}(\sigma_n) \geqslant k \cdot T_\text{opt}(\sigma_n) + 0</tex> |
Текущая версия на 21:04, 27 января 2022
Содержание
Формулировка
Пусть задана последовательность из
запросов к внешней памяти. Необходимо решить для каждого запроса: сохранить его значение в кэш размера или оставить его во внешней памяти.Основные определения
Определение: |
Кэш попадание (англ. cache hit) — результат обрабатываемого запроса уже хранится в кэше и его можно вернуть мгновенно. |
Определение: |
Кэш промах (англ. cache miss) — результат обрабатываемого запроса отсутствует в кэше и чтобы его получить необходимо обращаться к внешней памяти. При получении ответа мы можем сохранить новое значение в кэш, вытеснив(удалив) некоторое старое. |
Определение: |
Временем работы алгоритма кэширования будем называть количество кэш промахов случившихся при обработке всех запросов. |
При анализе случайных алгоритмов под временем работы будем подразумевать матожидание количества кэш промахов при всех возможных случайных выборах, но для фиксированной последовательности запросов.
Определение: |
Онлайн алгоритм (англ. on-line algorithm) — алгоритм, который при обработке запроса не знает следующих запросов. |
Определение: |
Оффлайн алгоритм (англ. off-line algorithm) — алгоритм, которому на вход даются все запросы сразу. |
Определение: |
-оптимальность — свойство онлайн алгоритма, означающее что время работы этого алгоритма на любых входных данных не более чем в раз больше, чем у оптимального оффлайнового алгоритма, с точностью до аддитивной константы. |
Проблема детерминированных алгоритмов
Теорема (О нижней оценке): |
Любой -оптимальный онлайн детерминированный алгоритм кэширования имеет . |
Доказательство: |
Обозначим и как время работы оптимального и детерминированного алгоритма на входе . По определению -оптимальности имеем . Покажем, что достаточно построить для любого такую последовательность запросов , что . Так как , получаем . С другой стороны можно подставить в неравенство с квантором значение и получить , а потом снова перейти к пределу . Перепишем неравенства в следующем виде , откуда очевидно, что .Теперь построим . В последовательности будем использовать только различных запросов. Первыми запросами возьмём любые различные, а дальше, каждым следующим запросом поставим тот, результата которого нет в данный момент в кэше детерминированного алгоритма. Это хоть и не явное, но корректное задание последовательности, потому что имея алгоритм, мы можем вычислить каждый запрос в на основе предыдущих. Очевидно, что .Посмотрим как на входе будет работать следующий, возможно оптимальный оффлайн алгоритм (индекс mopt). Первые k элементов алгоритм добавит в кэш, так как они все различные. Когда случается промах, алгоритм среди значений в кэше и только что обработанного запроса вытесняет то, которое в последующих запросах встречается первый раз как можно позже или не встречается совсем. При таком выборе, следующий кэш промах случится не менее чем через запросов. Предположим, что это не так, и кэш промах случился через запросов. Так как количество различных запросов на 1 больше размера кэша, то этот промах произошёл на запросе, который мы вытеснили из кэша в предыдущий раз. Из следует, что есть запросы, которые мы не встретили среди первых , а значит их первое вхождение будет после того значения, которое мы вытеснили. Получили противоречие, а значит предположение не верно. Оценим время работы возможно оптимального оффлайн алгоритма . Последнее неравенство выполнено, т.к. . Очевидно , откудаТеорема доказана. |
Вероятностный алгоритм (англ. random marking algorithm)
В данном алгоритме, у каждого элемента, хранящегося в кэше, может быть метка. Изначально меток ни на одном элементе нет.
Когда в кэш поступает запрос:
- Если кэш попадание, то просто помечаем значение.
- Если кэш промах
- Если все элементы уже помечены, снимаем пометки со всех значений.
- Берём случайное не помеченное значение и вытесняeм его, а новое значение помечаем.
Оценка времени работы алгоритма
Будем рассматривать только те запросы, которые ставят метку в кэше. Из алгоритма понятно, что если запрос не ставит метку, то кэш работает с уже помеченным значением, а значит это кэш попадание. Разобьём эти запросы на фазы так, чтобы границей между фазами был запрос, который сбрасывает все пометки. Так, первый запрос в первой фазе — это первый запрос во всей последовательности, а первый запрос в других фазах — это запрос, выполняющий сброс всех пометок. Пронумеруем фазы от
до . Рассмотрим фазу . Разделим все значения на 2 множества: старые — которые были в фазу и новые — все остальные. Обозначим количество новых значений в фазе как . Тогда количество старых будет .Посчитаем матожидание количества промахов на фазе
. Оно максимально, когда в фазе сначала идут новые значения, а потом старые, потому что тогда каждое новое значение имеет больший шанс вытеснить старое, и при обращении к нему случится кэш промах. Так как на начало фазы в кэше хранятся только значения фазы , то понятно, что все новые запросы фазы приведут к кэш промаху. Рассмотрим -й среди старых запросов. Посмотрим на те значения фазы , которые к текущему моменту были вытеснены или помечены. Заметим, что если значение было помечено, то его уже невозможно вытеснить, а если было вытеснено, то чтобы его пометить, необходимо вытеснить другое значение. старых значений пометили сами себя, потому что они были в предыдущей фазе, а пометить себя не могли, а поэтому вытеснили случайное подмножество из остальных . Возможно они вытеснили кого-то из первых старых значений, которые при обработке вытеснили кого-то другого. Главное, что распределение это не меняет. Вероятность того, что -й старый запрос приведёт к кэш промаху, равена тому, что он был вытеснен из кэша .В итоге, матожидание времени работы алгоритма не превосходит суммы матожиданий кэш промахов на каждой фазе, которое мы ограничили сверху суммой
и матожиданием промахов на старых значениях.
Теперь оценим снизу время работы оптимального алгоритма. Рассмотрим фазы
и . Среди запросов этих фаз всего различных значений, а потому оптимальный алгоритм обязан промахнуться хотябы раз.
Из полученных оценок не сложно вывести:
Алгоритм является
-оптимальным, или, что более практично, -оптимальным.