• Nenhum resultado encontrado

Estado da arte em Gerenciamento de Cache

4.1 Algoritmos de Substituição

A seguir, mostraremos alguns dos algoritmos de substituição de elementos em cache mais relevantes e aplicados na literatura, muitos deles bastante conhecidos:

1. Least Recently Used (LRU) [7] - É o algoritmo de substituição de cache mais popular. Baseia-se no princípio da localidade temporal, que diz que elementos acessados recente- mente têm mais chances de serem acessados num futuro próximo;

2. Least Frequently Used (LFU) [7] - Substitui o objeto da cache menos frequentemente acessado, ignora a recentidade dos acessos e pode acabar retirando da cache objetos recém acessados, e que poderiam ser muito requisitados no futuro. Porém, preserva na

36

cache elementos mais referenciados, o que é uma vantagem. No entanto, pode poupar objetos muito referenciados num passado distante e que não serão mais úteis no futuro; 3. LRU/k [8] - Variação do LRU que retira da cache o objeto cuja k-ésima referência é a

menos recente. Utiliza princípios do LRU e do LFU;

4. LRUMin [46] - Outra variação do LRU, que se baseia no tamanho do objeto para decidir quem sairá da cache. Quando um novo elemento vai entrar na cache, o algoritmo verifica quais objetos armazenados possuem tamanho igual ou maior do que o que está prestes a entrar. Havendo mais de um objeto que satisfaça essa condição, o LRU é aplicado entre eles;

5. 2Q [9] - Algoritmo de baixo overhead que simula o LRU/k. Mantém duas partições de cache: uma primária, chamada “quente” e uma secundária, a “fria”. Na cache primária estão os elementos mais requisitados e, portanto, os mais preservados. Na outra partição ficam os objetos que foram requisitados aos menos uma vez. Quando ocorre uma referên- cia a um objeto, este é colocado na cache secundária. Uma outra referência feita a esse mesmo objeto implica a mudança dele para a partição primária. A entrada de um novo objeto em qualquer uma das partições pode necessitar a remoção de algum elemento que já esteja armazenado na partição de destino, se ela estiver cheia. Logo, organiza-se cada partição como uma fila do tipo FIFO (First in First out), de forma que o objeto a ser eliminado para a entrada do novo é sempre o primeiro a ter entrado naquela partição; 6. Size [7] - Privilegia os elementos de menor tamanho. Quando um novo elemento vai

entrar na cache, o objeto de maior tamanho que esteja lá é o primeiro a ser removido, e assim por diante, até que o espaço liberado seja suficiente para a entrada do novo elemento. Criado para ser aplicado em servidores proxy, visto que a quantidade de do- cumentos que trafegam na Web é imensa e, em sua maioria, é de tamanho pequeno (4 Kbytes). Dessa forma, não é interessante deixar a cache ocupada com documentos muito grandes, que podem estar ocupando o espaço de inúmeros outros menores;

7. LRV 2000 [10] - Atribui a cada objeto em cache um “valor de utilidade” e substitui aquele que possuir o menor valor. É baseado na atualidade, tamanho e freqüência de acesso ao objeto e utiliza funções matemáticas que são aproximações da distribuição dos tempos entre acessos a um mesmo objeto e da probabilidade de mais acessos, dado que o objeto foi acessado previamente i vezes. A aplicação acumula, em tempo de execução, estatísticas de cada objeto requisitado, atualizadas a cada acesso, o que torna seu custo bastante elevado;

8. Least Normalized Cost Replacement (LNC-R) [47] - Estima a probabilidade de um ob- jeto ser referenciado novamente no futuro, usando uma movimentação média dos últimos tempos de chegada de K requisições do objeto;

9. GreedyDual - Size (GD-Size) [48] - Mais um algoritmo híbrido que considera recen- tidade dos acessos, tamanho e custo de busca de um objeto. Os autores mostram que considerar a latência não leva a bons resultados devido à grande variabilidade de latência de busca de um mesmo objeto. O algoritmo ordena os objetos de acordo com um valor H definido por H = custo/tamanho. Objetos com menor valor H são candidatos a sair da cache. A recentidade é considerada da seguinte forma: a cada acesso, o valor de H do objeto é calculado e acumulado ao valor anterior. Logo, quanto mais recente o acesso ao objeto, maior o seu H e, portanto, menores são suas chances de ser retirado da cache; 10. Cache Particionada [49] - A idéia desse algoritmo é dividir a cache em partições que

abrigarão, cada uma, apenas objetos cujos tamanhos pertencerem a um mesmo inter- valo pré-definido para aquela partição. Assim, quando um novo objeto vai entrar na cache, analisa-se de imediato a que intervalo de tamanho ele pertence para identificar em que partição da cache ele entrará. Uma vez definida a partição, basta aplicar qualquer algoritmo, como LRU ou LFU, entre os membros dela para definir que elemento será removido. Dessa forma, um objeto de tamanho grande nunca substituirá um pequeno e vice-versa; e

11. Least Semantically Related (LSR) [45] - Privilegia os objetos na cache que possuam maior relação semântica entre si.

Selecionamos três dos algoritmos vistos acima – LRU/k, 2Q e LSR – para detalhá-los nas próximas sessões, visto que eles apresentam características bem diversas e interessantes para a formulação do algoritmo proposto para ser executado no Integra.

4.1.1 LRU/k

O algoritmo Least Recently Used, proposto por O’Neil [8], combina numa mesma técnica, dois dos fatores citados no capítulo anterior: última referência e freqüência da referência. A idéia é manter um histórico dos tempos de acesso das últimas k referências feitas ao objeto. O algoritmo leva em consideração a k-ésima referência mais recente. Assim, os objetos com as k-ésimas referências menos recentes são os maiores candidatos a deixar a cache.

38

Quando a aplicação enxerga que um novo objeto deve entrar na cache e não existe espaço suficiente para sua entrada, os elementos que devem sair para permitir que a operação seja efetuada são aqueles cujas funções backward k-distance tenham os maiores valores.

A função backward k-distance é assim definida:

Documentos relacionados