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

asc.di.fct.unl.pt
from asc.di.fct.unl.pt More from this publisher
11.04.2013 Views

32 CAPÍTULO 3. APRESENTAÇÃO DO SISTEMA DOORS Os clientes e os servidores mantêm uma cópia de cada coobjecto que replicam em memória estável. Para tal, o sistema mantém um conjunto de recursos (ficheiros e bases de dados) associados a cada coobjecto. O modo como o estado de um coobjecto é armazenado nestes recursos pode ser redefinido por cada coobjecto (com excepção dos atributos do sistema). No protótipo do sistema DOORS, esta gravação consiste, por omissão, na gravação do estado dos objectos que representam os componentes e os subobjectos (cada um num ficheiro diferente). Um coobjecto é sempre manipulado em memória. Assim, para manipular um coobjecto, é necessário criar uma cópia desse coobjecto (em memória) 5 . O núcleo do sistema cria esta cópia com base nas propriedades definidas nos atributos do sistema. Estas propriedades especificam a fábrica a usar na criação da cópia do coobjecto e a localização do código necessário. O estado do coobjecto é obtido a partir dos recursos associados ao coobjecto. A cópia de um coobjecto pode ser manipulada directamente pelo núcleo do sistema ou entregue a uma aplicação. Quando apropriado, o novo estado do coobjecto pode ser gravado nos recursos associados ao coobjecto. 3.2.2.2 Funcionamento comum no cliente Num cliente, uma aplicação manipula uma cópia privada de um coobjecto. Como se referiu anterior- mente, esta cópia é criada pelo núcleo do sistema e entregue à aplicação para uso exclusivo. Após obter a cópia do coobjecto (ou simplesmente o coobjecto), a aplicação deve obter uma referên- cia (representante) de um subobjecto base. Este representante (proxy) é usado para aceder e modificar o estado do subobjecto e permite à aplicação navegar através dos subobjectos que constituem o estado actual do coobjecto, obtendo referências para outros subobjectos. Quando uma aplicação invoca um método num representante de um subobjecto, o representante cria um objecto que codifica a invocação executada, incluindo informação sobre o método a executar e os parâmetros da invocação. O subobjecto alvo da invocação não necessita de estar instanciado nesse momento. O representante do subobjecto entrega o objecto que codifica a invocação executada ao com- ponente de adaptação. Vários métodos estão disponíveis no componente de adaptação dependendo de: (1) o método invocado ser de leitura ou escrita 6 ; e (2) a invocação ter sido efectuada directamente pela aplicação ou resultar da execução de outro método do coobjecto (note que um subobjecto pode manter referências para outros subobjectos e o código de um método definido num subobjecto pode invocar métodos de outros subobjectos). O componente de adaptação processa a operação recebida do representante (proxy) do subobjecto 5 Por questões de eficiência, o sistema pode manter cópias em memória do conjunto de coobjectos mais utilizados. 6 Um método de leitura não produz modificações no estado do subobjecto e é apenas usado para aceder ao estado actual do subobjecto. Um método de escrita produz modificações no estado actual do subobjecto.

3.2. FRAMEWORK DE COMPONENTES: PRINCÍPIOS GERAIS 33 em função do tipo de invocação executada (leitura/escrita, directa/indirecta) implementando a política definida pelo componente. Para o processamento de uma operação existem várias possibilidades. Por exemplo, é possível propagar a operação imediatamente para ser executada num servidor (usando os serviços do núcleo do sistema). Neste caso, o resultado da invocação é o resultado obtido remotamente — se este resultado incluir uma referência (representante) de um subobjecto, esta referência é devidamente integrada na cópia do coobjecto 7 . Para executar a operação localmente, o componente de adaptação propaga o objecto que representa a invocação executada para a cápsula do coobjecto. A cápsula controla a execução local da operação. No caso de ser uma operação de leitura ou a invocação resultar da execução de outra operação, a execução local consiste, na execução do método da cópia privada do subobjecto (o resultado obtido, quando exista, é devolvido como resultado da invocação no representante do subobjecto) 8 . No caso de ser uma operação de escrita executada directamente por uma aplicação, o processamento consiste normalmente em dois passos. Primeiro, a operação é entregue ao componente de registo. Segundo, o componente de reconciliação é notificado da presença de uma nova operação no registo — em geral, no cliente, as operações são executadas imediatamente, o que consiste em executar o método da cópia privada do subobjecto. Para executar localmente uma operação num subobjecto, é necessário obter a cópia local do subob- jecto — para tal, usa-se o gestor de subobjectos. Se o subobjecto ainda não estiver instanciado, o gestor de subobjectos encarrega-se de instanciar uma cópia privada. A execução de uma operação pode produzir informação de awareness. Esta informação é criada invocando, durante a execução da operação, um método específico da classe base do subobjecto. Este método apenas reenvia a invocação para o componente de awareness. O componente de awareness processa esta informação de acordo com a política definida — em geral, no cliente, esta informação é ignorada. Para gravar as modificações executadas, as aplicações usam uma função da API do sistema. Esta função, além de gravar a versão provisória do estado do coobjecto na cache do cliente, extrai a sequência de operações a propagar para o servidor. Esta sequência de operações é extraída através de um método definido na interface de sistema do coobjecto (checkChanges), o qual se limita a obter esta informação no componente de registo. Como se descreveu anteriormente, o componente registo mantém a sequência de todas as operações de escrita executadas pela aplicação (e que foram executadas localmente). 7 Esta integração, executada automaticamente, consiste em ajustar, no representante, a referência para o componente de adaptação. 8 Para situações excepcionais, definiu-se um mecanismo que permite indicar durante a execução de uma operação que se pretende registar a próxima invocação executada noutro subobjecto. Deste modo, esta invocação será propagada para todas as réplicas em conjunto com a invocação original que levou à execução da operação que está a ser executar.

3.2. FRAMEWORK DE COMPONENTES: PRINCÍPIOS GERAIS 33<br />

<strong>em</strong> função do tipo <strong>de</strong> invocação executada (leitura/escrita, directa/indirecta) impl<strong>em</strong>entando a política<br />

<strong>de</strong>finida pelo componente. Para o processamento <strong>de</strong> uma operação exist<strong>em</strong> várias possibilida<strong>de</strong>s. Por<br />

ex<strong>em</strong>plo, é possível propagar a operação imediatamente para ser executada num servidor (usando os<br />

serviços do núcleo do sist<strong>em</strong>a). Neste caso, o resultado da invocação é o resultado obtido r<strong>em</strong>otamente —<br />

se este resultado incluir uma referência (representante) <strong>de</strong> um subobjecto, esta referência é <strong>de</strong>vidamente<br />

integrada na cópia do coobjecto 7 . Para executar a operação localmente, o componente <strong>de</strong> adaptação<br />

propaga o objecto que representa a invocação executada para a cápsula do coobjecto.<br />

A cápsula controla a execução local da operação. No caso <strong>de</strong> ser uma operação <strong>de</strong> leitura ou a<br />

invocação resultar da execução <strong>de</strong> outra operação, a execução local consiste, na execução do método da<br />

cópia privada do subobjecto (o resultado obtido, quando exista, é <strong>de</strong>volvido como resultado da invocação<br />

no representante do subobjecto) 8 . No caso <strong>de</strong> ser uma operação <strong>de</strong> escrita executada directamente por<br />

uma aplicação, o processamento consiste normalmente <strong>em</strong> dois passos. Primeiro, a operação é entregue<br />

ao componente <strong>de</strong> registo. Segundo, o componente <strong>de</strong> reconciliação é notificado da presença <strong>de</strong> uma<br />

nova operação no registo — <strong>em</strong> geral, no cliente, as operações são executadas imediatamente, o que<br />

consiste <strong>em</strong> executar o método da cópia privada do subobjecto.<br />

Para executar localmente uma operação num subobjecto, é necessário obter a cópia local do subob-<br />

jecto — para tal, usa-se o gestor <strong>de</strong> subobjectos. Se o subobjecto ainda não estiver instanciado, o gestor<br />

<strong>de</strong> subobjectos encarrega-se <strong>de</strong> instanciar uma cópia privada.<br />

A execução <strong>de</strong> uma operação po<strong>de</strong> produzir informação <strong>de</strong> awareness. Esta informação é criada<br />

invocando, durante a execução da operação, um método específico da classe base do subobjecto. Este<br />

método apenas reenvia a invocação para o componente <strong>de</strong> awareness. O componente <strong>de</strong> awareness<br />

processa esta informação <strong>de</strong> acordo com a política <strong>de</strong>finida — <strong>em</strong> geral, no cliente, esta informação é<br />

ignorada.<br />

Para gravar as modificações executadas, as aplicações usam uma função da API do sist<strong>em</strong>a. Esta<br />

função, além <strong>de</strong> gravar a versão provisória do estado do coobjecto na cache do cliente, extrai a sequência<br />

<strong>de</strong> operações a propagar para o servidor. Esta sequência <strong>de</strong> operações é extraída através <strong>de</strong> um método<br />

<strong>de</strong>finido na interface <strong>de</strong> sist<strong>em</strong>a do coobjecto (checkChanges), o qual se limita a obter esta informação<br />

no componente <strong>de</strong> registo. Como se <strong>de</strong>screveu anteriormente, o componente registo mantém a sequência<br />

<strong>de</strong> todas as operações <strong>de</strong> escrita executadas pela aplicação (e que foram executadas localmente).<br />

7 Esta integração, executada automaticamente, consiste <strong>em</strong> ajustar, no representante, a referência para o componente <strong>de</strong><br />

adaptação.<br />

8 Para situações excepcionais, <strong>de</strong>finiu-se um mecanismo que permite indicar durante a execução <strong>de</strong> uma operação que se<br />

preten<strong>de</strong> registar a próxima invocação executada noutro subobjecto. Deste modo, esta invocação será propagada para todas as<br />

réplicas <strong>em</strong> conjunto com a invocação original que levou à execução da operação que está a ser executar.

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

Saved successfully!

Ooh no, something went wrong!