• Nenhum resultado encontrado

De forma a contornar a restric¸ ˜ao do uso da t ´ecnica de otimizac¸ ˜ao, foram aprimoradas as restan-tes func¸ ˜oes do Batch-Optimized Persistent List (BOPL). Enquanto que a criac¸ ˜ao de elementos e a

func¸ ˜ao bopl insert utilizam a vers ˜ao otimizada, as restantes sofreram aletrac¸ ˜oes de forma a garantir uma coes ˜ao entre a t ´ecnica de otimizac¸ ˜ao e os diferentes algoritmos.

Para obter essa coes ˜ao, foi aplicado um sistema de ´epocas, ou seja, qualquer modificac¸ ˜ao que seja feita na lista, fica com uma ´epoca associada, `a excec¸ ˜ao da inserc¸ ˜ao. A ´epoca corresponde `a p ´agina em que est ´a associado oworkingPointer, o que leva a que, quando a p ´agina for persistida pela t ´ecnica de otimizac¸ ˜ao, todas as modificac¸ ˜oes inerentes tamb ´em ser ˜ao persistidas.

Esta implementac¸ ˜ao foi desenvolvida utilizando como m ´etodo auxiliar a t ´ecnica deUndo-Logcomo tal, foi implementou-se um di ´ario de modificac¸ ˜oes. As secc¸ ˜oes seguintes ir ˜ao descrever as estruturas de dados que foram implementadas e as modificac¸ ˜oes `as func¸ ˜oes.

3.5.1 Estrutura de dados

A estrutura de dados 15 ´e referente a uma entrada no di ´ario de modificac¸ ˜oes, onde ´e armazenada informac¸ ˜ao sobre a ´epoca (epoch k), o antecessor do elemento que foi modificado (leftElement) e tamb ´em um apontador para o n ´o original ou seja, o n ´o inalterado (originalElement).

Estrutura de Dados 15:Descric¸ ˜ao das entradas no di ´ario

1 typedef perm struct perm entry log

2 {

// epoch k guarda a informa¸c~ao sobre a ´epoca em que foi feita a modifica¸c~ao

3 perm int epoch k;

// leftElement ponteiro para elemento a esquerda do modificado

4 perm Element* leftElement;

// originalElemnt ponteiro para o n´o inalterado

5 perm Element* originalElemnt ;

6 }

3.5.2 Func¸ ˜ao bopl inplace insert

No algoritmo 16 ´e apresentada a construc¸ ˜ao da func¸ ˜aobopl inplace insert, aplicando a t ´ecnica de Undo-Log. Em primeira inst ˆancia ´e gerado o novo elemento (linha 2), em que, caso seja para ser inserido no in´ıcio da lista, isto ´e, se a linha 3 se verificar, coloca-se onextdo novo elemento a apontar para a cabec¸a da lista, gravando a modificac¸ ˜ao num di ´ario (linha 6). O segundo par ˆametro da func¸ ˜ao appendToLogAndPersist, corresponde a umNULLdevido ao facto do in´ıcio da lista n ˜ao ter associado um valor esquerdo e, por fim, o novo elemento passa a ser a cabec¸a da lista (linha 7). Caso o par ˆametro leftKey n ˜ao tenha como objetivo substituir o valor de in´ıcio da lista (linha 3), procura-se o elemento que ir ´a ficar `a esquerda do novo elemento (leftElement) e atualiza-se o next do novo elemento (linha 10 e 11), grava-se a modificac¸ ˜ao no di ´ario (linha 12) e, por fim, modifica-se onext doleftElement para apontar para o criado (linha 13).

3.5.3 Func¸ ˜ao bopl update

No algoritmo 17 ´e criado um novo elemento com os par ˆametros pretendidos (linha 2), caso se confirme que ´e o in´ıcio da lista que est ´a a ser modificada (linha 3) ent ˜ao altera-se o next do novo elemento para onext doheaderPointer (linha 4), persistindo a modificac¸ ˜ao no di ´ario (linha 6) e onde se altera oheaderPointer para que seja o novo elemento (linha 7). A partir do momento que se verifica

Algoritmo 16:Descric¸ ˜ao da func¸ ˜aoinplaceInsertUndoLog

1 Function bopl inplace insert(vol long leftKey, vol long key, vol size t sizeOfValue, vol void*

value)

2 vol Element* newElement = generateElement(vol long key, vol size t sizeOfValue, vol void*

value, vol Element* workingPointer);

// Caso a inser¸c~ao seja feita na primeira posi¸c~ao

3 ifleftKey==0 then

// Esta fun¸c~ao devolve o elemento dado a sua chave

10 vol Element* leftElement = findElement(leftKey);

que ´e a cabec¸a da lista que est ´a a ser modificada (linha 3), ent ˜ao prossegue-se `a procura do elemento a esquerda (leftElement) do que se vai modificar (linha 10). Ap ´os a comprovac¸ ˜ao de que a chave do elemento a atualizar existe (linha 11) altera-se o next do novo elemento (linha 12), guarda-se a modificac¸ ˜ao no di ´ario (linha 14) e, por ´ultimo, atualiza-se onext doleftElement para apontar para o novo elemento (linha 15).

3.5.4 Func¸ ˜ao bopl remove

No algoritmo 18, na linha 2, caso o elemento a remover seja a in´ıcio da lista (headerPointer), ´e necess ´ario gravar essa modificac¸ ˜ao (linha 4). Ap ´os ficar persistido modifica-se oheaderPointer e, caso a lista esteja vazia, altera-se para oworkingPointer (linha 5 e 6), caso contr ´ario modifica-se para o seu next. Por outro lado, se o elemento a remover n ˜ao for a cabec¸a da lista (linha 2) ter ´a de se procurar o elemento `a esquerda (leftElement) do que se pretende remover (linha 13). Se o elemento a remover existir (linha 14), cria-se uma entrada no di ´ario (linha 16), e modifica-se onextdoleftElementde forma a apontar para onextdo elemento a remover, ou seja, onext−>next(linha 17).

3.5.5 Restric¸ ˜ao

Embora esta implementac¸ ˜ao utilize a t ´ecnica de otimizac¸ ˜ao e consiga implementar todas as func¸ ˜oes descritas na secc¸ ˜ao 3.1, como aplica a t ´ecnica de Undo-Log, esta, em determinadas operac¸ ˜oes, exe-cuta pelo menos um flushno caminho cr´ıtico o que, a semelhanc¸a do 3.3 leva a um decr ´escimo de performance em operac¸ ˜oes mais suscet´ıveis a danos.

Algoritmo 17:Descric¸ ˜ao da func¸ ˜aobopl update

1 Function bopl update(vol long key, vol size t sizeOfNewValue, vol void* newValue)

2 vol Element* updatedElement = generateElement(vol long key, vol size t sizeOfNewValue, vol void* newValue, vol Element* workingPointer);

// Esta fun¸c~ao devolve o elemento a esquerda do elemento que est´a a ser modificado

10 vol Element* leftElement = findLeftOfElement(key);

11 ifleftElement−>next! =NULLthen

12 updatedElement−>next = leftElement−>next−>next;

Com o intuito de ultrapassar a limitac¸ ˜ao da abordagem anterior, foram desenvolvidas alterac¸ ˜oes e melhoramentos ao Batch-Optimized Persistent List (BOPL), em que a modificac¸ ˜ao mais significante foi na aplicac¸ ˜ao de uma estrutura auxiliar em Dynamic Random Access Memory (DRAM) que tem o objetivo de armazenar todas as modificac¸ ˜oes que ocorreram numa determinada ´epoca. Nas pr ´oximas secc¸ ˜oes ser ˜ao descritas tanto as estruturas, como as modificac¸ ˜oes necess ´arias nas func¸ ˜oes do BOPL.

3.6.1 Estrutura de dados

De forma a poder utilizar a t ´ecnica de hashmap, foi necess ´ario implementar estruturas auxiliares, mais concretamente uma hashmap e uma lista de modificac¸ ˜oes que ocorreram numa determinada

´epoca. Na estrutura de dados 19 ´e ilustrado uma entrada no hashmap de modificac¸ ˜oes, onde cada entrada ´e indexada pela chave dopreceding Element.

3.6.2 Func¸ ˜ao bopl search

Devido ao facto das modificac¸ ˜oes n ˜ao serem logo executadas na estrutura de dados, qualquer pesquisa realizada, acaba por ser necess ´ario verificar se o caminho ´e o mais atualizado, por cada iterac¸ ˜ao.

Documentos relacionados