• Nenhum resultado encontrado

4.3 Implementação do software embarcado

4.3.3 Implementação do TDMA

Iniciação

Quando um nó é ligado e seu dispositivo iniciado, o dispositivo escuta o canal síncrono por um tempo igual à duração máxima de um período TDMA para verificar se algum nó já está presente na rede. No caso afirmativo ele tenta inscrever-se na rede. Caso nenhum nó exista ainda na rede síncrona, este primeiro nó envia uma mensagem de proposta de liderança, propondo que ele se torne o líder da rede síncrona.

Como outro nó pode ter sido ligado no mesmo instante que ele, esse nó pode ter reali- zado o mesmo procedimento e suas mensagens de proposta de liderança podem ter colidido na rede. Desta forma, logo após a transmissão da mensagem de proposta de liderança é ve- rificado se não ocorreu uma colisão e também se não foi recebida uma proposta de liderança de um outro nó. Caso nenhuma das duas situações tenha acontecido3 o nó se considera líder

e envia uma mensagem de líder marcando o início do período TDMA. Deste momento em diante, o nó passa a enviar mensagens de líder periodicamente, marcando o início de cada período TDMA. Caso uma colisão ou o recebimento de uma outra proposta de liderança tenha acontecido o nó dormirá por um tempo aleatório, e quando acordar, ele reiniciará o procedimento4.

Uma iniciação bem sucedida termina com a identificação do líder corrente. As máquinas conectadas aos dispositivos não precisam ter conhecimento se o seu dispositivo é o não o líder da rede síncrona, apenas precisam conhecer o IP do líder atual.

Inscrição e remoção

Caso inicialmente exista um ou mais nós ligados e utilizando a rede síncrona, o processo de iniciação irá identificar o líder corrente. O nó que deseja se inscrever na rede aguarda uma mensagem de sincronização, verifica se as inscrições estão habilitadas e logo após, na fatia de inscrição, envia sua mensagem de inscrição.

3A verificação se uma mensagem foi recebida logo após a transmissão bem sucedida da mensagem de

proposta de liderança se aplica no caso de uma rede 10BaseT com concentradores comutados e comunicação bidirecional onde duas mensagens podem ser transmitidas simultaneamente sem colidirem.

4Neste sistema a geração de números aleatórios é baseada no sensor interno de temperatura do microcon-

Como vários nós podem estar tentando se inscrever simultaneamente na rede, colisões podem acontecer. Desta forma, logo após o envio da mensagem de inscrição deve ser verifi- cado se ouve uma colisão. Caso uma colisão tenha acontecido, o nó deverá esperar por um número aleatório de períodos antes de tentar inscrever-se novamente. Caso nenhuma colisão tenha acontecido, o nó passa a escutar o canal síncrono esperando que o líder, durante a sua mensagem de líder, confirme sua inscrição e atribua-lhe uma fatia de transmissão ou sinalize um erro de inscrição.

Quanto à remoção, quando um nó não transmite na sua fatia de transmissão, no próximo período ele é automaticamente removido pelo líder. De outra forma, o nó pode solicitar sua remoção transmitindo uma solicitação de remoção durante sua própria fatia de comunicação.

Falha do líder

Quando uma mensagem de sincronização é recebida pelos nós, um procedimento de resin- cronização é acionado. Neste procedimento, eles programam um de seus alarmes internos (A1) para que dispare no início da sua fatia de transmissão, ainda no período corrente, cuja

posição é extraída também da mensagem de sincronização. Por segurança, o dispositivo pro- grama um outro alarme (A2), que estourará na mesma fatia do período seguinte. Se, no início

do período seguinte, o dispositivo recebe uma nova mensagem de sincronização, o disposi- tivo programará novamente os alarmes A1e A2. Desta forma, no funcionamento normal do

sistema o alarme A2 é sempre reprogramado antes que dispare.

Quando um dos alarmes estoura, o dispositivo é acordado indicando o início de sua fatia de transmissão. O nó verifica então qual dos alarmes disparou: caso tenha sido o alarme A1o

nó continua no seu funcionamento padrão, transmitindo sua mensagem e voltando a dormir; caso tenha sido o alarme A2, uma mensagem de sincronização não foi recebida durante este

período, o que significa que o líder falhou.

O nó que acorda em sua fatia de transmissão e percebe que o líder falhou envia uma mensagem especial de líder. Esta mensagem contém as mesmas informações que uma men- sagem de transmissão, mas o seu tipo sinaliza que o líder atual falhou e que já não enviou a mensagem de sincronização do período corrente. No próximo período o nó que enviou a mensagem especial de líder irá se transformar em líder e passará a enviar mensagens de sincronização.

4.3 Implementação dosoftware embarcado 59

Como o primeiro nó que acorda em um período percebe a falha do líder e envia uma mensagem especial de líder, os outros nós tratam a mensagem especial de líder como uma mensagem de sincronização: eles se sincronizam com o nó que enviou esta mensagem, man- tendo seu alarme que indica o início de sua fatia de transmissão neste período; mas atuali- zando o alarme que indica o início da sua fatia de transmissão no próximo período, para isto, consideram que a ordem das fatias não será alterada. Esse procedimento é importante para prevenir a falta de ressincronização dos nós no caso de faltas sucessivas de mensagens de sin- cronização. Esta situação ocorre quando após a falha do líder um nó manda uma mensagem especial de líder mas falha antes de enviar sua primeira mensagem de sincronização.

Controle de admissão

O controle de admissão corresponde à iniciação ou remoção de um serviço secundário do

Wormhole. Para exemplificar o processo, uma solicitação para a iniciação de um serviço co- meça com uma chamada à função wh_request_service(), implementada na parte assíncrona do serviço de controle de admissão. Na próxima vez que o driver se comunicar com o dis- positivo, uma mensagem de iniciação de serviço será entregue para ser enviada no próximo período. Desta forma, no período p1 uma mensagem de iniciação de serviço será enviada

pelo dispositivo durante a fatia de inscrição contendo o identificador do serviço (id), a lista de n nós convidados a participar ({nx, ny, nz, ...}) e o número mínimo de participantes m.

No período seguinte, p2, a fatia de inscrição é vaga pois o primeiro participante ainda não

teve a oportunidade de analisar a proposta de iniciação do serviço (veja detalhes mais adi- ante). Nos n períodos seguintes, de p3 a pn+2, cada um dos nós convidados a participar irá

confirmar ou negar, também durante a fatia de inscrição, sua participação no serviço a ser carregado.

Desta forma, no fim do período p1, todos os nós informam ao driver o identificador do

serviço solicitado e ao fim do período p2 o driver responde se o serviço está disponível e se

há banda suficiente na rede síncrona. Esta resposta acontece ao fim do período p2, pois como

ela depende de informações localizadas no driver que ainda não estão disponíveis ao fim do período p1. Portanto, no período p3, o primeiro nó da lista deve enviar uma confirmação ou

uma negação de sua participação do serviço a ser carregado. Um nó pode negar a iniciação do serviço por já possuir toda a banda da rede síncrona alocada a outros serviços ou por

não possuir aquele serviço específico instalado. Se depois de n períodos pelo menos m nós confirmarem a participação, todos percebem que o serviço será iniciado no período seguinte. Uma vez decidido que o serviço será iniciado, isto é sinalizado para o driver executando na máquina associada e este inicia o serviço. Então, a partir do próximo período a função correspondente ao serviço será executada, recebendo como entrada um buffer de mensagens recebidas e retornando um buffer de mensagens a serem enviadas no próximo período.

Uma situação especial que precisa ser considerada neste processo é que durante a inici- ação do serviço, um nó que ainda não faz parte da rede síncrona pode tentar inscrever-se e para isso transmitir na fatia de inscrição. Esta situação é evitada sinalizando que as inscri- ções estão suspensas durante a fatia de sincronização (ver Seção 4.3.2). Esse procedimento evita também que dois serviços sejam iniciados simultaneamente e interfiram nas mensagens de confirmação um do outro.

Para evitar que atrasos imprevisíveis aconteçam quando serviços devem ser iniciados, eles precisam ser previamente carregados na memória. Para isso o serviço deve ser im- plementado como um módulo do Linux, que passa a ser parte do núcleo e por isso não sofre swap da memória. Desta forma, o módulo que implementa um serviço deve, du- rante sua iniciação, cadastrá-lo junto ao Wormhole (o que pode ser feito através da função wh_subscribe_service()).

Documentos relacionados