• Nenhum resultado encontrado

2 Cache e Prefetching

2.7 Algoritmos de prefetching

Para cada padrão de acesso, o método utilizado para ler os dados é diferente. Enquanto é possível utilizar a mesma técnica para efetuar a leitura antecipada para todos os padrões de acesso, a eficiência desta abordagem será inferior a uma abordagem que leva em questão o tipo da aplicação e o do padrão de acesso utilizado.

A técnica utilizada para efetuar a leitura antecipada de dados de acordo com o padrão de acesso determinado é denominada de algoritmo de prefetching.

Entre os algoritmos de prefetching mais conhecidos podemos citar os seguintes:

• Aggressive – este algoritmo implementa um algoritmo de prefetching que segue a política de prefetching agressivo[30] [32].

Este algoritmo procura executar a leitura antecipada sempre que for possível, requisitando um maior número de blocos.

• Passive – este algoritmo implementa um algoritmo de prefetching que visa executar o me- nor número de requisições adicionais ao disco, seguindo a política de prefetching passivo

[30]

.

O algoritmo procura oferecer um menor número de acessos adicionais ao disco, dimi- nuindo a taxa de requisição de blocos antecipadamente.

• TIP2 – este algoritmo utiliza as dicas das aplicações para determinar as ações a serem tomadas pelo mecanismo de prefetching[54].

Desta maneira, as aplicações especificam qual é o padrão de acesso esperado, a utilização do cache prevista e outras informações, e o mecanismo de prefetching utiliza estes dados para executar as operações de leitura antecipada.

• Fixed horizon – o algoritmo fixed horizon visa determinar as operações a serem executa- das pelo mecanismo de leitura antecipada analisando o tempo necessário para obter um bloco de dados e tempo requerido para processá-lo[32].

Desta maneira, a relação entre tempo necessário para obter um bloco, e o tempo que a aplicação vai demorar para processar o bloco lido é utilizada para determinar a probabili- dade deste bloco ser lido durante a operação de leitura antecipada.

• Reverse aggressive – este algoritmo visa obter a mesma eficiência do algoritmo aggres-

sive, baseando as suas decisões no histórico de acessos passados e visando balancear

O algoritmo, entretendo, apresenta uma complexidade muito maior comparando-se com outros algoritmos de prefetching devido a um número maior de informações a serem analisadas para tomar uma decisão de leitura antecipada.

• Forestall – este algoritmo visa oferecer uma solução de prefetching balanceada entre o algoritmo reverse aggressive e fixed horizon[32].

O algoritmo utiliza tanto as operações de prefetching agressivo para obter os blocos de maneira eficiente quanto as do algoritmo fixed horizon para requisitar os blocos de ma- neira apropriada, procurando determinar os blocos mais relevantes a serem lidos pelo mecanismo de leitura antecipada.

O algoritmo visa evitar as possíveis substituições de blocos que podem ser feitas pelo algoritmo aggressive, limitando o “alcance” do mesmo. Desta maneira, até uma certa distância entre o “ponteiro” de leitura atual e o bloco a ser requisitado o algoritmo aggres-

sive é utilizado, e depois desta distância é empregado o algoritmo fixed horizon, visando

limitar a escolha de blocos a serem lidos.

• NOM – este algoritmo utiliza um look-ahead global para determinar a seqüência dos blocos a serem requisitados[55].

No caso de diversos servidores, o algoritmo, à cada operação de leitura, requisita o pró- ximo bloco não-lido de cada um dos servidores. O algoritmo utiliza um look-ahead global para ler os blocos de todos os servidores, sem levar em conta os caches locais dos mes- mos. Desta maneira, os cliente sempre terão os blocos prontos para a leitura antecipada. O algoritmo utiliza um look-ahead global dos servidores, requisitando os blocos em seqüência da leitura pela aplicação. Desta maneira, se um dos discos tiver blocos que serão acessados mais no futuro, estes blocos somente serão lidos depois de todos os ou- tros blocos dos outros servidores, que devem ser requisitados anteriormente, forem lidos. Desta maneira, os dados de cada servidor permanecem em cache para posterior leitura por um período curto de tempo.

• GREED – este algoritmo utiliza um look-ahead global em conjunto com um look-ahead

local de cada servidor para determinar os blocos a serem requisitados[55].

O funcionamento do algoritmo é semelhante ao do algoritmo NOM, com a diferença de que o algoritmo GREED somente lê os blocos de cada servidor se houver espaço disponível em cache local do servidor correspondente. O look-ahead local é utilizado para fazer uma leitura dos blocos antecipada para cada servidor.

Desta maneira, o algoritmo irá requisitar os blocos de cada servidor assim que for possí- vel, mantendo-os em cache por mais tempo.

• SUPERVISOR – este algoritmo visa atribuir prioridades às requisições para posterior reorganização das mesmas, visando obter um desempenho melhor[56].

O algoritmo visa reorganizar e agrupar os blocos a serem lidos de acordo com a locali- zação dos mesmos. Desta maneira, ele procura agrupar as requisições a servidores (ou discos) diferentes para oferecer um melhor desempenho das operações, de maneira seme- lhante ao protocolo SCSI-2[57], utilizado nos discos rígidos.

• Full-file-on-open – o algoritmo visa executar uma leitura completa do arquivo na hora de abertura do mesmo[58].

Esta abordagem é especialmente interessante para os arquivos pequenos, cujo tamanho é menor do que o tamanho do cache. Desta maneira, a aplicação consegue ler todos os dados requisitados diretamente da memória, aumentando o desempenho das operações de leitura de dados.

• Adaptive++ – este algoritmo utiliza um histórico de acessos à memória para determinar o comportamento da aplicação e efetuar a leitura antecipada de dados de maneira correta

[59]

.

Esta técnica de prefetching utiliza o histórico de acessos à memória para determinar o padrão de acesso da aplicação. Os padrões de acesso determinado pelo algoritmo são os padrões conhecidos como repeated-stride (o intervalo entre os acessos consecutivos é repetitivo, ou seja, a determinação do próximo bloco na seqüência é possível) e repeated-

phase (o conjunto de dados requisitados na operação é repetitivo, ou seja, é possível

determinar o conjunto de blocos que devem ser requisitados baseando-se no bloco atual). O algoritmo de prefetching não é executado quando a aplicação não apresenta nenhum destes modos de acesso aos dados para evitar requisições adicionais de leitura de dados. • B+ – este algoritmo utiliza as invalidações dos blocos em cache para determinar os pró-

ximos blocos a serem requisitados pela aplicação[60].

Este técnica de prefetching analisa a seqüência de blocos invalidados para determinar os blocos que devem ser requisitados. A técnica assume que, se um bloco foi requisitado recentemente, porém foi invalidado, é provável que o mesmo bloco seja requisitado no- vamente.

A criação de um algoritmo de prefetching adaptativo permite resolver o problema de esco- lha do algoritmo mais apropriado: analisando o padrão de acesso, um algoritmo ideal consegue determinar o método que deve ser utilizado para ler os dados. Este algoritmo deve ter capaci- dade para determinar a mudança no padrão de acesso, alterando o método da leitura de dados.