11.04.2013 Views

gestão de dados partilhados em ambientes de computação móvel

gestão de dados partilhados em ambientes de computação móvel

gestão de dados partilhados em ambientes de computação móvel

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

6.3. CLIENTES 97<br />

do coobjecto consiste nos componentes necessários (cápsula, atributos do sist<strong>em</strong>a, etc.) à criação <strong>de</strong><br />

uma cópia do coobjecto. De forma s<strong>em</strong>elhante ao servidor, para cada coobjecto/subobjecto replicado<br />

localmente, o cliente mantém um conjunto <strong>de</strong> recursos no qual está armazenado o seu estado actual.<br />

Os clientes obtém as cópias parciais a partir <strong>de</strong> um qualquer servidor. Com cada cópia <strong>de</strong> um coob-<br />

jecto (e respectivos subobjectos), o cliente mantém o i<strong>de</strong>ntificador da vista no servidor quando a cópia<br />

foi obtida. Este i<strong>de</strong>ntificador da vista é usado <strong>em</strong> todas as interacções com os servidores para que estes<br />

possam interpretar correctamente os i<strong>de</strong>ntificadores das operações (e vectores versão).<br />

Actualização da cópia parcial <strong>de</strong> um coobjecto Uma cópia parcial <strong>de</strong> um coobjecto po<strong>de</strong> ser actuali-<br />

zada a partir <strong>de</strong> qualquer servidor. Se o servidor t<strong>em</strong> instalada uma vista diferente da vista usada na cópia<br />

do cliente, o cliente <strong>de</strong>ve contactar um novo servidor ou obter uma cópia nova a partir <strong>de</strong>ste servidor.<br />

Para <strong>de</strong>terminar se a cópia <strong>de</strong> um cliente necessita <strong>de</strong> ser actualizada, o servidor compara a versão<br />

do coobjecto da sua cópia local, o.v, e a versão do coobjecto que o cliente possui, rv. Se os dois vectores<br />

for<strong>em</strong> iguais (o.v[i] = rv[i],∀i), a cópia do cliente está actualizada. Se o vector do servidor for superior<br />

ao do cliente, i.e., o.v[i] ≥ rv[i],∀i, o servidor t<strong>em</strong> uma versão mais recente e a versão do cliente po<strong>de</strong> ser<br />

actualizada. Se o vector do servidor for inferior ao do cliente, i.e., o.v[i] ≤ rv[i],∀i, o servidor t<strong>em</strong> uma<br />

versão mais antiga do que a versão do cliente (obtida a partir <strong>de</strong> outro servidor) — neste caso, o cliente<br />

t<strong>em</strong> a opção <strong>de</strong> obter a cópia mais antiga (o comportamento <strong>de</strong>sejado é especificado como parâmetro da<br />

operação getCoOb ject). Se nenhuma das situações anteriores se verificar, o cliente e o servidor possu<strong>em</strong><br />

versões concorrentes do coobjecto (cada uma reflecte operações que a outra não reflecte) — neste caso,<br />

a versão do cliente não po<strong>de</strong> ser actualizada, mas o cliente po<strong>de</strong> obter uma nova cópia.<br />

Quando a cópia parcial <strong>de</strong> um cliente é actualizada, o servidor po<strong>de</strong> enviar para o cliente uma nova<br />

cópia do estado do coobjecto (incluindo todos os subobjectos modificados nos quais o cliente está inte-<br />

ressado) ou uma sequência <strong>de</strong> operações a executar no cliente para actualizar a cópia local. Quando se<br />

usa esta segunda opção, o cliente executa a sequência <strong>de</strong> operações recebidas pela or<strong>de</strong>m indicada. Se<br />

ocorrer algum erro durante a execução das operações no cliente (por ex<strong>em</strong>plo, <strong>de</strong>vido ao facto <strong>de</strong> não<br />

existir uma cópia local <strong>de</strong> um subobjecto usado), o cliente obtém uma nova cópia do estado do coobjecto.<br />

A actualização dum coobjecto <strong>de</strong>ve incluir a actualização <strong>de</strong> todos os subobjectos contidos na cópia<br />

parcial do cliente – caso contrário, a cópia local ficaria inconsistente. Quando a actualização da cópia <strong>de</strong><br />

um coobjecto no cliente é efectuada através da propagação do estado do coobjecto, o servidor verifica a<br />

necessida<strong>de</strong> <strong>de</strong> enviar uma nova cópia <strong>de</strong> um subobjecto. Esta verificação é efectuada <strong>de</strong>terminando se<br />

alguma operação que ainda não está reflectida na cópia do cliente modificou o subobjecto consi<strong>de</strong>rado,<br />

i.e, se ∃i : so.v[i] > rv[i], com so.v o sumário das operações que modificaram o subobjecto e rv a versão<br />

do coobjecto no cliente (note-se que po<strong>de</strong>m ter sido executadas novas operações no servidor que não<br />

tenham modificado o subobjecto). Neste caso, o servidor envia uma nova cópia do subobjecto.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!